authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-21 12:48:26+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-21 12:53:19+03:00
log20d0018d79c25a0def440040eab2970e7a314130
treee9271c0fefbbfcba4ea4adb4ce182b378b92acc9
parentd48af541c7aa235948621cdbc250d983af303977

Sema: ignore dbg_block instructions when checking for comptimeness

Closes #12514

2 files changed, 20 insertions(+), 5 deletions(-)

src/Sema.zig+5-5
......@@ -3087,7 +3087,7 @@ fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro
30873087
30883088 const candidate = block.instructions.items[search_index];
30893089 switch (air_tags[candidate]) {
3090 .dbg_stmt => continue,
3090 .dbg_stmt, .dbg_block_begin, .dbg_block_end => continue,
30913091 .store => break candidate,
30923092 else => break :ct,
30933093 }
......@@ -3099,7 +3099,7 @@ fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro
30993099
31003100 const candidate = block.instructions.items[search_index];
31013101 switch (air_tags[candidate]) {
3102 .dbg_stmt => continue,
3102 .dbg_stmt, .dbg_block_begin, .dbg_block_end => continue,
31033103 .alloc => {
31043104 if (Air.indexToRef(candidate) != alloc) break :ct;
31053105 break;
......@@ -3317,7 +3317,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com
33173317
33183318 const candidate = block.instructions.items[search_index];
33193319 switch (air_tags[candidate]) {
3320 .dbg_stmt => continue,
3320 .dbg_stmt, .dbg_block_begin, .dbg_block_end => continue,
33213321 .store => break candidate,
33223322 else => break :ct,
33233323 }
......@@ -3329,7 +3329,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com
33293329
33303330 const candidate = block.instructions.items[search_index];
33313331 switch (air_tags[candidate]) {
3332 .dbg_stmt => continue,
3332 .dbg_stmt, .dbg_block_begin, .dbg_block_end => continue,
33333333 .bitcast => break candidate,
33343334 else => break :ct,
33353335 }
......@@ -3341,7 +3341,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com
33413341
33423342 const candidate = block.instructions.items[search_index];
33433343 switch (air_tags[candidate]) {
3344 .dbg_stmt => continue,
3344 .dbg_stmt, .dbg_block_begin, .dbg_block_end => continue,
33453345 .constant => break candidate,
33463346 else => break :ct,
33473347 }
test/behavior/eval.zig+15
......@@ -1310,3 +1310,18 @@ test "repeated value is correctly expanded" {
13101310 } }, res);
13111311 }
13121312}
1313
1314test "value in if block is comptime known" {
1315 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
1316
1317 const first = blk: {
1318 const s = if (false) "a" else "b";
1319 break :blk "foo" ++ s;
1320 };
1321 const second = blk: {
1322 const S = struct { str: []const u8 };
1323 const s = if (false) S{ .str = "a" } else S{ .str = "b" };
1324 break :blk "foo" ++ s.str;
1325 };
1326 comptime try expect(std.mem.eql(u8, first, second));
1327}