diff --git a/src/Sema.zig b/src/Sema.zig index 36049c8376..204fb79885 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -33031,7 +33031,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value { } if (enum_obj.fields.count() == 1) { if (enum_obj.values.count() == 0) { - return try mod.intValue(ty, 0); // auto-numbered + return Value.enum_field_0; // auto-numbered } else { return enum_obj.values.keys()[0]; } @@ -33048,7 +33048,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value { switch (enum_obj.fields.count()) { 0 => return Value.@"unreachable", 1 => if (enum_obj.values.count() == 0) { - return try mod.intValue(ty, 0); // auto-numbered + return Value.enum_field_0; // auto-numbered } else { return enum_obj.values.keys()[0]; }, @@ -33060,14 +33060,14 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value { const enum_simple = resolved_ty.castTag(.enum_simple).?.data; switch (enum_simple.fields.count()) { 0 => return Value.@"unreachable", - 1 => return try Value.Tag.enum_field_index.create(sema.arena, 0), + 1 => return Value.enum_field_0, else => return null, } }, .enum_nonexhaustive => { const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty; if (tag_ty.zigTypeTag(mod) != .ComptimeInt and !(try sema.typeHasRuntimeBits(tag_ty))) { - return try mod.intValue(ty, 0); + return Value.enum_field_0; } else { return null; } diff --git a/src/type.zig b/src/type.zig index b088f58f0a..4ef5da57ea 100644 --- a/src/type.zig +++ b/src/type.zig @@ -4027,7 +4027,7 @@ pub const Type = struct { switch (enum_full.fields.count()) { 0 => return Value.@"unreachable", 1 => if (enum_full.values.count() == 0) { - return try mod.intValue(ty, 0); // auto-numbered + return Value.enum_field_0; // auto-numbered } else { return enum_full.values.keys()[0]; }, @@ -4038,14 +4038,14 @@ pub const Type = struct { const enum_simple = ty.castTag(.enum_simple).?.data; switch (enum_simple.fields.count()) { 0 => return Value.@"unreachable", - 1 => return try mod.intValue(ty, 0), + 1 => return Value.enum_field_0, else => return null, } }, .enum_nonexhaustive => { const tag_ty = ty.castTag(.enum_nonexhaustive).?.data.tag_ty; if (!tag_ty.hasRuntimeBits(mod)) { - return try mod.intValue(ty, 0); + return Value.enum_field_0; } else { return null; } diff --git a/src/value.zig b/src/value.zig index 855e769767..e381f4cd17 100644 --- a/src/value.zig +++ b/src/value.zig @@ -5192,6 +5192,16 @@ pub const Value = struct { pub const generic_poison_type: Value = .{ .ip_index = .generic_poison_type, .legacy = undefined }; pub const empty_struct: Value = .{ .ip_index = .empty_struct, .legacy = undefined }; + pub const enum_field_0: Value = .{ + .ip_index = .none, + .legacy = .{ .ptr_otherwise = &enum_field_0_payload.base }, + }; + + var enum_field_0_payload: Payload.U32 = .{ + .base = .{ .tag = .enum_field_index }, + .data = 0, + }; + pub fn makeBool(x: bool) Value { return if (x) Value.true else Value.false; }