From 619e54c81382d849f0bfcbe7e5c38f9b34390639 Mon Sep 17 00:00:00 2001 From: Justus Klausecker Date: Fri, 22 May 2026 17:33:25 +0200 Subject: [PATCH] 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`. --- lib/std/zig/AstGen.zig | 1 + test/cases/compile_errors/capture_by_ref_discard.zig | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index c865bd92fe1d3d69cf188cf295ba637ef70a0b9f..1408f3c6f037e6e802ce1944764722955faa1fd8 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -7453,6 +7453,7 @@ fn switchExpr( const ident_name = try astgen.identAsString(ident_token); const ident_name_str = tree.tokenSlice(ident_token); if (mem.eql(u8, "_", ident_name_str)) { + if (non_err_is_ref != .no) return astgen.failTok(payload_token, "pointer modifier invalid on discard", .{}); break :scope &scratch_scope.base; } non_err_capture = if (non_err_is_ref != .no) .by_ref else .by_val; diff --git a/test/cases/compile_errors/capture_by_ref_discard.zig b/test/cases/compile_errors/capture_by_ref_discard.zig index 1779936d34fc04ef7f29a275886b1e8e47635d10..c407ede6c9dc4ba9a1db6aea344e5b34d06d5871 100644 --- a/test/cases/compile_errors/capture_by_ref_discard.zig +++ b/test/cases/compile_errors/capture_by_ref_discard.zig @@ -16,9 +16,14 @@ export fn d() void { while (null) |*_| {} } +export fn e() void { + if (0) |*_| {} else |err| switch (err) {} +} + // error // // :2:16: error: pointer modifier invalid on discard // :7:18: error: pointer modifier invalid on discard // :12:16: error: pointer modifier invalid on discard // :16:19: error: pointer modifier invalid on discard +// :20:13: error: pointer modifier invalid on discard -- 2.54.0