authorgravatar for justus@klausecker.deJustus Klausecker <justus@klausecker.de> 2026-05-22 17:33:25+02:00
committergravatar for justus@klausecker.deJustus Klausecker <justus@klausecker.de> 2026-07-24 14:35:19+02:00
log619e54c81382d849f0bfcbe7e5c38f9b34390639
tree23e67b8638fd0b4a3ca74c507d24498872435455
parent8b2d0ce218db8d874cec1c11b3f186955af620c1

AstGen: add missing `pointer modifier invalid on discard` failure for switch

This: ``` fn foo() void { if ({}) |*_| {} else |err| switch (err) {} } ``` now correctly produces the same compile error in `switchExpr` as this: ``` fn foo() void { if ({}) |*_| {} else |err| (switch (err) {}) } ``` does in `ifExpr`.

2 files changed, 6 insertions(+), 0 deletions(-)

lib/std/zig/AstGen.zig+1
......@@ -7453,6 +7453,7 @@ fn switchExpr(
74537453 const ident_name = try astgen.identAsString(ident_token);
74547454 const ident_name_str = tree.tokenSlice(ident_token);
74557455 if (mem.eql(u8, "_", ident_name_str)) {
7456 if (non_err_is_ref != .no) return astgen.failTok(payload_token, "pointer modifier invalid on discard", .{});
74567457 break :scope &scratch_scope.base;
74577458 }
74587459 non_err_capture = if (non_err_is_ref != .no) .by_ref else .by_val;
test/cases/compile_errors/capture_by_ref_discard.zig+5
......@@ -16,9 +16,14 @@ export fn d() void {
1616 while (null) |*_| {}
1717}
1818
19export fn e() void {
20 if (0) |*_| {} else |err| switch (err) {}
21}
22
1923// error
2024//
2125// :2:16: error: pointer modifier invalid on discard
2226// :7:18: error: pointer modifier invalid on discard
2327// :12:16: error: pointer modifier invalid on discard
2428// :16:19: error: pointer modifier invalid on discard
29// :20:13: error: pointer modifier invalid on discard