mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 14:25:16 +00:00
Sema: fix coerce result ptr outside of functions
This commit is contained in:
parent
33826a6a2e
commit
a040ccb42f
@ -1875,7 +1875,7 @@ fn zirCoerceResultPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE
|
||||
|
||||
const dummy_ptr = try trash_block.addTy(.alloc, sema.typeOf(ptr));
|
||||
const dummy_operand = try trash_block.addBitCast(pointee_ty, .void_value);
|
||||
try sema.storePtr(&trash_block, src, dummy_ptr, dummy_operand);
|
||||
try sema.storePtr2(&trash_block, src, dummy_ptr, src, dummy_operand, src, .bitcast);
|
||||
|
||||
{
|
||||
const air_tags = sema.air_instructions.items(.tag);
|
||||
@ -20187,6 +20187,13 @@ fn storePtr2(
|
||||
|
||||
// TODO handle if the element type requires comptime
|
||||
|
||||
if (air_tag == .bitcast) {
|
||||
// `air_tag == .bitcast` is used as a special case for `zirCoerceResultPtr`
|
||||
// to avoid calling `requireRuntimeBlock` for the dummy block.
|
||||
_ = try block.addBinOp(.store, ptr, operand);
|
||||
return;
|
||||
}
|
||||
|
||||
try sema.requireRuntimeBlock(block, runtime_src);
|
||||
try sema.queueFullTypeResolution(elem_ty);
|
||||
_ = try block.addBinOp(air_tag, ptr, operand);
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
const assert = std.debug.assert;
|
||||
const mem = std.mem;
|
||||
const expect = std.testing.expect;
|
||||
const expectEqualStrings = std.testing.expectEqualStrings;
|
||||
@ -1053,3 +1054,11 @@ test "const alloc with comptime known initializer is made comptime known" {
|
||||
if (u.a == 0) @compileError("bad");
|
||||
}
|
||||
}
|
||||
|
||||
comptime {
|
||||
// coerce result ptr outside a function
|
||||
const S = struct { a: comptime_int };
|
||||
var s: S = undefined;
|
||||
s = S{ .a = 1 };
|
||||
assert(s.a == 1);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user