From bf2141733463d9d6b729306b584ff93ca1b99324 Mon Sep 17 00:00:00 2001 From: Travis Staloch <1562827+travisstaloch@users.noreply.github.com> Date: Mon, 15 Jan 2024 13:56:11 -0800 Subject: [PATCH 1/2] ast-gen: use correct token_src for switch, if and while exprs fixes #18579 --- src/AstGen.zig | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/AstGen.zig b/src/AstGen.zig index b32ee67b0ae5..fb8f14922330 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -6166,7 +6166,7 @@ fn ifExpr( .gen_zir = &then_scope, .name = ident_name, .inst = payload_inst, - .token_src = payload_token, + .token_src = token_name_index, .id_cat = .capture, }; try then_scope.addDbgVar(.dbg_var_val, ident_name, payload_inst); @@ -6407,19 +6407,18 @@ fn whileExpr( // will add this instruction to then_scope.instructions below const payload_inst = try then_scope.makeUnNode(tag, cond.inst, while_full.ast.cond_expr); opt_payload_inst = payload_inst.toOptional(); - const ident_token = if (payload_is_ref) payload_token + 1 else payload_token; + const ident_token = payload_token + @intFromBool(payload_is_ref); const ident_bytes = tree.tokenSlice(ident_token); if (mem.eql(u8, "_", ident_bytes)) break :s &then_scope.base; - const payload_name_loc = payload_token + @intFromBool(payload_is_ref); - const ident_name = try astgen.identAsString(payload_name_loc); - try astgen.detectLocalShadowing(&then_scope.base, ident_name, payload_name_loc, ident_bytes, .capture); + const ident_name = try astgen.identAsString(ident_token); + try astgen.detectLocalShadowing(&then_scope.base, ident_name, ident_token, ident_bytes, .capture); payload_val_scope = .{ .parent = &then_scope.base, .gen_zir = &then_scope, .name = ident_name, .inst = payload_inst.toRef(), - .token_src = payload_token, + .token_src = ident_token, .id_cat = .capture, }; dbg_var_name = ident_name; @@ -7099,7 +7098,7 @@ fn switchExprErrUnion( .gen_zir = &case_scope, .name = ident_name, .inst = unwrapped_payload, - .token_src = payload_token, + .token_src = token_name_index, .id_cat = .capture, }; try case_scope.addDbgVar(.dbg_var_val, ident_name, unwrapped_payload); @@ -7657,7 +7656,7 @@ fn switchExpr( .gen_zir = &case_scope, .name = capture_name, .inst = switch_block.toRef(), - .token_src = payload_token, + .token_src = ident, .id_cat = .capture, }; dbg_var_name = capture_name; From 671b5b85ff56b771676b3c0a976fbab7f45a6811 Mon Sep 17 00:00:00 2001 From: Travis Staloch <1562827+travisstaloch@users.noreply.github.com> Date: Mon, 15 Jan 2024 17:04:45 -0800 Subject: [PATCH 2/2] add test/cases/compile_errors --- test/cases/compile_errors/capture_by_ref_if.zig | 10 ++++++++++ .../compile_errors/capture_by_ref_if_err_switch.zig | 10 ++++++++++ test/cases/compile_errors/capture_by_ref_switch.zig | 11 +++++++++++ test/cases/compile_errors/capture_by_ref_while.zig | 10 ++++++++++ 4 files changed, 41 insertions(+) create mode 100644 test/cases/compile_errors/capture_by_ref_if.zig create mode 100644 test/cases/compile_errors/capture_by_ref_if_err_switch.zig create mode 100644 test/cases/compile_errors/capture_by_ref_switch.zig create mode 100644 test/cases/compile_errors/capture_by_ref_while.zig diff --git a/test/cases/compile_errors/capture_by_ref_if.zig b/test/cases/compile_errors/capture_by_ref_if.zig new file mode 100644 index 000000000000..58ac0a99b4e4 --- /dev/null +++ b/test/cases/compile_errors/capture_by_ref_if.zig @@ -0,0 +1,10 @@ +test { + if (undefined) |*ident| {} else |err| {} +} + +// error +// backend=stage2 +// target=native +// +// :2:22: error: unused capture +// :2:38: error: unused capture diff --git a/test/cases/compile_errors/capture_by_ref_if_err_switch.zig b/test/cases/compile_errors/capture_by_ref_if_err_switch.zig new file mode 100644 index 000000000000..a210f7cf8d25 --- /dev/null +++ b/test/cases/compile_errors/capture_by_ref_if_err_switch.zig @@ -0,0 +1,10 @@ +test { + const e: error{A}!u32 = error.A; + if (e) |*ptr| {} else |err| switch (err) {} +} + +// error +// backend=stage2 +// target=native +// +// :3:14: error: unused capture diff --git a/test/cases/compile_errors/capture_by_ref_switch.zig b/test/cases/compile_errors/capture_by_ref_switch.zig new file mode 100644 index 000000000000..c1e9399e5dee --- /dev/null +++ b/test/cases/compile_errors/capture_by_ref_switch.zig @@ -0,0 +1,11 @@ +test { + switch (undefined) { + .a => |*ident| {}, + } +} + +// error +// backend=stage2 +// target=native +// +// :3:17: error: unused capture diff --git a/test/cases/compile_errors/capture_by_ref_while.zig b/test/cases/compile_errors/capture_by_ref_while.zig new file mode 100644 index 000000000000..916662c18096 --- /dev/null +++ b/test/cases/compile_errors/capture_by_ref_while.zig @@ -0,0 +1,10 @@ +test { + while (undefined) |*foo| {} else |err| {} +} + +// error +// backend=stage2 +// target=native +// +// :2:25: error: unused capture +// :2:39: error: unused capture \ No newline at end of file