aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-11-07 14:17:26 +0200
committerGitHub <noreply@github.com>2022-11-07 14:17:26 +0200
commitdc128f403b69324dc8c6457836560a3f0654cff8 (patch)
tree92458111b0b92c7033a818107c21087cd066fc09 /src/type.zig
parent32563e68294f3ee9286e28574e1bb58e89366909 (diff)
parent5d28d171dffd5a03276e04ec7089593e967630df (diff)
downloadzig-dc128f403b69324dc8c6457836560a3f0654cff8.tar.gz
zig-dc128f403b69324dc8c6457836560a3f0654cff8.zip
Merge pull request #13446 from Vexu/stage2-fixes
Stage2 bug fixes
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig33
1 files changed, 16 insertions, 17 deletions
diff --git a/src/type.zig b/src/type.zig
index 46d8b8bc20..12c969eaec 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -3574,15 +3574,13 @@ pub const Type = extern union {
.u128, .i128, .f128 => return 128,
.@"struct" => {
- if (sema_kit) |sk| _ = try sk.sema.resolveTypeFields(sk.block, sk.src, ty);
- if (ty.containerLayout() != .Packed) {
+ const struct_obj = ty.castTag(.@"struct").?.data;
+ if (struct_obj.layout != .Packed) {
return (try ty.abiSizeAdvanced(target, if (sema_kit) |sk| .{ .sema_kit = sk } else .eager)).scalar * 8;
}
- var total: u64 = 0;
- for (ty.structFields().values()) |field| {
- total += try bitSizeAdvanced(field.ty, target, sema_kit);
- }
- return total;
+ if (sema_kit) |sk| _ = try sk.sema.resolveTypeLayout(sk.block, sk.src, ty);
+ assert(struct_obj.haveLayout());
+ return try struct_obj.backing_int_ty.bitSizeAdvanced(target, sema_kit);
},
.tuple, .anon_struct => {
@@ -5015,22 +5013,22 @@ pub const Type = extern union {
if (enum_full.tag_ty.hasRuntimeBits()) {
return null;
}
- if (enum_full.fields.count() == 1) {
- if (enum_full.values.count() == 0) {
- return Value.zero;
+ switch (enum_full.fields.count()) {
+ 0 => return Value.initTag(.unreachable_value),
+ 1 => if (enum_full.values.count() == 0) {
+ return Value.zero; // auto-numbered
} else {
return enum_full.values.keys()[0];
- }
- } else {
- return null;
+ },
+ else => return null,
}
},
.enum_simple => {
const enum_simple = ty.castTag(.enum_simple).?.data;
- if (enum_simple.fields.count() == 1) {
- return Value.zero;
- } else {
- return null;
+ switch (enum_simple.fields.count()) {
+ 0 => return Value.initTag(.unreachable_value),
+ 1 => return Value.zero,
+ else => return null,
}
},
.enum_nonexhaustive => {
@@ -5044,6 +5042,7 @@ pub const Type = extern union {
.@"union", .union_safety_tagged, .union_tagged => {
const union_obj = ty.cast(Payload.Union).?.data;
const tag_val = union_obj.tag_ty.onePossibleValue() orelse return null;
+ if (union_obj.fields.count() == 0) return Value.initTag(.unreachable_value);
const only_field = union_obj.fields.values()[0];
const val_val = only_field.ty.onePossibleValue() orelse return null;
_ = tag_val;