From 79a3dfcfd8c822096ed40fbe6f930d614a8dcb40 Mon Sep 17 00:00:00 2001 From: Matthew Borkowski Date: Mon, 18 Oct 2021 01:12:00 -0400 Subject: [PATCH] astgen.zig: fix false positive in breakExpr's checking for store_to_block_ptr --- src/AstGen.zig | 4 ++-- test/behavior.zig | 1 + test/behavior/bugs/9967.zig | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 test/behavior/bugs/9967.zig diff --git a/src/AstGen.zig b/src/AstGen.zig index 44234d41f7..c76b421368 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -1691,9 +1691,9 @@ fn breakExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index) Inn return Zir.Inst.Ref.unreachable_value; } block_gz.break_count += 1; - const prev_rvalue_rl_count = block_gz.rvalue_rl_count; const operand = try expr(parent_gz, parent_scope, block_gz.break_result_loc, rhs); - const have_store_to_block = block_gz.rvalue_rl_count != prev_rvalue_rl_count; + // if list grew as much as rvalue_rl_count, then a break inside operand already saved the store_to_block_ptr + const have_store_to_block = block_gz.rvalue_rl_count > block_gz.labeled_store_to_block_ptr_list.items.len; const br = try parent_gz.addBreak(.@"break", block_inst, operand); diff --git a/test/behavior.zig b/test/behavior.zig index 83b82114b4..85f39491f2 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -112,6 +112,7 @@ test { _ = @import("behavior/bugs/7047.zig"); _ = @import("behavior/bugs/7250.zig"); _ = @import("behavior/bugs/9584.zig"); + _ = @import("behavior/bugs/9967.zig"); _ = @import("behavior/byteswap.zig"); _ = @import("behavior/byval_arg_var.zig"); _ = @import("behavior/call_stage1.zig"); diff --git a/test/behavior/bugs/9967.zig b/test/behavior/bugs/9967.zig new file mode 100644 index 0000000000..d2c5909689 --- /dev/null +++ b/test/behavior/bugs/9967.zig @@ -0,0 +1,8 @@ +const std = @import("std"); + +test "nested breaks to same labeled block" { + const a = blk: { + break :blk break :blk @as(u32, 1); + }; + try std.testing.expectEqual(a, 1); +}