From 3bd62e1bb62f4f490aeaa68c3cbf9c6c09c40726 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 4 Sep 2025 14:51:32 -0700 Subject: [PATCH] Sema: fix source location of "declared here" note point at the var not at the init expression --- src/Sema.zig | 26 +++++++++---------- .../comptime_var_referenced_at_runtime.zig | 20 +++++++------- .../comptime_var_referenced_by_decl.zig | 16 ++++++------ .../comptime_var_referenced_by_type.zig | 3 ++- .../enum_field_value_references_enum.zig | 3 ++- .../for_comptime_array_pointer.zig | 2 +- 6 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 0d5e27eb09..439f0d0fc4 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -3756,9 +3756,9 @@ fn zirAllocExtended( const pt = sema.pt; const gpa = sema.gpa; const extra = sema.code.extraData(Zir.Inst.AllocExtended, extended.operand); + const var_src = block.nodeOffset(extra.data.src_node); const ty_src = block.src(.{ .node_offset_var_decl_ty = extra.data.src_node }); const align_src = block.src(.{ .node_offset_var_decl_align = extra.data.src_node }); - const init_src = block.src(.{ .node_offset_var_decl_init = extra.data.src_node }); const small: Zir.Inst.AllocExtended.Small = @bitCast(extended.small); var extra_index: usize = extra.end; @@ -3777,7 +3777,7 @@ fn zirAllocExtended( if (block.isComptime() or small.is_comptime) { if (small.has_type) { - return sema.analyzeComptimeAlloc(block, init_src, var_ty, alignment); + return sema.analyzeComptimeAlloc(block, var_src, var_ty, alignment); } else { try sema.air_instructions.append(gpa, .{ .tag = .inferred_alloc_comptime, @@ -3792,7 +3792,7 @@ fn zirAllocExtended( } if (small.has_type and try var_ty.comptimeOnlySema(pt)) { - return sema.analyzeComptimeAlloc(block, init_src, var_ty, alignment); + return sema.analyzeComptimeAlloc(block, var_src, var_ty, alignment); } if (small.has_type) { @@ -3802,8 +3802,8 @@ fn zirAllocExtended( const target = pt.zcu.getTarget(); try var_ty.resolveLayout(pt); if (sema.func_is_naked and try var_ty.hasRuntimeBitsSema(pt)) { - const var_src = block.src(.{ .node_offset_store_ptr = extra.data.src_node }); - return sema.fail(block, var_src, "local variable in naked function", .{}); + const store_src = block.src(.{ .node_offset_store_ptr = extra.data.src_node }); + return sema.fail(block, store_src, "local variable in naked function", .{}); } const ptr_type = try sema.pt.ptrTypeSema(.{ .child = var_ty.toIntern(), @@ -3842,9 +3842,9 @@ fn zirAllocComptime(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node; const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node }); - const init_src = block.src(.{ .node_offset_var_decl_init = inst_data.src_node }); + const var_src = block.nodeOffset(inst_data.src_node); const var_ty = try sema.resolveType(block, ty_src, inst_data.operand); - return sema.analyzeComptimeAlloc(block, init_src, var_ty, .none); + return sema.analyzeComptimeAlloc(block, var_src, var_ty, .none); } fn 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 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node; const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node }); - const init_src = block.src(.{ .node_offset_var_decl_init = inst_data.src_node }); + const var_src = block.nodeOffset(inst_data.src_node); const var_ty = try sema.resolveType(block, ty_src, inst_data.operand); if (block.isComptime() or try var_ty.comptimeOnlySema(pt)) { - return sema.analyzeComptimeAlloc(block, init_src, var_ty, .none); + return sema.analyzeComptimeAlloc(block, var_src, var_ty, .none); } if (sema.func_is_naked and try var_ty.hasRuntimeBitsSema(pt)) { 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 const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node; const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node }); - const init_src = block.src(.{ .node_offset_var_decl_init = inst_data.src_node }); + const var_src = block.nodeOffset(inst_data.src_node); const var_ty = try sema.resolveType(block, ty_src, inst_data.operand); if (block.isComptime()) { - return sema.analyzeComptimeAlloc(block, init_src, var_ty, .none); + return sema.analyzeComptimeAlloc(block, var_src, var_ty, .none); } if (sema.func_is_naked and try var_ty.hasRuntimeBitsSema(pt)) { - const var_src = block.src(.{ .node_offset_store_ptr = inst_data.src_node }); - return sema.fail(block, var_src, "local variable in naked function", .{}); + const store_src = block.src(.{ .node_offset_store_ptr = inst_data.src_node }); + return sema.fail(block, store_src, "local variable in naked function", .{}); } try sema.validateVarType(block, ty_src, var_ty, false); const target = pt.zcu.getTarget(); diff --git a/test/cases/compile_errors/comptime_var_referenced_at_runtime.zig b/test/cases/compile_errors/comptime_var_referenced_at_runtime.zig index e060da33a8..603ce49732 100644 --- a/test/cases/compile_errors/comptime_var_referenced_at_runtime.zig +++ b/test/cases/compile_errors/comptime_var_referenced_at_runtime.zig @@ -75,31 +75,31 @@ export fn bax() void { // // :5:19: error: runtime value contains reference to comptime var // :5:19: note: comptime var pointers are not available at runtime -// :4:27: note: 'runtime_value' points to comptime var declared here +// :4:14: note: 'runtime_value' points to comptime var declared here // :12:40: error: runtime value contains reference to comptime var // :12:40: note: comptime var pointers are not available at runtime -// :11:27: note: 'runtime_value' points to comptime var declared here +// :11:14: note: 'runtime_value' points to comptime var declared here // :19:50: error: runtime value contains reference to comptime var // :19:50: note: comptime var pointers are not available at runtime -// :18:27: note: 'runtime_value' points to comptime var declared here +// :18:14: note: 'runtime_value' points to comptime var declared here // :28:9: error: runtime value contains reference to comptime var // :28:9: note: comptime var pointers are not available at runtime -// :27:27: note: 'runtime_value' points to comptime var declared here +// :27:14: note: 'runtime_value' points to comptime var declared here // :36:9: error: runtime value contains reference to comptime var // :36:9: note: comptime var pointers are not available at runtime -// :35:27: note: 'runtime_value' points to comptime var declared here +// :35:14: note: 'runtime_value' points to comptime var declared here // :41:12: error: runtime value contains reference to comptime var // :41:12: note: comptime var pointers are not available at runtime -// :40:27: note: 'runtime_value' points to comptime var declared here +// :40:14: note: 'runtime_value' points to comptime var declared here // :46:39: error: runtime value contains reference to comptime var // :46:39: note: comptime var pointers are not available at runtime -// :45:27: note: 'runtime_value' points to comptime var declared here +// :45:14: note: 'runtime_value' points to comptime var declared here // :55:18: error: runtime value contains reference to comptime var // :55:18: note: comptime var pointers are not available at runtime -// :51:30: note: 'runtime_value' points to comptime var declared here +// :51:14: note: 'runtime_value' points to comptime var declared here // :63:18: error: runtime value contains reference to comptime var // :63:18: note: comptime var pointers are not available at runtime -// :59:27: note: 'runtime_value' points to comptime var declared here +// :59:14: note: 'runtime_value' points to comptime var declared here // :71:19: error: runtime value contains reference to comptime var // :71:19: note: comptime var pointers are not available at runtime -// :67:30: note: 'runtime_value' points to comptime var declared here +// :67:14: note: 'runtime_value' points to comptime var declared here diff --git a/test/cases/compile_errors/comptime_var_referenced_by_decl.zig b/test/cases/compile_errors/comptime_var_referenced_by_decl.zig index 8bd0186b12..4f4b359311 100644 --- a/test/cases/compile_errors/comptime_var_referenced_by_decl.zig +++ b/test/cases/compile_errors/comptime_var_referenced_by_decl.zig @@ -47,19 +47,19 @@ export var h: *[1]u32 = h: { // error // // :1:27: error: global variable contains reference to comptime var -// :2:18: note: 'a' points to comptime var declared here +// :2:5: note: 'a' points to comptime var declared here // :6:30: error: global variable contains reference to comptime var -// :7:18: note: 'b[0]' points to comptime var declared here +// :7:5: note: 'b[0]' points to comptime var declared here // :11:30: error: global variable contains reference to comptime var -// :12:18: note: 'c' points to comptime var declared here +// :12:5: note: 'c' points to comptime var declared here // :16:33: error: global variable contains reference to comptime var -// :17:18: note: 'd' points to comptime var declared here +// :17:5: note: 'd' points to comptime var declared here // :22:24: error: global variable contains reference to comptime var -// :23:18: note: 'e.ptr' points to comptime var declared here +// :23:5: note: 'e.ptr' points to comptime var declared here // :28:33: error: global variable contains reference to comptime var -// :29:18: note: 'f' points to comptime var declared here +// :29:5: note: 'f' points to comptime var declared here // :34:40: error: global variable contains reference to comptime var // :34:40: note: 'g' points to 'v0[0]', where -// :36:24: note: 'v0[1]' points to comptime var declared here +// :36:5: note: 'v0[1]' points to comptime var declared here // :42:28: error: global variable contains reference to comptime var -// :43:22: note: 'h' points to comptime var declared here +// :43:5: note: 'h' points to comptime var declared here diff --git a/test/cases/compile_errors/comptime_var_referenced_by_type.zig b/test/cases/compile_errors/comptime_var_referenced_by_type.zig index 1f1ba8318c..1b476d9cde 100644 --- a/test/cases/compile_errors/comptime_var_referenced_by_type.zig +++ b/test/cases/compile_errors/comptime_var_referenced_by_type.zig @@ -21,5 +21,6 @@ comptime { // error // // :7:16: error: captured value contains reference to comptime var -// :16:30: note: 'wrapper.ptr' points to comptime var declared here +// :7:16: note: 'wrapper' points to '@as(*const tmp.Wrapper, @ptrCast(&v0)).*', where +// :16:5: note: 'v0.ptr' points to comptime var declared here // :17:29: note: called at comptime here diff --git a/test/cases/compile_errors/enum_field_value_references_enum.zig b/test/cases/compile_errors/enum_field_value_references_enum.zig index d658876cf6..fac5642a23 100644 --- a/test/cases/compile_errors/enum_field_value_references_enum.zig +++ b/test/cases/compile_errors/enum_field_value_references_enum.zig @@ -10,4 +10,5 @@ const D = 1; // error // -// :1:5: error: dependency loop detected +// :2:13: error: enum 'tmp.Foo' has no member named 'B' +// :1:17: note: enum declared here diff --git a/test/cases/compile_errors/for_comptime_array_pointer.zig b/test/cases/compile_errors/for_comptime_array_pointer.zig index 48f461cf42..8925fed2f6 100644 --- a/test/cases/compile_errors/for_comptime_array_pointer.zig +++ b/test/cases/compile_errors/for_comptime_array_pointer.zig @@ -9,4 +9,4 @@ export fn foo() void { // // :3:10: error: runtime value contains reference to comptime var // :3:10: note: comptime var pointers are not available at runtime -// :2:34: note: 'runtime_value' points to comptime var declared here +// :2:14: note: 'runtime_value' points to comptime var declared here