aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-05-07 22:16:15 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-05-07 22:16:15 -0700
commit28353b315935e54b497f4abb875fac387e20f65f (patch)
tree79c2a081157b231038f5ff54abf3166abd3c66eb /src
parent73bf53069d4e719cb74be87bd41b0a2ac65b7dfe (diff)
downloadzig-28353b315935e54b497f4abb875fac387e20f65f.tar.gz
zig-28353b315935e54b497f4abb875fac387e20f65f.zip
stage2: fix struct inits not getting fields resolved
Diffstat (limited to 'src')
-rw-r--r--src/Module.zig8
-rw-r--r--src/Sema.zig14
2 files changed, 12 insertions, 10 deletions
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);