diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-11-07 14:17:26 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-07 14:17:26 +0200 |
| commit | dc128f403b69324dc8c6457836560a3f0654cff8 (patch) | |
| tree | 92458111b0b92c7033a818107c21087cd066fc09 /src/type.zig | |
| parent | 32563e68294f3ee9286e28574e1bb58e89366909 (diff) | |
| parent | 5d28d171dffd5a03276e04ec7089593e967630df (diff) | |
| download | zig-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.zig | 33 |
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; |
