Sema: copy runtime_index & friends when making child blocks

This commit is contained in:
Veikka Tuominen
2022-09-09 16:37:35 +03:00
parent 6f6b14621d
commit 002260c274
2 changed files with 37 additions and 0 deletions

View File

@@ -4749,6 +4749,9 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr
.inlining = parent_block.inlining,
.is_comptime = parent_block.is_comptime,
.c_import_buf = &c_import_buf,
.runtime_cond = parent_block.runtime_cond,
.runtime_loop = parent_block.runtime_loop,
.runtime_index = parent_block.runtime_index,
};
defer child_block.instructions.deinit(sema.gpa);
@@ -4847,6 +4850,9 @@ fn zirBlock(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileErro
.is_comptime = parent_block.is_comptime,
.want_safety = parent_block.want_safety,
.float_mode = parent_block.float_mode,
.runtime_cond = parent_block.runtime_cond,
.runtime_loop = parent_block.runtime_loop,
.runtime_index = parent_block.runtime_index,
};
defer child_block.instructions.deinit(gpa);
@@ -9742,6 +9748,9 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
.inlining = block.inlining,
.is_comptime = block.is_comptime,
.switch_else_err_ty = else_error_ty,
.runtime_cond = block.runtime_cond,
.runtime_loop = block.runtime_loop,
.runtime_index = block.runtime_index,
};
const merges = &child_block.label.?.merges;
defer child_block.instructions.deinit(gpa);
@@ -14872,6 +14881,9 @@ fn zirTypeofPeer(
.inlining = block.inlining,
.is_comptime = false,
.is_typeof = true,
.runtime_cond = block.runtime_cond,
.runtime_loop = block.runtime_loop,
.runtime_index = block.runtime_index,
};
defer child_block.instructions.deinit(sema.gpa);
// Ignore the result, we only care about the instructions in `args`.

View File

@@ -0,0 +1,25 @@
fn foo() bool {
return false;
}
pub export fn entry() void {
const Widget = union(enum) { a: u0 };
comptime var a = 1;
const info = @typeInfo(Widget).Union;
inline for (info.fields) |field| {
if (foo()) {
switch (field.field_type) {
u0 => a = 2,
else => unreachable,
}
}
}
}
// error
// backend=stage2
// target=native
//
// :13:27: error: store to comptime variable depends on runtime condition
// :11:16: note: runtime condition here