From 28353b315935e54b497f4abb875fac387e20f65f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 7 May 2021 22:16:15 -0700 Subject: [PATCH] stage2: fix struct inits not getting fields resolved --- BRANCH_TODO | 2 ++ src/Module.zig | 8 ++++++-- src/Sema.zig | 14 ++++++-------- test/stage2/cbe.zig | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/BRANCH_TODO b/BRANCH_TODO index 54153185e2..28a611d809 100644 --- a/BRANCH_TODO +++ b/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 diff --git a/src/Module.zig b/src/Module.zig index 4a4f0206d7..42efd32f63 100644 --- a/src/Module.zig +++ b/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; diff --git a/src/Sema.zig b/src/Sema.zig index 3a5de5c789..9427222a46 100644 --- a/src/Sema.zig +++ b/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); diff --git a/test/stage2/cbe.zig b/test/stage2/cbe.zig index f9f86bf8ed..5ffb67f731 100644 --- a/test/stage2/cbe.zig +++ b/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(