Commit 3e74acb139

Mitchell Hashimoto <mitchell.hashimoto@gmail.com>
2022-03-18 16:22:42
AstGen: labeled blocks should always complete with a normal break
They aren't inline blocks by nature of being labeled. Fixes #11213
1 parent 13321c8
Changed files (3)
src
test
behavior
src/AstGen.zig
@@ -2018,7 +2018,7 @@ fn labeledBlockExpr(
 
     try blockExprStmts(&block_scope, &block_scope.base, statements);
     if (!block_scope.endsWithNoReturn()) {
-        _ = try block_scope.addBreak(.break_inline, block_inst, .void_value);
+        _ = try block_scope.addBreak(.@"break", block_inst, .void_value);
     }
 
     if (!block_scope.label.?.used) {
test/behavior/bugs/11213.zig
@@ -0,0 +1,37 @@
+const std = @import("std");
+const builtin = @import("builtin");
+const testing = std.testing;
+
+test {
+    if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+
+    const g: error{Test}!void = error.Test;
+
+    var v: u32 = 0;
+    hash(&v, g);
+    try testing.expect(v == 1);
+}
+
+fn hash(v: *u32, key: anytype) void {
+    const Key = @TypeOf(key);
+
+    if (@typeInfo(Key) == .ErrorSet) {
+        v.* += 1;
+        return;
+    }
+
+    switch (@typeInfo(Key)) {
+        .ErrorUnion => blk: {
+            const payload = key catch |err| {
+                hash(v, err);
+                break :blk;
+            };
+
+            hash(v, payload);
+        },
+
+        else => unreachable,
+    }
+}
test/behavior.zig
@@ -70,6 +70,7 @@ test {
     _ = @import("behavior/bugs/11165.zig");
     _ = @import("behavior/bugs/11181.zig");
     _ = @import("behavior/bugs/11182.zig");
+    _ = @import("behavior/bugs/11213.zig");
     _ = @import("behavior/call.zig");
     _ = @import("behavior/cast.zig");
     _ = @import("behavior/comptime_memory.zig");