From 37cd21eb5f23d2bb26e36ca3de76f0a71e16230c Mon Sep 17 00:00:00 2001 From: WillLillis Date: Mon, 9 Sep 2024 20:58:06 -0400 Subject: [PATCH] fix: disallow discard as errdefer capture --- lib/std/zig/AstGen.zig | 3 +++ test/cases/errdefer_discard.zig | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 test/cases/errdefer_discard.zig diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index 14902a6726..96be562796 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -3156,6 +3156,9 @@ fn deferStmt( const have_err_code = scope_tag == .defer_error and payload_token != 0; const sub_scope = if (!have_err_code) &defer_gen.base else blk: { const ident_name = try gz.astgen.identAsString(payload_token); + if (std.mem.eql(u8, tree.tokenSlice(payload_token), "_")) { + return gz.astgen.failTok(payload_token, "discard of error capture; omit it instead", .{}); + } const remapped_err_code: Zir.Inst.Index = @enumFromInt(gz.astgen.instructions.len); opt_remapped_err_code = remapped_err_code.toOptional(); try gz.astgen.instructions.append(gz.astgen.gpa, .{ diff --git a/test/cases/errdefer_discard.zig b/test/cases/errdefer_discard.zig new file mode 100644 index 0000000000..d9b4e7ae43 --- /dev/null +++ b/test/cases/errdefer_discard.zig @@ -0,0 +1,7 @@ +pub fn main() !void { + errdefer |_| _ = @"_"; +} + +// error +// +// :2:15: error: discard of error capture; omit it instead