AstGen: labeled blocks should always complete with a normal break

They aren't inline blocks by nature of being labeled.

Fixes #11213
This commit is contained in:
Mitchell Hashimoto 2022-03-18 08:22:42 -07:00 committed by Andrew Kelley
parent 13321c8070
commit 3e74acb139
3 changed files with 39 additions and 1 deletions

View File

@ -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) {

View File

@ -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");

View File

@ -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,
}
}