Commit 61ba225709

Krzysztof Wolicki <der.teufel.mail@gmail.com>
2024-01-26 14:22:15
Sema: tuples have no names to be used for reporting errors in finishStructInit
1 parent bea958d
Changed files (2)
src/Sema.zig
@@ -19963,13 +19963,22 @@ fn finishStructInit(
 
                 const field_init = struct_type.fieldInit(ip, i);
                 if (field_init == .none) {
-                    const field_name = struct_type.field_names.get(ip)[i];
-                    const template = "missing struct field: {}";
-                    const args = .{field_name.fmt(ip)};
-                    if (root_msg) |msg| {
-                        try sema.errNote(block, init_src, msg, template, args);
+                    if (!struct_type.isTuple(ip)) {
+                        const field_name = struct_type.field_names.get(ip)[i];
+                        const template = "missing struct field: {}";
+                        const args = .{field_name.fmt(ip)};
+                        if (root_msg) |msg| {
+                            try sema.errNote(block, init_src, msg, template, args);
+                        } else {
+                            root_msg = try sema.errMsg(block, init_src, template, args);
+                        }
                     } else {
-                        root_msg = try sema.errMsg(block, init_src, template, args);
+                        const template = "missing tuple field with index {d}";
+                        if (root_msg) |msg| {
+                            try sema.errNote(block, init_src, msg, template, .{i});
+                        } else {
+                            root_msg = try sema.errMsg(block, init_src, template, .{i});
+                        }
                     }
                 } else {
                     field_inits[i] = Air.internedToRef(field_init);
test/cases/compile_errors/missing_field_in_struct_value_expression.zig
@@ -13,9 +13,23 @@ export fn f() void {
     _ = a;
 }
 
+const B = struct { u32, u32 };
+export fn g() void {
+    const b = B{0};
+    _ = b;
+}
+export fn h() void {
+    const c = B{};
+    _ = c;
+}
 // error
 // backend=stage2
 // target=native
 //
 // :9:16: error: missing struct field: x
 // :1:11: note: struct 'tmp.A' declared here
+// :18:16: error: missing tuple field with index 1
+// :16:11: note: struct declared here
+// :22:16: error: missing tuple field with index 0
+// :22:16: note: missing tuple field with index 1
+// :16:11: note: struct 'tmp.B' declared here