Skip to content

Commit 3f7b3da

Browse files
Techatrixandrewrk
authored andcommitted
AstGen: fix analysis when encountering discard of error capture
1 parent 4a3800d commit 3f7b3da

File tree

4 files changed

+33
-18
lines changed

4 files changed

+33
-18
lines changed

lib/std/zig/AstGen.zig

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3172,7 +3172,8 @@ fn deferStmt(
31723172
const sub_scope = if (!have_err_code) &defer_gen.base else blk: {
31733173
const ident_name = try gz.astgen.identAsString(payload_token);
31743174
if (std.mem.eql(u8, tree.tokenSlice(payload_token), "_")) {
3175-
return gz.astgen.failTok(payload_token, "discard of error capture; omit it instead", .{});
3175+
try gz.astgen.appendErrorTok(payload_token, "discard of error capture; omit it instead", .{});
3176+
break :blk &defer_gen.base;
31763177
}
31773178
const remapped_err_code: Zir.Inst.Index = @enumFromInt(gz.astgen.instructions.len);
31783179
opt_remapped_err_code = remapped_err_code.toOptional();
@@ -6219,6 +6220,7 @@ fn orelseCatchExpr(
62196220
const err_str = tree.tokenSlice(payload);
62206221
if (mem.eql(u8, err_str, "_")) {
62216222
try astgen.appendErrorTok(payload, "discard of error capture; omit it instead", .{});
6223+
break :blk &else_scope.base;
62226224
}
62236225
const err_name = try astgen.identAsString(payload);
62246226

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export fn a() void {
2+
errdefer |_| {
3+
@"_";
4+
}
5+
}
6+
export fn b() void {
7+
const x: error{}!void = {};
8+
x catch |_| {
9+
@"_";
10+
};
11+
}
12+
export fn c() void {
13+
const x: error{}!void = {};
14+
x catch |_| switch (_) {};
15+
}
16+
export fn d() void {
17+
const x: error{}!u32 = 0;
18+
if (x) |v| v else |_| switch (_) {}
19+
}
20+
21+
// error
22+
// backend=stage2
23+
// target=native
24+
//
25+
// :2:15: error: discard of error capture; omit it instead
26+
// :3:9: error: use of undeclared identifier '_'
27+
// :8:14: error: discard of error capture; omit it instead
28+
// :9:9: error: use of undeclared identifier '_'
29+
// :14:14: error: discard of error capture; omit it instead
30+
// :18:24: error: discard of error capture; omit it instead

test/cases/compile_errors/switch_on_error_union_discard.zig

Lines changed: 0 additions & 10 deletions
This file was deleted.

test/cases/errdefer_discard.zig

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)