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 {...@@ -33031,7 +33031,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
33031 }33031 }
33032 if (enum_obj.fields.count() == 1) {33032 if (enum_obj.fields.count() == 1) {
33033 if (enum_obj.values.count() == 0) {33033 if (enum_obj.values.count() == 0) {
33034 return try mod.intValue(ty, 0); // auto-numbered33034 return Value.enum_field_0; // auto-numbered
33035 } else {33035 } else {
33036 return enum_obj.values.keys()[0];33036 return enum_obj.values.keys()[0];
33037 }33037 }
...@@ -33048,7 +33048,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {...@@ -33048,7 +33048,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
33048 switch (enum_obj.fields.count()) {33048 switch (enum_obj.fields.count()) {
33049 0 => return Value.@"unreachable",33049 0 => return Value.@"unreachable",
33050 1 => if (enum_obj.values.count() == 0) {33050 1 => if (enum_obj.values.count() == 0) {
33051 return try mod.intValue(ty, 0); // auto-numbered33051 return Value.enum_field_0; // auto-numbered
33052 } else {33052 } else {
33053 return enum_obj.values.keys()[0];33053 return enum_obj.values.keys()[0];
33054 },33054 },
...@@ -33060,14 +33060,14 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {...@@ -33060,14 +33060,14 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
33060 const enum_simple = resolved_ty.castTag(.enum_simple).?.data;33060 const enum_simple = resolved_ty.castTag(.enum_simple).?.data;
33061 switch (enum_simple.fields.count()) {33061 switch (enum_simple.fields.count()) {
33062 0 => return Value.@"unreachable",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 else => return null,33064 else => return null,
33065 }33065 }
33066 },33066 },
33067 .enum_nonexhaustive => {33067 .enum_nonexhaustive => {
33068 const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty;33068 const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty;
33069 if (tag_ty.zigTypeTag(mod) != .ComptimeInt and !(try sema.typeHasRuntimeBits(tag_ty))) {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 } else {33071 } else {
33072 return null;33072 return null;
33073 }33073 }
src/type.zig+3-3
...@@ -4027,7 +4027,7 @@ pub const Type = struct {...@@ -4027,7 +4027,7 @@ pub const Type = struct {
4027 switch (enum_full.fields.count()) {4027 switch (enum_full.fields.count()) {
4028 0 => return Value.@"unreachable",4028 0 => return Value.@"unreachable",
4029 1 => if (enum_full.values.count() == 0) {4029 1 => if (enum_full.values.count() == 0) {
4030 return try mod.intValue(ty, 0); // auto-numbered4030 return Value.enum_field_0; // auto-numbered
4031 } else {4031 } else {
4032 return enum_full.values.keys()[0];4032 return enum_full.values.keys()[0];
4033 },4033 },
...@@ -4038,14 +4038,14 @@ pub const Type = struct {...@@ -4038,14 +4038,14 @@ pub const Type = struct {
4038 const enum_simple = ty.castTag(.enum_simple).?.data;4038 const enum_simple = ty.castTag(.enum_simple).?.data;
4039 switch (enum_simple.fields.count()) {4039 switch (enum_simple.fields.count()) {
4040 0 => return Value.@"unreachable",4040 0 => return Value.@"unreachable",
4041 1 => return try mod.intValue(ty, 0),4041 1 => return Value.enum_field_0,
4042 else => return null,4042 else => return null,
4043 }4043 }
4044 },4044 },
4045 .enum_nonexhaustive => {4045 .enum_nonexhaustive => {
4046 const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty;4046 const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty;
4047 if (!tag_ty.hasRuntimeBits(mod)) {4047 if (!tag_ty.hasRuntimeBits(mod)) {
4048 return try mod.intValue(ty, 0);4048 return Value.enum_field_0;
4049 } else {4049 } else {
4050 return null;4050 return null;
4051 }4051 }
src/value.zig+10
...@@ -5192,6 +5192,16 @@ pub const Value = struct {...@@ -5192,6 +5192,16 @@ pub const Value = struct {
5192 pub const generic_poison_type: Value = .{ .ip_index = .generic_poison_type, .legacy = undefined };5192 pub const generic_poison_type: Value = .{ .ip_index = .generic_poison_type, .legacy = undefined };
5193 pub const empty_struct: Value = .{ .ip_index = .empty_struct, .legacy = undefined };5193 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
5195 pub fn makeBool(x: bool) Value {5205 pub fn makeBool(x: bool) Value {
5196 return if (x) Value.true else Value.false;5206 return if (x) Value.true else Value.false;
5197 }5207 }