authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-04 14:51:32-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-20 18:33:00-07:00
log3bd62e1bb62f4f490aeaa68c3cbf9c6c09c40726
tree6d86cbef38241714677bfe50848378657af63d0a
parentd00aee021befe7555a30854e777358eb98ce549a

Sema: fix source location of "declared here" note

point at the var not at the init expression

6 files changed, 36 insertions(+), 34 deletions(-)

src/Sema.zig+13-13
...@@ -3756,9 +3756,9 @@ fn zirAllocExtended(...@@ -3756,9 +3756,9 @@ fn zirAllocExtended(
3756 const pt = sema.pt;3756 const pt = sema.pt;
3757 const gpa = sema.gpa;3757 const gpa = sema.gpa;
3758 const extra = sema.code.extraData(Zir.Inst.AllocExtended, extended.operand);3758 const extra = sema.code.extraData(Zir.Inst.AllocExtended, extended.operand);
3759 const var_src = block.nodeOffset(extra.data.src_node);
3759 const ty_src = block.src(.{ .node_offset_var_decl_ty = extra.data.src_node });3760 const ty_src = block.src(.{ .node_offset_var_decl_ty = extra.data.src_node });
3760 const align_src = block.src(.{ .node_offset_var_decl_align = extra.data.src_node });3761 const align_src = block.src(.{ .node_offset_var_decl_align = extra.data.src_node });
3761 const init_src = block.src(.{ .node_offset_var_decl_init = extra.data.src_node });
3762 const small: Zir.Inst.AllocExtended.Small = @bitCast(extended.small);3762 const small: Zir.Inst.AllocExtended.Small = @bitCast(extended.small);
37633763
3764 var extra_index: usize = extra.end;3764 var extra_index: usize = extra.end;
...@@ -3777,7 +3777,7 @@ fn zirAllocExtended(...@@ -3777,7 +3777,7 @@ fn zirAllocExtended(
37773777
3778 if (block.isComptime() or small.is_comptime) {3778 if (block.isComptime() or small.is_comptime) {
3779 if (small.has_type) {3779 if (small.has_type) {
3780 return sema.analyzeComptimeAlloc(block, init_src, var_ty, alignment);3780 return sema.analyzeComptimeAlloc(block, var_src, var_ty, alignment);
3781 } else {3781 } else {
3782 try sema.air_instructions.append(gpa, .{3782 try sema.air_instructions.append(gpa, .{
3783 .tag = .inferred_alloc_comptime,3783 .tag = .inferred_alloc_comptime,
...@@ -3792,7 +3792,7 @@ fn zirAllocExtended(...@@ -3792,7 +3792,7 @@ fn zirAllocExtended(
3792 }3792 }
37933793
3794 if (small.has_type and try var_ty.comptimeOnlySema(pt)) {3794 if (small.has_type and try var_ty.comptimeOnlySema(pt)) {
3795 return sema.analyzeComptimeAlloc(block, init_src, var_ty, alignment);3795 return sema.analyzeComptimeAlloc(block, var_src, var_ty, alignment);
3796 }3796 }
37973797
3798 if (small.has_type) {3798 if (small.has_type) {
...@@ -3802,8 +3802,8 @@ fn zirAllocExtended(...@@ -3802,8 +3802,8 @@ fn zirAllocExtended(
3802 const target = pt.zcu.getTarget();3802 const target = pt.zcu.getTarget();
3803 try var_ty.resolveLayout(pt);3803 try var_ty.resolveLayout(pt);
3804 if (sema.func_is_naked and try var_ty.hasRuntimeBitsSema(pt)) {3804 if (sema.func_is_naked and try var_ty.hasRuntimeBitsSema(pt)) {
3805 const var_src = block.src(.{ .node_offset_store_ptr = extra.data.src_node });3805 const store_src = block.src(.{ .node_offset_store_ptr = extra.data.src_node });
3806 return sema.fail(block, var_src, "local variable in naked function", .{});3806 return sema.fail(block, store_src, "local variable in naked function", .{});
3807 }3807 }
3808 const ptr_type = try sema.pt.ptrTypeSema(.{3808 const ptr_type = try sema.pt.ptrTypeSema(.{
3809 .child = var_ty.toIntern(),3809 .child = var_ty.toIntern(),
...@@ -3842,9 +3842,9 @@ fn zirAllocComptime(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr...@@ -3842,9 +3842,9 @@ fn zirAllocComptime(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr
38423842
3843 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node;3843 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node;
3844 const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node });3844 const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node });
3845 const init_src = block.src(.{ .node_offset_var_decl_init = inst_data.src_node });3845 const var_src = block.nodeOffset(inst_data.src_node);
3846 const var_ty = try sema.resolveType(block, ty_src, inst_data.operand);3846 const var_ty = try sema.resolveType(block, ty_src, inst_data.operand);
3847 return sema.analyzeComptimeAlloc(block, init_src, var_ty, .none);3847 return sema.analyzeComptimeAlloc(block, var_src, var_ty, .none);
3848}3848}
38493849
3850fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {3850fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
...@@ -4254,11 +4254,11 @@ fn zirAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I...@@ -4254,11 +4254,11 @@ fn zirAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
42544254
4255 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node;4255 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node;
4256 const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node });4256 const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node });
4257 const init_src = block.src(.{ .node_offset_var_decl_init = inst_data.src_node });4257 const var_src = block.nodeOffset(inst_data.src_node);
42584258
4259 const var_ty = try sema.resolveType(block, ty_src, inst_data.operand);4259 const var_ty = try sema.resolveType(block, ty_src, inst_data.operand);
4260 if (block.isComptime() or try var_ty.comptimeOnlySema(pt)) {4260 if (block.isComptime() or try var_ty.comptimeOnlySema(pt)) {
4261 return sema.analyzeComptimeAlloc(block, init_src, var_ty, .none);4261 return sema.analyzeComptimeAlloc(block, var_src, var_ty, .none);
4262 }4262 }
4263 if (sema.func_is_naked and try var_ty.hasRuntimeBitsSema(pt)) {4263 if (sema.func_is_naked and try var_ty.hasRuntimeBitsSema(pt)) {
4264 const mut_src = block.src(.{ .node_offset_store_ptr = inst_data.src_node });4264 const mut_src = block.src(.{ .node_offset_store_ptr = inst_data.src_node });
...@@ -4284,14 +4284,14 @@ fn zirAllocMut(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -4284,14 +4284,14 @@ fn zirAllocMut(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
42844284
4285 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node;4285 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node;
4286 const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node });4286 const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node });
4287 const init_src = block.src(.{ .node_offset_var_decl_init = inst_data.src_node });4287 const var_src = block.nodeOffset(inst_data.src_node);
4288 const var_ty = try sema.resolveType(block, ty_src, inst_data.operand);4288 const var_ty = try sema.resolveType(block, ty_src, inst_data.operand);
4289 if (block.isComptime()) {4289 if (block.isComptime()) {
4290 return sema.analyzeComptimeAlloc(block, init_src, var_ty, .none);4290 return sema.analyzeComptimeAlloc(block, var_src, var_ty, .none);
4291 }4291 }
4292 if (sema.func_is_naked and try var_ty.hasRuntimeBitsSema(pt)) {4292 if (sema.func_is_naked and try var_ty.hasRuntimeBitsSema(pt)) {
4293 const var_src = block.src(.{ .node_offset_store_ptr = inst_data.src_node });4293 const store_src = block.src(.{ .node_offset_store_ptr = inst_data.src_node });
4294 return sema.fail(block, var_src, "local variable in naked function", .{});4294 return sema.fail(block, store_src, "local variable in naked function", .{});
4295 }4295 }
4296 try sema.validateVarType(block, ty_src, var_ty, false);4296 try sema.validateVarType(block, ty_src, var_ty, false);
4297 const target = pt.zcu.getTarget();4297 const target = pt.zcu.getTarget();
test/cases/compile_errors/comptime_var_referenced_at_runtime.zig+10-10
...@@ -75,31 +75,31 @@ export fn bax() void {...@@ -75,31 +75,31 @@ export fn bax() void {
75//75//
76// :5:19: error: runtime value contains reference to comptime var76// :5:19: error: runtime value contains reference to comptime var
77// :5:19: note: comptime var pointers are not available at runtime77// :5:19: note: comptime var pointers are not available at runtime
78// :4:27: note: 'runtime_value' points to comptime var declared here78// :4:14: note: 'runtime_value' points to comptime var declared here
79// :12:40: error: runtime value contains reference to comptime var79// :12:40: error: runtime value contains reference to comptime var
80// :12:40: note: comptime var pointers are not available at runtime80// :12:40: note: comptime var pointers are not available at runtime
81// :11:27: note: 'runtime_value' points to comptime var declared here81// :11:14: note: 'runtime_value' points to comptime var declared here
82// :19:50: error: runtime value contains reference to comptime var82// :19:50: error: runtime value contains reference to comptime var
83// :19:50: note: comptime var pointers are not available at runtime83// :19:50: note: comptime var pointers are not available at runtime
84// :18:27: note: 'runtime_value' points to comptime var declared here84// :18:14: note: 'runtime_value' points to comptime var declared here
85// :28:9: error: runtime value contains reference to comptime var85// :28:9: error: runtime value contains reference to comptime var
86// :28:9: note: comptime var pointers are not available at runtime86// :28:9: note: comptime var pointers are not available at runtime
87// :27:27: note: 'runtime_value' points to comptime var declared here87// :27:14: note: 'runtime_value' points to comptime var declared here
88// :36:9: error: runtime value contains reference to comptime var88// :36:9: error: runtime value contains reference to comptime var
89// :36:9: note: comptime var pointers are not available at runtime89// :36:9: note: comptime var pointers are not available at runtime
90// :35:27: note: 'runtime_value' points to comptime var declared here90// :35:14: note: 'runtime_value' points to comptime var declared here
91// :41:12: error: runtime value contains reference to comptime var91// :41:12: error: runtime value contains reference to comptime var
92// :41:12: note: comptime var pointers are not available at runtime92// :41:12: note: comptime var pointers are not available at runtime
93// :40:27: note: 'runtime_value' points to comptime var declared here93// :40:14: note: 'runtime_value' points to comptime var declared here
94// :46:39: error: runtime value contains reference to comptime var94// :46:39: error: runtime value contains reference to comptime var
95// :46:39: note: comptime var pointers are not available at runtime95// :46:39: note: comptime var pointers are not available at runtime
96// :45:27: note: 'runtime_value' points to comptime var declared here96// :45:14: note: 'runtime_value' points to comptime var declared here
97// :55:18: error: runtime value contains reference to comptime var97// :55:18: error: runtime value contains reference to comptime var
98// :55:18: note: comptime var pointers are not available at runtime98// :55:18: note: comptime var pointers are not available at runtime
99// :51:30: note: 'runtime_value' points to comptime var declared here99// :51:14: note: 'runtime_value' points to comptime var declared here
100// :63:18: error: runtime value contains reference to comptime var100// :63:18: error: runtime value contains reference to comptime var
101// :63:18: note: comptime var pointers are not available at runtime101// :63:18: note: comptime var pointers are not available at runtime
102// :59:27: note: 'runtime_value' points to comptime var declared here102// :59:14: note: 'runtime_value' points to comptime var declared here
103// :71:19: error: runtime value contains reference to comptime var103// :71:19: error: runtime value contains reference to comptime var
104// :71:19: note: comptime var pointers are not available at runtime104// :71:19: note: comptime var pointers are not available at runtime
105// :67:30: note: 'runtime_value' points to comptime var declared here105// :67:14: note: 'runtime_value' points to comptime var declared here
test/cases/compile_errors/comptime_var_referenced_by_decl.zig+8-8
...@@ -47,19 +47,19 @@ export var h: *[1]u32 = h: {...@@ -47,19 +47,19 @@ export var h: *[1]u32 = h: {
47// error47// error
48//48//
49// :1:27: error: global variable contains reference to comptime var49// :1:27: error: global variable contains reference to comptime var
50// :2:18: note: 'a' points to comptime var declared here50// :2:5: note: 'a' points to comptime var declared here
51// :6:30: error: global variable contains reference to comptime var51// :6:30: error: global variable contains reference to comptime var
52// :7:18: note: 'b[0]' points to comptime var declared here52// :7:5: note: 'b[0]' points to comptime var declared here
53// :11:30: error: global variable contains reference to comptime var53// :11:30: error: global variable contains reference to comptime var
54// :12:18: note: 'c' points to comptime var declared here54// :12:5: note: 'c' points to comptime var declared here
55// :16:33: error: global variable contains reference to comptime var55// :16:33: error: global variable contains reference to comptime var
56// :17:18: note: 'd' points to comptime var declared here56// :17:5: note: 'd' points to comptime var declared here
57// :22:24: error: global variable contains reference to comptime var57// :22:24: error: global variable contains reference to comptime var
58// :23:18: note: 'e.ptr' points to comptime var declared here58// :23:5: note: 'e.ptr' points to comptime var declared here
59// :28:33: error: global variable contains reference to comptime var59// :28:33: error: global variable contains reference to comptime var
60// :29:18: note: 'f' points to comptime var declared here60// :29:5: note: 'f' points to comptime var declared here
61// :34:40: error: global variable contains reference to comptime var61// :34:40: error: global variable contains reference to comptime var
62// :34:40: note: 'g' points to 'v0[0]', where62// :34:40: note: 'g' points to 'v0[0]', where
63// :36:24: note: 'v0[1]' points to comptime var declared here63// :36:5: note: 'v0[1]' points to comptime var declared here
64// :42:28: error: global variable contains reference to comptime var64// :42:28: error: global variable contains reference to comptime var
65// :43:22: note: 'h' points to comptime var declared here65// :43:5: note: 'h' points to comptime var declared here
test/cases/compile_errors/comptime_var_referenced_by_type.zig+2-1
...@@ -21,5 +21,6 @@ comptime {...@@ -21,5 +21,6 @@ comptime {
21// error21// error
22//22//
23// :7:16: error: captured value contains reference to comptime var23// :7:16: error: captured value contains reference to comptime var
24// :16:30: note: 'wrapper.ptr' points to comptime var declared here24// :7:16: note: 'wrapper' points to '@as(*const tmp.Wrapper, @ptrCast(&v0)).*', where
25// :16:5: note: 'v0.ptr' points to comptime var declared here
25// :17:29: note: called at comptime here26// :17:29: note: called at comptime here
test/cases/compile_errors/enum_field_value_references_enum.zig+2-1
...@@ -10,4 +10,5 @@ const D = 1;...@@ -10,4 +10,5 @@ const D = 1;
1010
11// error11// error
12//12//
13// :1:5: error: dependency loop detected13// :2:13: error: enum 'tmp.Foo' has no member named 'B'
14// :1:17: note: enum declared here
test/cases/compile_errors/for_comptime_array_pointer.zig+1-1
...@@ -9,4 +9,4 @@ export fn foo() void {...@@ -9,4 +9,4 @@ export fn foo() void {
9//9//
10// :3:10: error: runtime value contains reference to comptime var10// :3:10: error: runtime value contains reference to comptime var
11// :3:10: note: comptime var pointers are not available at runtime11// :3:10: note: comptime var pointers are not available at runtime
12// :2:34: note: 'runtime_value' points to comptime var declared here12// :2:14: note: 'runtime_value' points to comptime var declared here