authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-05-07 22:36:57-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-10 20:42:30-07:00
logad06b249b6e4253f553e7255dd5530172a14a70f
tree4144f5916116f369df1002035d8d0c444d539882
parent8587e510e46f98e321fbad30bb235e5eed33f1ba

Sema: introduce Value.enum_field_0

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 {
3303133031 }
3303233032 if (enum_obj.fields.count() == 1) {
3303333033 if (enum_obj.values.count() == 0) {
33034 return try mod.intValue(ty, 0); // auto-numbered
33034 return Value.enum_field_0; // auto-numbered
3303533035 } else {
3303633036 return enum_obj.values.keys()[0];
3303733037 }
......@@ -33048,7 +33048,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
3304833048 switch (enum_obj.fields.count()) {
3304933049 0 => return Value.@"unreachable",
3305033050 1 => if (enum_obj.values.count() == 0) {
33051 return try mod.intValue(ty, 0); // auto-numbered
33051 return Value.enum_field_0; // auto-numbered
3305233052 } else {
3305333053 return enum_obj.values.keys()[0];
3305433054 },
......@@ -33060,14 +33060,14 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
3306033060 const enum_simple = resolved_ty.castTag(.enum_simple).?.data;
3306133061 switch (enum_simple.fields.count()) {
3306233062 0 => return Value.@"unreachable",
33063 1 => return try Value.Tag.enum_field_index.create(sema.arena, 0),
33063 1 => return Value.enum_field_0,
3306433064 else => return null,
3306533065 }
3306633066 },
3306733067 .enum_nonexhaustive => {
3306833068 const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty;
3306933069 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;
3307133071 } else {
3307233072 return null;
3307333073 }
src/type.zig+3-3
......@@ -4027,7 +4027,7 @@ pub const Type = struct {
40274027 switch (enum_full.fields.count()) {
40284028 0 => return Value.@"unreachable",
40294029 1 => if (enum_full.values.count() == 0) {
4030 return try mod.intValue(ty, 0); // auto-numbered
4030 return Value.enum_field_0; // auto-numbered
40314031 } else {
40324032 return enum_full.values.keys()[0];
40334033 },
......@@ -4038,14 +4038,14 @@ pub const Type = struct {
40384038 const enum_simple = ty.castTag(.enum_simple).?.data;
40394039 switch (enum_simple.fields.count()) {
40404040 0 => return Value.@"unreachable",
4041 1 => return try mod.intValue(ty, 0),
4041 1 => return Value.enum_field_0,
40424042 else => return null,
40434043 }
40444044 },
40454045 .enum_nonexhaustive => {
40464046 const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty;
40474047 if (!tag_ty.hasRuntimeBits(mod)) {
4048 return try mod.intValue(ty, 0);
4048 return Value.enum_field_0;
40494049 } else {
40504050 return null;
40514051 }
src/value.zig+10
......@@ -5192,6 +5192,16 @@ pub const Value = struct {
51925192 pub const generic_poison_type: Value = .{ .ip_index = .generic_poison_type, .legacy = undefined };
51935193 pub const empty_struct: Value = .{ .ip_index = .empty_struct, .legacy = undefined };
51945194
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
51955205 pub fn makeBool(x: bool) Value {
51965206 return if (x) Value.true else Value.false;
51975207 }