| author | |
| committer | |
| log | ad06b249b6e4253f553e7255dd5530172a14a70f |
| tree | 4144f5916116f369df1002035d8d0c444d539882 |
| parent | 8587e510e46f98e321fbad30bb235e5eed33f1ba |
and use it to fix typeHasOnePossibleValue logic in two different places.3 files changed, 17 insertions(+), 7 deletions(-)
src/Sema.zig+4-4| ... | ... | @@ -33031,7 +33031,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value { |
| 33031 | 33031 | } |
| 33032 | 33032 | if (enum_obj.fields.count() == 1) { |
| 33033 | 33033 | if (enum_obj.values.count() == 0) { |
| 33034 | return try mod.intValue(ty, 0); // auto-numbered | |
| 33034 | return Value.enum_field_0; // auto-numbered | |
| 33035 | 33035 | } else { |
| 33036 | 33036 | return enum_obj.values.keys()[0]; |
| 33037 | 33037 | } |
| ... | ... | @@ -33048,7 +33048,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value { |
| 33048 | 33048 | switch (enum_obj.fields.count()) { |
| 33049 | 33049 | 0 => return Value.@"unreachable", |
| 33050 | 33050 | 1 => if (enum_obj.values.count() == 0) { |
| 33051 | return try mod.intValue(ty, 0); // auto-numbered | |
| 33051 | return Value.enum_field_0; // auto-numbered | |
| 33052 | 33052 | } else { |
| 33053 | 33053 | return enum_obj.values.keys()[0]; |
| 33054 | 33054 | }, |
| ... | ... | @@ -33060,14 +33060,14 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value { |
| 33060 | 33060 | const enum_simple = resolved_ty.castTag(.enum_simple).?.data; |
| 33061 | 33061 | switch (enum_simple.fields.count()) { |
| 33062 | 33062 | 0 => return Value.@"unreachable", |
| 33063 | 1 => return try Value.Tag.enum_field_index.create(sema.arena, 0), | |
| 33063 | 1 => return Value.enum_field_0, | |
| 33064 | 33064 | else => return null, |
| 33065 | 33065 | } |
| 33066 | 33066 | }, |
| 33067 | 33067 | .enum_nonexhaustive => { |
| 33068 | 33068 | const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty; |
| 33069 | 33069 | if (tag_ty.zigTypeTag(mod) != .ComptimeInt and !(try sema.typeHasRuntimeBits(tag_ty))) { |
| 33070 | return try mod.intValue(ty, 0); | |
| 33070 | return Value.enum_field_0; | |
| 33071 | 33071 | } else { |
| 33072 | 33072 | return null; |
| 33073 | 33073 | } |
src/type.zig+3-3| ... | ... | @@ -4027,7 +4027,7 @@ pub const Type = struct { |
| 4027 | 4027 | switch (enum_full.fields.count()) { |
| 4028 | 4028 | 0 => return Value.@"unreachable", |
| 4029 | 4029 | 1 => if (enum_full.values.count() == 0) { |
| 4030 | return try mod.intValue(ty, 0); // auto-numbered | |
| 4030 | return Value.enum_field_0; // auto-numbered | |
| 4031 | 4031 | } else { |
| 4032 | 4032 | return enum_full.values.keys()[0]; |
| 4033 | 4033 | }, |
| ... | ... | @@ -4038,14 +4038,14 @@ pub const Type = struct { |
| 4038 | 4038 | const enum_simple = ty.castTag(.enum_simple).?.data; |
| 4039 | 4039 | switch (enum_simple.fields.count()) { |
| 4040 | 4040 | 0 => return Value.@"unreachable", |
| 4041 | 1 => return try mod.intValue(ty, 0), | |
| 4041 | 1 => return Value.enum_field_0, | |
| 4042 | 4042 | else => return null, |
| 4043 | 4043 | } |
| 4044 | 4044 | }, |
| 4045 | 4045 | .enum_nonexhaustive => { |
| 4046 | 4046 | const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty; |
| 4047 | 4047 | if (!tag_ty.hasRuntimeBits(mod)) { |
| 4048 | return try mod.intValue(ty, 0); | |
| 4048 | return Value.enum_field_0; | |
| 4049 | 4049 | } else { |
| 4050 | 4050 | return null; |
| 4051 | 4051 | } |
src/value.zig+10| ... | ... | @@ -5192,6 +5192,16 @@ pub const Value = struct { |
| 5192 | 5192 | pub const generic_poison_type: Value = .{ .ip_index = .generic_poison_type, .legacy = undefined }; |
| 5193 | 5193 | pub const empty_struct: Value = .{ .ip_index = .empty_struct, .legacy = undefined }; |
| 5194 | 5194 | |
| 5195 | pub const enum_field_0: Value = .{ | |
| 5196 | .ip_index = .none, | |
| 5197 | .legacy = .{ .ptr_otherwise = &enum_field_0_payload.base }, | |
| 5198 | }; | |
| 5199 | ||
| 5200 | var enum_field_0_payload: Payload.U32 = .{ | |
| 5201 | .base = .{ .tag = .enum_field_index }, | |
| 5202 | .data = 0, | |
| 5203 | }; | |
| 5204 | ||
| 5195 | 5205 | pub fn makeBool(x: bool) Value { |
| 5196 | 5206 | return if (x) Value.true else Value.false; |
| 5197 | 5207 | } |