Commit 28353b3159

Andrew Kelley <andrew@ziglang.org>
2021-05-08 07:16:15
stage2: fix struct inits not getting fields resolved
1 parent 73bf530
Changed files (4)
src/Module.zig
@@ -4416,7 +4416,9 @@ pub fn analyzeStructFields(mod: *Module, struct_obj: *Struct) InnerError!void {
     };
     defer assert(block.instructions.items.len == 0); // should all be comptime instructions
 
-    _ = try sema.analyzeBody(&block, body);
+    if (body.len != 0) {
+        _ = try sema.analyzeBody(&block, body);
+    }
 
     const bits_per_field = 4;
     const fields_per_u32 = 32 / bits_per_field;
@@ -4545,7 +4547,9 @@ pub fn analyzeUnionFields(mod: *Module, union_obj: *Union) InnerError!void {
     };
     defer assert(block.instructions.items.len == 0); // should all be comptime instructions
 
-    _ = try sema.analyzeBody(&block, body);
+    if (body.len != 0) {
+        _ = try sema.analyzeBody(&block, body);
+    }
 
     var auto_enum_tag: ?bool = null;
 
src/Sema.zig
@@ -5425,11 +5425,8 @@ fn zirFieldType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) InnerErr
     }
     const struct_ty = try sema.resolveTypeFields(block, src, unresolved_struct_type);
     const struct_obj = struct_ty.castTag(.@"struct").?.data;
-    const field = struct_obj.fields.get(field_name) orelse {
-        return sema.mod.fail(&block.base, src, "no field named '{s}' in struct '{}'", .{
-            field_name, struct_ty,
-        });
-    };
+    const field = struct_obj.fields.get(field_name) orelse
+        return sema.failWithBadFieldAccess(block, struct_obj, src, field_name);
     return sema.mod.constType(sema.arena, src, field.ty);
 }
 
@@ -6220,13 +6217,14 @@ fn analyzeStructFieldPtr(
     struct_ptr: *Inst,
     field_name: []const u8,
     field_name_src: LazySrcLoc,
-    elem_ty: Type,
+    unresolved_struct_ty: Type,
 ) InnerError!*Inst {
     const mod = sema.mod;
     const arena = sema.arena;
-    assert(elem_ty.zigTypeTag() == .Struct);
+    assert(unresolved_struct_ty.zigTypeTag() == .Struct);
 
-    const struct_obj = elem_ty.castTag(.@"struct").?.data;
+    const struct_ty = try sema.resolveTypeFields(block, src, unresolved_struct_ty);
+    const struct_obj = struct_ty.castTag(.@"struct").?.data;
 
     const field_index = struct_obj.fields.getIndex(field_name) orelse
         return sema.failWithBadFieldAccess(block, struct_obj, field_name_src, field_name);
test/stage2/cbe.zig
@@ -516,7 +516,7 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    return p.y - p.x - p.x;
             \\}
         , &.{
-            ":3:21: error: mising struct field: x",
+            ":3:21: error: missing struct field: x",
             ":1:15: note: struct 'Point' declared here",
         });
         case.addError(
BRANCH_TODO
@@ -1,3 +1,5 @@
+ * structs, unions, enums, etc get weird names such as "Point__anon_22" rather
+   than "Point".
  * get stage2 tests passing
  * modify stage2 tests so that only 1 uses _start and the rest use
    pub fn main