From 002260c27481e50c74dbb3d8998cf8c3b1c472d8 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 9 Sep 2022 16:37:35 +0300 Subject: [PATCH] Sema: copy runtime_index & friends when making child blocks --- src/Sema.zig | 12 +++++++++ ...store_in_comptime_switch_in_runtime_if.zig | 25 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 test/cases/compile_errors/comptime_store_in_comptime_switch_in_runtime_if.zig diff --git a/src/Sema.zig b/src/Sema.zig index 79946fcd1b..53617950ed 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -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`. diff --git a/test/cases/compile_errors/comptime_store_in_comptime_switch_in_runtime_if.zig b/test/cases/compile_errors/comptime_store_in_comptime_switch_in_runtime_if.zig new file mode 100644 index 0000000000..f04b5cc4ec --- /dev/null +++ b/test/cases/compile_errors/comptime_store_in_comptime_switch_in_runtime_if.zig @@ -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