Commit 4b0ef6a409

Veikka Tuominen <git@vexu.eu>
2022-11-29 17:49:27
Sema: make non-existent field error point to field name
Closes #13698
1 parent 6f5a438
Changed files (2)
src/Sema.zig
@@ -17613,11 +17613,11 @@ fn zirFieldType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
     const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
     const extra = sema.code.extraData(Zir.Inst.FieldType, inst_data.payload_index).data;
     const ty_src = inst_data.src();
-    const field_src = inst_data.src();
+    const field_name_src: LazySrcLoc = .{ .node_offset_field_name = inst_data.src_node };
     const aggregate_ty = try sema.resolveType(block, ty_src, extra.container_type);
     if (aggregate_ty.tag() == .var_args_param) return sema.addType(aggregate_ty);
     const field_name = sema.code.nullTerminatedString(extra.name_start);
-    return sema.fieldType(block, aggregate_ty, field_name, field_src, ty_src);
+    return sema.fieldType(block, aggregate_ty, field_name, field_name_src, ty_src);
 }
 
 fn fieldType(
test/cases/compile_errors/invalid_field_in_struct_value_expression.zig
@@ -12,9 +12,21 @@ export fn f() void {
     _ = a;
 }
 
+const Object = struct {
+    field_1: u32,
+    field_2: u32,
+};
+fn dump(_: Object) void {}
+pub export fn entry() void {
+    dump(.{ .field_1 = 123, .field_3 = 456 });
+}
+
+
 // error
 // backend=stage2
 // target=native
 //
 // :10:10: error: no field named 'foo' in struct 'tmp.A'
 // :1:11: note: struct declared here
+// :21:30: error: no field named 'field_3' in struct 'tmp.Object'
+// :15:16: note: struct declared here