authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-05-07 22:16:15-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-05-07 22:16:15-07:00
log28353b315935e54b497f4abb875fac387e20f65f
tree79c2a081157b231038f5ff54abf3166abd3c66eb
parent73bf53069d4e719cb74be87bd41b0a2ac65b7dfe

stage2: fix struct inits not getting fields resolved


4 files changed, 15 insertions(+), 11 deletions(-)

BRANCH_TODO+2
......@@ -1,3 +1,5 @@
1 * structs, unions, enums, etc get weird names such as "Point__anon_22" rather
2 than "Point".
13 * get stage2 tests passing
24 * modify stage2 tests so that only 1 uses _start and the rest use
35 pub fn main
src/Module.zig+6-2
......@@ -4416,7 +4416,9 @@ pub fn analyzeStructFields(mod: *Module, struct_obj: *Struct) InnerError!void {
44164416 };
44174417 defer assert(block.instructions.items.len == 0); // should all be comptime instructions
44184418
4419 _ = try sema.analyzeBody(&block, body);
4419 if (body.len != 0) {
4420 _ = try sema.analyzeBody(&block, body);
4421 }
44204422
44214423 const bits_per_field = 4;
44224424 const fields_per_u32 = 32 / bits_per_field;
......@@ -4545,7 +4547,9 @@ pub fn analyzeUnionFields(mod: *Module, union_obj: *Union) InnerError!void {
45454547 };
45464548 defer assert(block.instructions.items.len == 0); // should all be comptime instructions
45474549
4548 _ = try sema.analyzeBody(&block, body);
4550 if (body.len != 0) {
4551 _ = try sema.analyzeBody(&block, body);
4552 }
45494553
45504554 var auto_enum_tag: ?bool = null;
45514555
src/Sema.zig+6-8
......@@ -5425,11 +5425,8 @@ fn zirFieldType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) InnerErr
54255425 }
54265426 const struct_ty = try sema.resolveTypeFields(block, src, unresolved_struct_type);
54275427 const struct_obj = struct_ty.castTag(.@"struct").?.data;
5428 const field = struct_obj.fields.get(field_name) orelse {
5429 return sema.mod.fail(&block.base, src, "no field named '{s}' in struct '{}'", .{
5430 field_name, struct_ty,
5431 });
5432 };
5428 const field = struct_obj.fields.get(field_name) orelse
5429 return sema.failWithBadFieldAccess(block, struct_obj, src, field_name);
54335430 return sema.mod.constType(sema.arena, src, field.ty);
54345431}
54355432
......@@ -6220,13 +6217,14 @@ fn analyzeStructFieldPtr(
62206217 struct_ptr: *Inst,
62216218 field_name: []const u8,
62226219 field_name_src: LazySrcLoc,
6223 elem_ty: Type,
6220 unresolved_struct_ty: Type,
62246221) InnerError!*Inst {
62256222 const mod = sema.mod;
62266223 const arena = sema.arena;
6227 assert(elem_ty.zigTypeTag() == .Struct);
6224 assert(unresolved_struct_ty.zigTypeTag() == .Struct);
62286225
6229 const struct_obj = elem_ty.castTag(.@"struct").?.data;
6226 const struct_ty = try sema.resolveTypeFields(block, src, unresolved_struct_ty);
6227 const struct_obj = struct_ty.castTag(.@"struct").?.data;
62306228
62316229 const field_index = struct_obj.fields.getIndex(field_name) orelse
62326230 return sema.failWithBadFieldAccess(block, struct_obj, field_name_src, field_name);
test/stage2/cbe.zig+1-1
......@@ -516,7 +516,7 @@ pub fn addCases(ctx: *TestContext) !void {
516516 \\ return p.y - p.x - p.x;
517517 \\}
518518 , &.{
519 ":3:21: error: mising struct field: x",
519 ":3:21: error: missing struct field: x",
520520 ":1:15: note: struct 'Point' declared here",
521521 });
522522 case.addError(