aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorCody Tapscott <topolarity@tapscott.me>2022-02-27 09:50:53 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-02-27 14:24:47 -0700
commit71aa5084edd1d3fba5bf8db87c4cf0d03667a566 (patch)
tree6437ecf24efbe2d047568960f0f939d55059d96e /src/Sema.zig
parent139b731d82d0b851c8fb2e6dbb48b735e63eecd1 (diff)
downloadzig-71aa5084edd1d3fba5bf8db87c4cf0d03667a566.tar.gz
zig-71aa5084edd1d3fba5bf8db87c4cf0d03667a566.zip
stage2: Resolve alignment for union field in `@TypeInfo`
This also includes two other small fixes: - Instantiate void TypeInfo fields as void - Return error in `type.comptimeOnly` on unresolved comptime requirements
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 5b97305010..4a8cd38dd4 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -9903,63 +9903,63 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
type_info_ty,
try Value.Tag.@"union".create(sema.arena, .{
.tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Type)),
- .val = Value.initTag(.unreachable_value),
+ .val = Value.@"void",
}),
),
.Void => return sema.addConstant(
type_info_ty,
try Value.Tag.@"union".create(sema.arena, .{
.tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Void)),
- .val = Value.initTag(.unreachable_value),
+ .val = Value.@"void",
}),
),
.Bool => return sema.addConstant(
type_info_ty,
try Value.Tag.@"union".create(sema.arena, .{
.tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Bool)),
- .val = Value.initTag(.unreachable_value),
+ .val = Value.@"void",
}),
),
.NoReturn => return sema.addConstant(
type_info_ty,
try Value.Tag.@"union".create(sema.arena, .{
.tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.NoReturn)),
- .val = Value.initTag(.unreachable_value),
+ .val = Value.@"void",
}),
),
.ComptimeFloat => return sema.addConstant(
type_info_ty,
try Value.Tag.@"union".create(sema.arena, .{
.tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.ComptimeFloat)),
- .val = Value.initTag(.unreachable_value),
+ .val = Value.@"void",
}),
),
.ComptimeInt => return sema.addConstant(
type_info_ty,
try Value.Tag.@"union".create(sema.arena, .{
.tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.ComptimeInt)),
- .val = Value.initTag(.unreachable_value),
+ .val = Value.@"void",
}),
),
.Undefined => return sema.addConstant(
type_info_ty,
try Value.Tag.@"union".create(sema.arena, .{
.tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Undefined)),
- .val = Value.initTag(.unreachable_value),
+ .val = Value.@"void",
}),
),
.Null => return sema.addConstant(
type_info_ty,
try Value.Tag.@"union".create(sema.arena, .{
.tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.Null)),
- .val = Value.initTag(.unreachable_value),
+ .val = Value.@"void",
}),
),
.EnumLiteral => return sema.addConstant(
type_info_ty,
try Value.Tag.@"union".create(sema.arena, .{
.tag = try Value.Tag.enum_field_index.create(sema.arena, @enumToInt(std.builtin.TypeId.EnumLiteral)),
- .val = Value.initTag(.unreachable_value),
+ .val = Value.@"void",
}),
),
.Fn => {
@@ -10380,6 +10380,9 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
};
const union_ty = try sema.resolveTypeFields(block, src, ty);
+ try sema.resolveTypeLayout(block, src, ty); // Getting alignment requires type layout
+ const layout = union_ty.containerLayout();
+
const union_fields = union_ty.unionFields();
const union_field_vals = try fields_anon_decl.arena().alloc(Value, union_fields.count());
@@ -10398,13 +10401,18 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
};
const union_field_fields = try fields_anon_decl.arena().create([3]Value);
+ const alignment = switch (layout) {
+ .Auto, .Extern => field.normalAlignment(target),
+ .Packed => 0,
+ };
+
union_field_fields.* = .{
// name: []const u8,
name_val,
// field_type: type,
try Value.Tag.ty.create(fields_anon_decl.arena(), field.ty),
// alignment: comptime_int,
- try field.abi_align.copy(fields_anon_decl.arena()),
+ try Value.Tag.int_u64.create(fields_anon_decl.arena(), alignment),
};
field_val.* = try Value.Tag.@"struct".create(fields_anon_decl.arena(), union_field_fields);
}
@@ -10435,7 +10443,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
// layout: ContainerLayout,
try Value.Tag.enum_field_index.create(
sema.arena,
- @enumToInt(union_ty.containerLayout()),
+ @enumToInt(layout),
),
// tag_type: ?type,
@@ -10473,6 +10481,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
break :t try struct_field_ty_decl.val.toType(&buffer).copy(fields_anon_decl.arena());
};
const struct_ty = try sema.resolveTypeFields(block, src, ty);
+ try sema.resolveTypeLayout(block, src, ty); // Getting alignment requires type layout
const layout = struct_ty.containerLayout();
const struct_field_vals = fv: {