diff --git a/src/type.zig b/src/type.zig index b6602ba18d..565ca0496b 100644 --- a/src/type.zig +++ b/src/type.zig @@ -18,7 +18,7 @@ const file_struct = @This(); pub const Type = extern union { /// If the tag value is less than Tag.no_payload_count, then no pointer /// dereference is needed. - tag_if_small_enough: usize, + tag_if_small_enough: Tag, ptr_otherwise: *Payload, pub fn zigTypeTag(ty: Type) std.builtin.TypeId { @@ -178,7 +178,7 @@ pub const Type = extern union { pub fn initTag(comptime small_tag: Tag) Type { comptime assert(@enumToInt(small_tag) < Tag.no_payload_count); - return .{ .tag_if_small_enough = @enumToInt(small_tag) }; + return .{ .tag_if_small_enough = small_tag }; } pub fn initPayload(payload: *Payload) Type { @@ -187,8 +187,8 @@ pub const Type = extern union { } pub fn tag(self: Type) Tag { - if (self.tag_if_small_enough < Tag.no_payload_count) { - return @intToEnum(Tag, @intCast(std.meta.Tag(Tag), self.tag_if_small_enough)); + if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) { + return self.tag_if_small_enough; } else { return self.ptr_otherwise.tag; } @@ -199,7 +199,7 @@ pub const Type = extern union { if (@hasField(T, "base_tag")) { return self.castTag(T.base_tag); } - if (self.tag_if_small_enough < Tag.no_payload_count) { + if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) { return null; } inline for (@typeInfo(Tag).Enum.fields) |field| { @@ -217,7 +217,7 @@ pub const Type = extern union { } pub fn castTag(self: Type, comptime t: Tag) ?*t.Type() { - if (self.tag_if_small_enough < Tag.no_payload_count) + if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) return null; if (self.ptr_otherwise.tag == t) @@ -690,7 +690,7 @@ pub const Type = extern union { }; pub fn copy(self: Type, allocator: *Allocator) error{OutOfMemory}!Type { - if (self.tag_if_small_enough < Tag.no_payload_count) { + if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) { return Type{ .tag_if_small_enough = self.tag_if_small_enough }; } else switch (self.ptr_otherwise.tag) { .u1, @@ -1459,7 +1459,7 @@ pub const Type = extern union { pub fn isNoReturn(self: Type) bool { const definitely_correct_result = self.zigTypeTag() == .NoReturn; - const fast_result = self.tag_if_small_enough == @enumToInt(Tag.noreturn); + const fast_result = self.tag_if_small_enough == Tag.noreturn; assert(fast_result == definitely_correct_result); return fast_result; } @@ -3165,7 +3165,7 @@ pub const Type = extern union { /// but with different alignment values, in this data structure they are represented /// with different enum tags, because the the former requires more payload data than the latter. /// See `zigTypeTag` for the function that corresponds to `std.builtin.TypeId`. - pub const Tag = enum { + pub const Tag = enum(usize) { // The first section of this enum are tags that require no payload. u1, u8, @@ -3382,7 +3382,7 @@ pub const Type = extern union { pub fn init(comptime t: Tag) file_struct.Type { comptime std.debug.assert(@enumToInt(t) < Tag.no_payload_count); - return .{ .tag_if_small_enough = @enumToInt(t) }; + return .{ .tag_if_small_enough = t }; } pub fn create(comptime t: Tag, ally: *Allocator, data: Data(t)) error{OutOfMemory}!file_struct.Type { diff --git a/src/value.zig b/src/value.zig index 885ce28856..8d399bc32b 100644 --- a/src/value.zig +++ b/src/value.zig @@ -17,10 +17,10 @@ const Air = @import("Air.zig"); pub const Value = extern union { /// If the tag value is less than Tag.no_payload_count, then no pointer /// dereference is needed. - tag_if_small_enough: usize, + tag_if_small_enough: Tag, ptr_otherwise: *Payload, - pub const Tag = enum { + pub const Tag = enum(usize) { // The first section of this enum are tags that require no payload. u1_type, u8_type, @@ -296,7 +296,7 @@ pub const Value = extern union { pub fn initTag(small_tag: Tag) Value { assert(@enumToInt(small_tag) < Tag.no_payload_count); - return .{ .tag_if_small_enough = @enumToInt(small_tag) }; + return .{ .tag_if_small_enough = small_tag }; } pub fn initPayload(payload: *Payload) Value { @@ -305,8 +305,8 @@ pub const Value = extern union { } pub fn tag(self: Value) Tag { - if (self.tag_if_small_enough < Tag.no_payload_count) { - return @intToEnum(Tag, @intCast(std.meta.Tag(Tag), self.tag_if_small_enough)); + if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) { + return self.tag_if_small_enough; } else { return self.ptr_otherwise.tag; } @@ -317,7 +317,7 @@ pub const Value = extern union { if (@hasField(T, "base_tag")) { return self.castTag(T.base_tag); } - if (self.tag_if_small_enough < Tag.no_payload_count) { + if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) { return null; } inline for (@typeInfo(Tag).Enum.fields) |field| { @@ -335,7 +335,7 @@ pub const Value = extern union { } pub fn castTag(self: Value, comptime t: Tag) ?*t.Type() { - if (self.tag_if_small_enough < Tag.no_payload_count) + if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) return null; if (self.ptr_otherwise.tag == t) @@ -347,7 +347,7 @@ pub const Value = extern union { /// It's intentional that this function is not passed a corresponding Type, so that /// a Value can be copied from a Sema to a Decl prior to resolving struct/union field types. pub fn copy(self: Value, arena: *Allocator) error{OutOfMemory}!Value { - if (self.tag_if_small_enough < Tag.no_payload_count) { + if (@enumToInt(self.tag_if_small_enough) < Tag.no_payload_count) { return Value{ .tag_if_small_enough = self.tag_if_small_enough }; } else switch (self.ptr_otherwise.tag) { .u1_type,