authorgravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2025-04-30 18:42:23+03:30
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-11-22 22:42:38+00:00
logdec1163fbb892f276179ae74b51007c656157d99
tree7efa4ebe2ffb6876ffd6de0f417303232f559d87
parentce0df033cf2bb6986c6c226786e6543d05e29a77
signaturelock-open Commit is signed but in an unrecognized format.

all: replace all `@Type` usages

Co-authored-by: Matthew Lugg <mlugg@mlugg.co.uk>

108 files changed, 631 insertions(+), 1893 deletions(-)

doc/langref/std_options.zig+1-1
......@@ -11,7 +11,7 @@ pub const std_options: std.Options = .{
1111
1212fn myLogFn(
1313 comptime level: std.log.Level,
14 comptime scope: @Type(.enum_literal),
14 comptime scope: @EnumLiteral(),
1515 comptime format: []const u8,
1616 args: anytype,
1717) void {
doc/langref/test_coerce_unions_enums.zig+1-1
......@@ -41,7 +41,7 @@ test "coercion between unions and enums" {
4141 try expect(u_4.tag() == 1);
4242
4343 // The following example is invalid.
44 // error: coercion from enum '@TypeOf(.enum_literal)' to union 'test_coerce_unions_enum.U2' must initialize 'f32' field 'b'
44 // error: coercion from enum '@EnumLiteral()' to union 'test_coerce_unions_enum.U2' must initialize 'f32' field 'b'
4545 //var u_5: U2 = .b;
4646 //try expect(u_5.tag() == 2);
4747}
lib/build-web/main.zig+1-1
......@@ -49,7 +49,7 @@ pub fn panic(msg: []const u8, st: ?*std.builtin.StackTrace, addr: ?usize) noretu
4949
5050fn logFn(
5151 comptime message_level: log.Level,
52 comptime scope: @TypeOf(.enum_literal),
52 comptime scope: @EnumLiteral(),
5353 comptime format: []const u8,
5454 args: anytype,
5555) void {
lib/compiler/aro/aro/Attribute.zig+6-16
......@@ -717,23 +717,13 @@ pub const Tag = std.meta.DeclEnum(attributes);
717717
718718pub const Arguments = blk: {
719719 const decls = @typeInfo(attributes).@"struct".decls;
720 var union_fields: [decls.len]ZigType.UnionField = undefined;
721 for (decls, &union_fields) |decl, *field| {
722 field.* = .{
723 .name = decl.name,
724 .type = @field(attributes, decl.name),
725 .alignment = @alignOf(@field(attributes, decl.name)),
726 };
720 var names: [decls.len][]const u8 = undefined;
721 var types: [decls.len]type = undefined;
722 for (decls, &names, &types) |decl, *name, *T| {
723 name.* = decl.name;
724 T.* = @field(attributes, decl.name);
727725 }
728
729 break :blk @Type(.{
730 .@"union" = .{
731 .layout = .auto,
732 .tag_type = null,
733 .fields = &union_fields,
734 .decls = &.{},
735 },
736 });
726 break :blk @Union(.auto, null, &names, &types, &@splat(.{}));
737727};
738728
739729pub fn ArgumentsForTag(comptime tag: Tag) type {
lib/compiler/aro/assembly_backend/x86_64.zig+1-1
......@@ -59,7 +59,7 @@ fn serializeFloat(comptime T: type, value: T, w: *std.Io.Writer) !void {
5959 else => {
6060 const size = @bitSizeOf(T);
6161 const storage_unit = std.meta.intToEnum(StorageUnit, size) catch unreachable;
62 const IntTy = @Type(.{ .int = .{ .signedness = .unsigned, .bits = size } });
62 const IntTy = @Int(.unsigned, size);
6363 const int_val: IntTy = @bitCast(value);
6464 return serializeInt(int_val, storage_unit, w);
6565 },
lib/compiler/resinator/code_pages.zig+7-6
......@@ -179,12 +179,13 @@ pub const UnsupportedCodePage = enum(u16) {
179179
180180pub const CodePage = blk: {
181181 const fields = @typeInfo(SupportedCodePage).@"enum".fields ++ @typeInfo(UnsupportedCodePage).@"enum".fields;
182 break :blk @Type(.{ .@"enum" = .{
183 .tag_type = u16,
184 .decls = &.{},
185 .fields = fields,
186 .is_exhaustive = true,
187 } });
182 var field_names: [fields.len][]const u8 = undefined;
183 var field_values: [fields.len]u16 = undefined;
184 for (fields, &field_names, &field_values) |field, *name, *val| {
185 name.* = field.name;
186 val.* = field.value;
187 }
188 break :blk @Enum(u16, .exhaustive, &field_names, &field_values);
188189};
189190
190191pub fn isSupported(code_page: CodePage) bool {
lib/compiler/resinator/errors.zig+12-9
......@@ -862,20 +862,23 @@ pub const ErrorDetails = struct {
862862pub const ErrorDetailsWithoutCodePage = blk: {
863863 const details_info = @typeInfo(ErrorDetails);
864864 const fields = details_info.@"struct".fields;
865 var fields_without_codepage: [fields.len - 1]std.builtin.Type.StructField = undefined;
865 var field_names: [fields.len - 1][]const u8 = undefined;
866 var field_types: [fields.len - 1]type = undefined;
867 var field_attrs: [fields.len - 1]std.builtin.Type.StructField.Attributes = undefined;
866868 var i: usize = 0;
867869 for (fields) |field| {
868870 if (std.mem.eql(u8, field.name, "code_page")) continue;
869 fields_without_codepage[i] = field;
871 field_names[i] = field.name;
872 field_types[i] = field.type;
873 field_attrs[i] = .{
874 .@"comptime" = field.is_comptime,
875 .@"align" = field.alignment,
876 .default_value_ptr = field.default_value_ptr,
877 };
870878 i += 1;
871879 }
872 std.debug.assert(i == fields_without_codepage.len);
873 break :blk @Type(.{ .@"struct" = .{
874 .layout = .auto,
875 .fields = &fields_without_codepage,
876 .decls = &.{},
877 .is_tuple = false,
878 } });
880 std.debug.assert(i == fields.len - 1);
881 break :blk @Struct(.auto, null, &field_names, &field_types, &field_attrs);
879882};
880883
881884fn cellCount(code_page: SupportedCodePage, source: []const u8, start_index: usize, end_index: usize) usize {
lib/compiler/test_runner.zig+1-1
......@@ -298,7 +298,7 @@ fn mainTerminal() void {
298298
299299pub fn log(
300300 comptime message_level: std.log.Level,
301 comptime scope: @Type(.enum_literal),
301 comptime scope: @EnumLiteral(),
302302 comptime format: []const u8,
303303 args: anytype,
304304) void {
lib/compiler_rt/common.zig+1-4
......@@ -290,10 +290,7 @@ pub fn normalize(comptime T: type, significand: *std.meta.Int(.unsigned, @typeIn
290290pub inline fn fneg(a: anytype) @TypeOf(a) {
291291 const F = @TypeOf(a);
292292 const bits = @typeInfo(F).float.bits;
293 const U = @Type(.{ .int = .{
294 .signedness = .unsigned,
295 .bits = bits,
296 } });
293 const U = @Int(.unsigned, bits);
297294 const sign_bit_mask = @as(U, 1) << (bits - 1);
298295 const negated = @as(U, @bitCast(a)) ^ sign_bit_mask;
299296 return @bitCast(negated);
lib/compiler_rt/float_from_int.zig+5-5
......@@ -66,17 +66,17 @@ pub inline fn floatFromBigInt(comptime T: type, comptime signedness: std.builtin
6666 switch (x.len) {
6767 0 => return 0,
6868 inline 1...4 => |limbs_len| return @floatFromInt(@as(
69 @Type(.{ .int = .{ .signedness = signedness, .bits = 32 * limbs_len } }),
69 @Int(signedness, 32 * limbs_len),
7070 @bitCast(x[0..limbs_len].*),
7171 )),
7272 else => {},
7373 }
7474
7575 // sign implicit fraction round sticky
76 const I = comptime @Type(.{ .int = .{
77 .signedness = signedness,
78 .bits = @as(u16, @intFromBool(signedness == .signed)) + 1 + math.floatFractionalBits(T) + 1 + 1,
79 } });
76 const I = comptime @Int(
77 signedness,
78 @as(u16, @intFromBool(signedness == .signed)) + 1 + math.floatFractionalBits(T) + 1 + 1,
79 );
8080
8181 const clrsb = clrsb: {
8282 var clsb: usize = 0;
lib/compiler_rt/int_from_float.zig+2-5
......@@ -56,7 +56,7 @@ pub inline fn bigIntFromFloat(comptime signedness: std.builtin.Signedness, resul
5656 0 => return,
5757 inline 1...4 => |limbs_len| {
5858 result[0..limbs_len].* = @bitCast(@as(
59 @Type(.{ .int = .{ .signedness = signedness, .bits = 32 * limbs_len } }),
59 @Int(signedness, 32 * limbs_len),
6060 @intFromFloat(a),
6161 ));
6262 return;
......@@ -66,10 +66,7 @@ pub inline fn bigIntFromFloat(comptime signedness: std.builtin.Signedness, resul
6666
6767 // sign implicit fraction
6868 const significand_bits = 1 + math.floatFractionalBits(@TypeOf(a));
69 const I = @Type(comptime .{ .int = .{
70 .signedness = signedness,
71 .bits = @as(u16, @intFromBool(signedness == .signed)) + significand_bits,
72 } });
69 const I = @Int(signedness, @as(u16, @intFromBool(signedness == .signed)) + significand_bits);
7370
7471 const parts = math.frexp(a);
7572 const significand_bits_adjusted_to_handle_smin = @as(i32, significand_bits) +
lib/compiler_rt/memcpy.zig+1-1
......@@ -159,7 +159,7 @@ inline fn copyFixedLength(
159159 else if (len > @sizeOf(usize))
160160 @Vector(len, u8)
161161 else
162 @Type(.{ .int = .{ .signedness = .unsigned, .bits = len * 8 } });
162 @Int(.unsigned, len * 8);
163163
164164 const loop_count = @divExact(len, @sizeOf(T));
165165
lib/docs/wasm/main.zig+1-1
......@@ -41,7 +41,7 @@ pub fn panic(msg: []const u8, st: ?*std.builtin.StackTrace, addr: ?usize) noretu
4141
4242fn logFn(
4343 comptime message_level: log.Level,
44 comptime scope: @TypeOf(.enum_literal),
44 comptime scope: @EnumLiteral(),
4545 comptime format: []const u8,
4646 args: anytype,
4747) void {
lib/fuzzer.zig+1-1
......@@ -15,7 +15,7 @@ pub const std_options = std.Options{
1515
1616fn logOverride(
1717 comptime level: std.log.Level,
18 comptime scope: @Type(.enum_literal),
18 comptime scope: @EnumLiteral(),
1919 comptime format: []const u8,
2020 args: anytype,
2121) void {
lib/std/Build.zig+3-11
......@@ -416,7 +416,7 @@ fn createChildOnly(
416416fn userInputOptionsFromArgs(arena: Allocator, args: anytype) UserInputOptionsMap {
417417 var map = UserInputOptionsMap.init(arena);
418418 inline for (@typeInfo(@TypeOf(args)).@"struct".fields) |field| {
419 if (field.type == @Type(.null)) continue;
419 if (field.type == @TypeOf(null)) continue;
420420 addUserInputOptionFromArg(arena, &map, field, field.type, @field(args, field.name));
421421 }
422422 return map;
......@@ -526,16 +526,11 @@ fn addUserInputOptionFromArg(
526526 .pointer => |ptr_info| switch (ptr_info.size) {
527527 .one => switch (@typeInfo(ptr_info.child)) {
528528 .array => |array_info| {
529 comptime var slice_info = ptr_info;
530 slice_info.size = .slice;
531 slice_info.is_const = true;
532 slice_info.child = array_info.child;
533 slice_info.sentinel_ptr = null;
534529 addUserInputOptionFromArg(
535530 arena,
536531 map,
537532 field,
538 @Type(.{ .pointer = slice_info }),
533 @Pointer(.slice, .{ .@"const" = true }, array_info.child, null),
539534 maybe_value orelse null,
540535 );
541536 return;
......@@ -553,14 +548,11 @@ fn addUserInputOptionFromArg(
553548 }) catch @panic("OOM");
554549 },
555550 else => {
556 comptime var slice_info = ptr_info;
557 slice_info.is_const = true;
558 slice_info.sentinel_ptr = null;
559551 addUserInputOptionFromArg(
560552 arena,
561553 map,
562554 field,
563 @Type(.{ .pointer = slice_info }),
555 @Pointer(ptr_info.size, .{ .@"const" = true }, ptr_info.child, null),
564556 maybe_value orelse null,
565557 );
566558 return;
lib/std/Io.zig+8-32
......@@ -528,23 +528,7 @@ pub fn Poller(comptime StreamEnum: type) type {
528528/// Given an enum, returns a struct with fields of that enum, each field
529529/// representing an I/O stream for polling.
530530pub fn PollFiles(comptime StreamEnum: type) type {
531 const enum_fields = @typeInfo(StreamEnum).@"enum".fields;
532 var struct_fields: [enum_fields.len]std.builtin.Type.StructField = undefined;
533 for (&struct_fields, enum_fields) |*struct_field, enum_field| {
534 struct_field.* = .{
535 .name = enum_field.name,
536 .type = std.fs.File,
537 .default_value_ptr = null,
538 .is_comptime = false,
539 .alignment = @alignOf(std.fs.File),
540 };
541 }
542 return @Type(.{ .@"struct" = .{
543 .layout = .auto,
544 .fields = &struct_fields,
545 .decls = &.{},
546 .is_tuple = false,
547 } });
531 return @Struct(.auto, null, std.meta.fieldNames(StreamEnum), &@splat(std.fs.File), &@splat(.{}));
548532}
549533
550534test {
......@@ -1625,22 +1609,14 @@ pub fn sleep(io: Io, duration: Duration, clock: Clock) SleepError!void {
16251609/// fields, each field type the future's result.
16261610pub fn SelectUnion(S: type) type {
16271611 const struct_fields = @typeInfo(S).@"struct".fields;
1628 var fields: [struct_fields.len]std.builtin.Type.UnionField = undefined;
1629 for (&fields, struct_fields) |*union_field, struct_field| {
1630 const F = @typeInfo(struct_field.type).pointer.child;
1631 const Result = @TypeOf(@as(F, undefined).result);
1632 union_field.* = .{
1633 .name = struct_field.name,
1634 .type = Result,
1635 .alignment = struct_field.alignment,
1636 };
1612 var names: [struct_fields.len][]const u8 = undefined;
1613 var types: [struct_fields.len]type = undefined;
1614 for (struct_fields, &names, &types) |struct_field, *union_field_name, *UnionFieldType| {
1615 const FieldFuture = @typeInfo(struct_field.type).pointer.child;
1616 union_field_name.* = struct_field.name;
1617 UnionFieldType.* = @FieldType(FieldFuture, "result");
16371618 }
1638 return @Type(.{ .@"union" = .{
1639 .layout = .auto,
1640 .tag_type = std.meta.FieldEnum(S),
1641 .fields = &fields,
1642 .decls = &.{},
1643 } });
1619 return @Union(.auto, std.meta.FieldEnum(S), &names, &types, &@splat(.{}));
16441620}
16451621
16461622/// `s` is a struct with every field a `*Future(T)`, where `T` can be any type,
lib/std/Io/Reader.zig+5-8
......@@ -1273,20 +1273,17 @@ pub const TakeLeb128Error = Error || error{Overflow};
12731273/// Read a single LEB128 value as type T, or `error.Overflow` if the value cannot fit.
12741274pub fn takeLeb128(r: *Reader, comptime Result: type) TakeLeb128Error!Result {
12751275 const result_info = @typeInfo(Result).int;
1276 return std.math.cast(Result, try r.takeMultipleOf7Leb128(@Type(.{ .int = .{
1277 .signedness = result_info.signedness,
1278 .bits = std.mem.alignForwardAnyAlign(u16, result_info.bits, 7),
1279 } }))) orelse error.Overflow;
1276 return std.math.cast(Result, try r.takeMultipleOf7Leb128(@Int(
1277 result_info.signedness,
1278 std.mem.alignForwardAnyAlign(u16, result_info.bits, 7),
1279 ))) orelse error.Overflow;
12801280}
12811281
12821282fn takeMultipleOf7Leb128(r: *Reader, comptime Result: type) TakeLeb128Error!Result {
12831283 const result_info = @typeInfo(Result).int;
12841284 comptime assert(result_info.bits % 7 == 0);
12851285 var remaining_bits: std.math.Log2IntCeil(Result) = result_info.bits;
1286 const UnsignedResult = @Type(.{ .int = .{
1287 .signedness = .unsigned,
1288 .bits = result_info.bits,
1289 } });
1286 const UnsignedResult = @Int(.unsigned, result_info.bits);
12901287 var result: UnsignedResult = 0;
12911288 var fits = true;
12921289 while (true) {
lib/std/Io/Writer.zig+10-10
......@@ -1890,7 +1890,7 @@ pub fn writeUleb128(w: *Writer, value: anytype) Error!void {
18901890 try w.writeLeb128(switch (@typeInfo(@TypeOf(value))) {
18911891 .comptime_int => @as(std.math.IntFittingRange(0, @abs(value)), value),
18921892 .int => |value_info| switch (value_info.signedness) {
1893 .signed => @as(@Type(.{ .int = .{ .signedness = .unsigned, .bits = value_info.bits -| 1 } }), @intCast(value)),
1893 .signed => @as(@Int(.unsigned, value_info.bits -| 1), @intCast(value)),
18941894 .unsigned => value,
18951895 },
18961896 else => comptime unreachable,
......@@ -1903,7 +1903,7 @@ pub fn writeSleb128(w: *Writer, value: anytype) Error!void {
19031903 .comptime_int => @as(std.math.IntFittingRange(@min(value, -1), @max(0, value)), value),
19041904 .int => |value_info| switch (value_info.signedness) {
19051905 .signed => value,
1906 .unsigned => @as(@Type(.{ .int = .{ .signedness = .signed, .bits = value_info.bits + 1 } }), value),
1906 .unsigned => @as(@Int(.signed, value_info.bits + 1), value),
19071907 },
19081908 else => comptime unreachable,
19091909 });
......@@ -1912,10 +1912,10 @@ pub fn writeSleb128(w: *Writer, value: anytype) Error!void {
19121912/// Write a single integer as LEB128 to the given writer.
19131913pub fn writeLeb128(w: *Writer, value: anytype) Error!void {
19141914 const value_info = @typeInfo(@TypeOf(value)).int;
1915 try w.writeMultipleOf7Leb128(@as(@Type(.{ .int = .{
1916 .signedness = value_info.signedness,
1917 .bits = @max(std.mem.alignForwardAnyAlign(u16, value_info.bits, 7), 7),
1918 } }), value));
1915 try w.writeMultipleOf7Leb128(@as(@Int(
1916 value_info.signedness,
1917 @max(std.mem.alignForwardAnyAlign(u16, value_info.bits, 7), 7),
1918 ), value));
19191919}
19201920
19211921fn writeMultipleOf7Leb128(w: *Writer, value: anytype) Error!void {
......@@ -1929,10 +1929,10 @@ fn writeMultipleOf7Leb128(w: *Writer, value: anytype) Error!void {
19291929 .unsigned => remaining > std.math.maxInt(u7),
19301930 };
19311931 byte.* = .{
1932 .bits = @bitCast(@as(@Type(.{ .int = .{
1933 .signedness = value_info.signedness,
1934 .bits = 7,
1935 } }), @truncate(remaining))),
1932 .bits = @bitCast(@as(
1933 @Int(value_info.signedness, 7),
1934 @truncate(remaining),
1935 )),
19361936 .more = more,
19371937 };
19381938 if (value_info.bits > 7) remaining >>= 7;
lib/std/crypto/phc_encoding.zig+4-4
......@@ -94,12 +94,12 @@ pub fn deserialize(comptime HashResult: type, str: []const u8) Error!HashResult
9494 if (kvSplit(field)) |opt_version| {
9595 if (mem.eql(u8, opt_version.key, version_param_name)) {
9696 if (@hasField(HashResult, "alg_version")) {
97 const value_type_info = switch (@typeInfo(@TypeOf(out.alg_version))) {
98 .optional => |opt| @typeInfo(opt.child),
99 else => |t| t,
97 const ValueType = switch (@typeInfo(@TypeOf(out.alg_version))) {
98 .optional => |opt| opt.child,
99 else => @TypeOf(out.alg_version),
100100 };
101101 out.alg_version = fmt.parseUnsigned(
102 @Type(value_type_info),
102 ValueType,
103103 opt_version.value,
104104 10,
105105 ) catch return Error.InvalidEncoding;
lib/std/crypto/tls.zig+1-1
......@@ -606,7 +606,7 @@ pub fn array(
606606 const elem_size = @divExact(@bitSizeOf(Elem), 8);
607607 var arr: [len_size + elem_size * elems.len]u8 = undefined;
608608 std.mem.writeInt(Len, arr[0..len_size], @intCast(elem_size * elems.len), .big);
609 const ElemInt = @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(Elem) } });
609 const ElemInt = @Int(.unsigned, @bitSizeOf(Elem));
610610 for (0.., @as([elems.len]Elem, elems)) |index, elem| {
611611 std.mem.writeInt(
612612 ElemInt,
lib/std/enums.zig+11-29
......@@ -33,22 +33,8 @@ pub fn fromInt(comptime E: type, integer: anytype) ?E {
3333/// default, which may be undefined.
3434pub fn EnumFieldStruct(comptime E: type, comptime Data: type, comptime field_default: ?Data) type {
3535 @setEvalBranchQuota(@typeInfo(E).@"enum".fields.len + eval_branch_quota_cushion);
36 var struct_fields: [@typeInfo(E).@"enum".fields.len]std.builtin.Type.StructField = undefined;
37 for (&struct_fields, @typeInfo(E).@"enum".fields) |*struct_field, enum_field| {
38 struct_field.* = .{
39 .name = enum_field.name,
40 .type = Data,
41 .default_value_ptr = if (field_default) |d| @as(?*const anyopaque, @ptrCast(&d)) else null,
42 .is_comptime = false,
43 .alignment = if (@sizeOf(Data) > 0) @alignOf(Data) else 0,
44 };
45 }
46 return @Type(.{ .@"struct" = .{
47 .layout = .auto,
48 .fields = &struct_fields,
49 .decls = &.{},
50 .is_tuple = false,
51 } });
36 const default_ptr: ?*const anyopaque = if (field_default) |d| @ptrCast(&d) else null;
37 return @Struct(.auto, null, std.meta.fieldNames(E), &@splat(Data), &@splat(.{ .default_value_ptr = default_ptr }));
5238}
5339
5440/// Looks up the supplied fields in the given enum type.
......@@ -1532,19 +1518,15 @@ test "EnumIndexer empty" {
15321518test "EnumIndexer large dense unsorted" {
15331519 @setEvalBranchQuota(500_000); // many `comptimePrint`s
15341520 // Make an enum with 500 fields with values in *descending* order.
1535 const E = @Type(.{ .@"enum" = .{
1536 .tag_type = u32,
1537 .fields = comptime fields: {
1538 var fields: [500]EnumField = undefined;
1539 for (&fields, 0..) |*f, i| f.* = .{
1540 .name = std.fmt.comptimePrint("f{d}", .{i}),
1541 .value = 500 - i,
1542 };
1543 break :fields &fields;
1544 },
1545 .decls = &.{},
1546 .is_exhaustive = true,
1547 } });
1521 const E = @Enum(u32, .exhaustive, names: {
1522 var names: [500][]const u8 = undefined;
1523 for (&names, 0..) |*name, i| name.* = std.fmt.comptimePrint("f{d}", .{i});
1524 break :names &names;
1525 }, vals: {
1526 var vals: [500]u32 = undefined;
1527 for (&vals, 0..) |*val, i| val.* = 500 - i;
1528 break :vals &vals;
1529 });
15481530 const Indexer = EnumIndexer(E);
15491531 try testing.expectEqual(E.f0, Indexer.keyForIndex(499));
15501532 try testing.expectEqual(E.f499, Indexer.keyForIndex(0));
lib/std/fmt.zig+1-1
......@@ -279,7 +279,7 @@ pub fn Alt(
279279/// Helper for calling alternate format methods besides one named "format".
280280pub fn alt(
281281 context: anytype,
282 comptime func_name: @TypeOf(.enum_literal),
282 comptime func_name: @EnumLiteral(),
283283) Alt(@TypeOf(context), @field(@TypeOf(context), @tagName(func_name))) {
284284 return .{ .data = context };
285285}
lib/std/fmt/float.zig+2-2
......@@ -61,7 +61,7 @@ pub fn render(buf: []u8, value: anytype, options: Options) Error![]const u8 {
6161
6262 const T = @TypeOf(v);
6363 comptime std.debug.assert(@typeInfo(T) == .float);
64 const I = @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(T) } });
64 const I = @Int(.unsigned, @bitSizeOf(T));
6565
6666 const DT = if (@bitSizeOf(T) <= 64) u64 else u128;
6767 const tables = switch (DT) {
......@@ -1516,7 +1516,7 @@ const FLOAT128_POW5_INV_ERRORS: [154]u64 = .{
15161516const builtin = @import("builtin");
15171517
15181518fn check(comptime T: type, value: T, comptime expected: []const u8) !void {
1519 const I = @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(T) } });
1519 const I = @Int(.unsigned, @bitSizeOf(T));
15201520
15211521 var buf: [6000]u8 = undefined;
15221522 const value_bits: I = @bitCast(value);
lib/std/hash.zig+1-1
......@@ -42,7 +42,7 @@ pub fn int(input: anytype) @TypeOf(input) {
4242 const info = @typeInfo(@TypeOf(input)).int;
4343 const bits = info.bits;
4444 // Convert input to unsigned integer (easier to deal with)
45 const Uint = @Type(.{ .int = .{ .bits = bits, .signedness = .unsigned } });
45 const Uint = @Int(.unsigned, bits);
4646 const u_input: Uint = @bitCast(input);
4747 if (bits > 256) @compileError("bit widths > 256 are unsupported, use std.hash.autoHash functionality.");
4848 // For bit widths that don't have a dedicated function, use a heuristic
lib/std/hash/auto_hash.zig+1-4
......@@ -91,10 +91,7 @@ pub fn hash(hasher: anytype, key: anytype, comptime strat: HashStrategy) void {
9191 // Help the optimizer see that hashing an int is easy by inlining!
9292 // TODO Check if the situation is better after #561 is resolved.
9393 .int => |int| switch (int.signedness) {
94 .signed => hash(hasher, @as(@Type(.{ .int = .{
95 .bits = int.bits,
96 .signedness = .unsigned,
97 } }), @bitCast(key)), strat),
94 .signed => hash(hasher, @as(@Int(.unsigned, int.bits), @bitCast(key)), strat),
9895 .unsigned => {
9996 if (std.meta.hasUniqueRepresentation(Key)) {
10097 @call(.always_inline, Hasher.update, .{ hasher, std.mem.asBytes(&key) });
lib/std/log.zig+5-5
......@@ -57,13 +57,13 @@ pub const default_level: Level = switch (builtin.mode) {
5757};
5858
5959pub const ScopeLevel = struct {
60 scope: @Type(.enum_literal),
60 scope: @EnumLiteral(),
6161 level: Level,
6262};
6363
6464fn log(
6565 comptime level: Level,
66 comptime scope: @Type(.enum_literal),
66 comptime scope: @EnumLiteral(),
6767 comptime format: []const u8,
6868 args: anytype,
6969) void {
......@@ -73,7 +73,7 @@ fn log(
7373}
7474
7575/// Determine if a specific log message level and scope combination are enabled for logging.
76pub fn logEnabled(comptime level: Level, comptime scope: @Type(.enum_literal)) bool {
76pub fn logEnabled(comptime level: Level, comptime scope: @EnumLiteral()) bool {
7777 inline for (std.options.log_scope_levels) |scope_level| {
7878 if (scope_level.scope == scope) return @intFromEnum(level) <= @intFromEnum(scope_level.level);
7979 }
......@@ -87,7 +87,7 @@ pub fn logEnabled(comptime level: Level, comptime scope: @Type(.enum_literal)) b
8787/// function returns.
8888pub fn defaultLog(
8989 comptime level: Level,
90 comptime scope: @Type(.enum_literal),
90 comptime scope: @EnumLiteral(),
9191 comptime format: []const u8,
9292 args: anytype,
9393) void {
......@@ -115,7 +115,7 @@ pub fn defaultLog(
115115
116116/// Returns a scoped logging namespace that logs all messages using the scope
117117/// provided here.
118pub fn scoped(comptime scope: @Type(.enum_literal)) type {
118pub fn scoped(comptime scope: @EnumLiteral()) type {
119119 return struct {
120120 /// Log an error message. This log level is intended to be used
121121 /// when something has gone wrong. This might be recoverable or might
lib/std/math.zig+13-13
......@@ -450,12 +450,7 @@ pub fn wrap(x: anytype, r: anytype) @TypeOf(x) {
450450 // in the rare usecase of r not being comptime_int or float,
451451 // take the penalty of having an intermediary type conversion,
452452 // otherwise the alternative is to unwind iteratively to avoid overflow
453 const R = comptime do: {
454 var info = info_r;
455 info.int.bits += 1;
456 info.int.signedness = .signed;
457 break :do @Type(info);
458 };
453 const R = @Int(.signed, info_r.int.bits + 1);
459454 const radius: if (info_r.int.signedness == .signed) @TypeOf(r) else R = r;
460455 return @intCast(@mod(x - radius, 2 * @as(R, r)) - r); // provably impossible to overflow
461456 },
......@@ -799,14 +794,14 @@ pub fn Log2IntCeil(comptime T: type) type {
799794pub fn IntFittingRange(comptime from: comptime_int, comptime to: comptime_int) type {
800795 assert(from <= to);
801796 const signedness: std.builtin.Signedness = if (from < 0) .signed else .unsigned;
802 return @Type(.{ .int = .{
803 .signedness = signedness,
804 .bits = @as(u16, @intFromBool(signedness == .signed)) +
797 return @Int(
798 signedness,
799 @as(u16, @intFromBool(signedness == .signed)) +
805800 switch (if (from < 0) @max(@abs(from) - 1, to) else to) {
806801 0 => 0,
807802 else => |pos_max| 1 + log2(pos_max),
808803 },
809 } });
804 );
810805}
811806
812807test IntFittingRange {
......@@ -1107,9 +1102,14 @@ test cast {
11071102pub const AlignCastError = error{UnalignedMemory};
11081103
11091104fn AlignCastResult(comptime alignment: Alignment, comptime Ptr: type) type {
1110 var ptr_info = @typeInfo(Ptr);
1111 ptr_info.pointer.alignment = alignment.toByteUnits();
1112 return @Type(ptr_info);
1105 const orig = @typeInfo(Ptr).pointer;
1106 return @Pointer(orig.size, .{
1107 .@"const" = orig.is_const,
1108 .@"volatile" = orig.is_volatile,
1109 .@"allowzero" = orig.is_allowzero,
1110 .@"align" = alignment.toByteUnits(),
1111 .@"addrspace" = orig.address_space,
1112 }, orig.child, orig.sentinel());
11131113}
11141114
11151115/// Align cast a pointer but return an error if it's the wrong alignment
lib/std/math/big/int_test.zig+2-2
......@@ -2787,11 +2787,11 @@ test "bitNotWrap more than two limbs" {
27872787 const bits = @bitSizeOf(Limb) * 4 + 2;
27882788
27892789 try res.bitNotWrap(&a, .unsigned, bits);
2790 const Unsigned = @Type(.{ .int = .{ .signedness = .unsigned, .bits = bits } });
2790 const Unsigned = @Int(.unsigned, bits);
27912791 try testing.expectEqual((try res.toInt(Unsigned)), ~@as(Unsigned, maxInt(Limb)));
27922792
27932793 try res.bitNotWrap(&a, .signed, bits);
2794 const Signed = @Type(.{ .int = .{ .signedness = .signed, .bits = bits } });
2794 const Signed = @Int(.signed, bits);
27952795 try testing.expectEqual((try res.toInt(Signed)), ~@as(Signed, maxInt(Limb)));
27962796}
27972797
lib/std/math/float.zig+8-26
......@@ -14,22 +14,10 @@ pub fn FloatRepr(comptime Float: type) type {
1414 exponent: BiasedExponent,
1515 sign: std.math.Sign,
1616
17 pub const StoredMantissa = @Type(.{ .int = .{
18 .signedness = .unsigned,
19 .bits = floatMantissaBits(Float),
20 } });
21 pub const Mantissa = @Type(.{ .int = .{
22 .signedness = .unsigned,
23 .bits = 1 + fractional_bits,
24 } });
25 pub const Exponent = @Type(.{ .int = .{
26 .signedness = .signed,
27 .bits = exponent_bits,
28 } });
29 pub const BiasedExponent = enum(@Type(.{ .int = .{
30 .signedness = .unsigned,
31 .bits = exponent_bits,
32 } })) {
17 pub const StoredMantissa = @Int(.unsigned, floatMantissaBits(Float));
18 pub const Mantissa = @Int(.unsigned, 1 + fractional_bits);
19 pub const Exponent = @Int(.signed, exponent_bits);
20 pub const BiasedExponent = enum(@Int(.unsigned, exponent_bits)) {
3321 denormal = 0,
3422 min_normal = 1,
3523 zero = (1 << (exponent_bits - 1)) - 1,
......@@ -56,14 +44,8 @@ pub fn FloatRepr(comptime Float: type) type {
5644 fraction: Fraction,
5745 exponent: Normalized.Exponent,
5846
59 pub const Fraction = @Type(.{ .int = .{
60 .signedness = .unsigned,
61 .bits = fractional_bits,
62 } });
63 pub const Exponent = @Type(.{ .int = .{
64 .signedness = .signed,
65 .bits = 1 + exponent_bits,
66 } });
47 pub const Fraction = @Int(.unsigned, fractional_bits);
48 pub const Exponent = @Int(.signed, 1 + exponent_bits);
6749
6850 /// This currently truncates denormal values, which needs to be fixed before this can be used to
6951 /// produce a rounded value.
......@@ -122,7 +104,7 @@ inline fn mantissaOne(comptime T: type) comptime_int {
122104
123105/// Creates floating point type T from an unbiased exponent and raw mantissa.
124106inline fn reconstructFloat(comptime T: type, comptime exponent: comptime_int, comptime mantissa: comptime_int) T {
125 const TBits = @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(T) } });
107 const TBits = @Int(.unsigned, @bitSizeOf(T));
126108 const biased_exponent = @as(TBits, exponent + floatExponentMax(T));
127109 return @as(T, @bitCast((biased_exponent << floatMantissaBits(T)) | @as(TBits, mantissa)));
128110}
......@@ -209,7 +191,7 @@ pub inline fn floatEps(comptime T: type) T {
209191pub inline fn floatEpsAt(comptime T: type, x: T) T {
210192 switch (@typeInfo(T)) {
211193 .float => |F| {
212 const U: type = @Type(.{ .int = .{ .signedness = .unsigned, .bits = F.bits } });
194 const U: type = @Int(.unsigned, F.bits);
213195 const u: U = @bitCast(x);
214196 const y: T = @bitCast(u ^ 1);
215197 return @abs(x - y);
lib/std/math/log2.zig+1-4
......@@ -33,10 +33,7 @@ pub fn log2(x: anytype) @TypeOf(x) {
3333 return result;
3434 },
3535 .int => |int_info| math.log2_int(switch (int_info.signedness) {
36 .signed => @Type(.{ .int = .{
37 .signedness = .unsigned,
38 .bits = int_info.bits -| 1,
39 } }),
36 .signed => @Int(.unsigned, int_info.bits -| 1),
4037 .unsigned => T,
4138 }, @intCast(x)),
4239 else => @compileError("log2 not implemented for " ++ @typeName(T)),
lib/std/math/log_int.zig+1-1
......@@ -65,7 +65,7 @@ test "log_int" {
6565 // Test all unsigned integers with 2, 3, ..., 64 bits.
6666 // We cannot test 0 or 1 bits since base must be > 1.
6767 inline for (2..64 + 1) |bits| {
68 const T = @Type(.{ .int = .{ .signedness = .unsigned, .bits = @intCast(bits) } });
68 const T = @Int(.unsigned, @intCast(bits));
6969
7070 // for base = 2, 3, ..., min(maxInt(T),1024)
7171 var base: T = 1;
lib/std/math/signbit.zig+1-4
......@@ -6,10 +6,7 @@ const expect = std.testing.expect;
66pub fn signbit(x: anytype) bool {
77 return switch (@typeInfo(@TypeOf(x))) {
88 .int, .comptime_int => x,
9 .float => |float| @as(@Type(.{ .int = .{
10 .signedness = .signed,
11 .bits = float.bits,
12 } }), @bitCast(x)),
9 .float => |float| @as(@Int(.signed, float.bits), @bitCast(x)),
1310 .comptime_float => @as(i128, @bitCast(@as(f128, x))), // any float type will do
1411 else => @compileError("std.math.signbit does not support " ++ @typeName(@TypeOf(x))),
1512 } < 0;
lib/std/math/sqrt.zig+1-1
......@@ -80,7 +80,7 @@ test sqrt_int {
8080/// Returns the return type `sqrt` will return given an operand of type `T`.
8181pub fn Sqrt(comptime T: type) type {
8282 return switch (@typeInfo(T)) {
83 .int => |int| @Type(.{ .int = .{ .signedness = .unsigned, .bits = (int.bits + 1) / 2 } }),
83 .int => |int| @Int(.unsigned, (int.bits + 1) / 2),
8484 else => T,
8585 };
8686}
lib/std/mem.zig+57-106
......@@ -846,17 +846,18 @@ fn Span(comptime T: type) type {
846846 return ?Span(optional_info.child);
847847 },
848848 .pointer => |ptr_info| {
849 var new_ptr_info = ptr_info;
850 switch (ptr_info.size) {
851 .c => {
852 new_ptr_info.sentinel_ptr = &@as(ptr_info.child, 0);
853 new_ptr_info.is_allowzero = false;
854 },
855 .many => if (ptr_info.sentinel() == null) @compileError("invalid type given to std.mem.span: " ++ @typeName(T)),
849 const new_sentinel: ?ptr_info.child = switch (ptr_info.size) {
856850 .one, .slice => @compileError("invalid type given to std.mem.span: " ++ @typeName(T)),
857 }
858 new_ptr_info.size = .slice;
859 return @Type(.{ .pointer = new_ptr_info });
851 .many => ptr_info.sentinel() orelse @compileError("invalid type given to std.mem.span: " ++ @typeName(T)),
852 .c => 0,
853 };
854 return @Pointer(.slice, .{
855 .@"const" = ptr_info.is_const,
856 .@"volatile" = ptr_info.is_volatile,
857 .@"allowzero" = ptr_info.is_allowzero and ptr_info.size != .c,
858 .@"align" = ptr_info.alignment,
859 .@"addrspace" = ptr_info.address_space,
860 }, ptr_info.child, new_sentinel);
860861 },
861862 else => {},
862863 }
......@@ -910,45 +911,18 @@ fn SliceTo(comptime T: type, comptime end: std.meta.Elem(T)) type {
910911 return ?SliceTo(optional_info.child, end);
911912 },
912913 .pointer => |ptr_info| {
913 var new_ptr_info = ptr_info;
914 new_ptr_info.size = .slice;
915 switch (ptr_info.size) {
916 .one => switch (@typeInfo(ptr_info.child)) {
917 .array => |array_info| {
918 new_ptr_info.child = array_info.child;
919 // The return type must only be sentinel terminated if we are guaranteed
920 // to find the value searched for, which is only the case if it matches
921 // the sentinel of the type passed.
922 if (array_info.sentinel()) |s| {
923 if (end == s) {
924 new_ptr_info.sentinel_ptr = &end;
925 } else {
926 new_ptr_info.sentinel_ptr = null;
927 }
928 }
929 },
930 else => {},
931 },
932 .many, .slice => {
933 // The return type must only be sentinel terminated if we are guaranteed
934 // to find the value searched for, which is only the case if it matches
935 // the sentinel of the type passed.
936 if (ptr_info.sentinel()) |s| {
937 if (end == s) {
938 new_ptr_info.sentinel_ptr = &end;
939 } else {
940 new_ptr_info.sentinel_ptr = null;
941 }
942 }
943 },
944 .c => {
945 new_ptr_info.sentinel_ptr = &end;
946 // C pointers are always allowzero, but we don't want the return type to be.
947 assert(new_ptr_info.is_allowzero);
948 new_ptr_info.is_allowzero = false;
949 },
950 }
951 return @Type(.{ .pointer = new_ptr_info });
914 const Elem = std.meta.Elem(T);
915 const have_sentinel: bool = switch (ptr_info.size) {
916 .one, .slice, .many => if (std.meta.sentinel(T)) |s| s == end else false,
917 .c => false,
918 };
919 return @Pointer(.slice, .{
920 .@"const" = ptr_info.is_const,
921 .@"volatile" = ptr_info.is_volatile,
922 .@"allowzero" = ptr_info.is_allowzero and ptr_info.size != .c,
923 .@"align" = ptr_info.alignment,
924 .@"addrspace" = ptr_info.address_space,
925 }, Elem, if (have_sentinel) end else null);
952926 },
953927 else => {},
954928 }
......@@ -3951,38 +3925,25 @@ test reverse {
39513925 }
39523926}
39533927fn ReverseIterator(comptime T: type) type {
3954 const Pointer = blk: {
3955 switch (@typeInfo(T)) {
3956 .pointer => |ptr_info| switch (ptr_info.size) {
3957 .one => switch (@typeInfo(ptr_info.child)) {
3958 .array => |array_info| {
3959 var new_ptr_info = ptr_info;
3960 new_ptr_info.size = .many;
3961 new_ptr_info.child = array_info.child;
3962 new_ptr_info.sentinel_ptr = array_info.sentinel_ptr;
3963 break :blk @Type(.{ .pointer = new_ptr_info });
3964 },
3965 else => {},
3966 },
3967 .slice => {
3968 var new_ptr_info = ptr_info;
3969 new_ptr_info.size = .many;
3970 break :blk @Type(.{ .pointer = new_ptr_info });
3971 },
3972 else => {},
3973 },
3974 else => {},
3975 }
3976 @compileError("expected slice or pointer to array, found '" ++ @typeName(T) ++ "'");
3928 const ptr = switch (@typeInfo(T)) {
3929 .pointer => |ptr| ptr,
3930 else => @compileError("expected slice or pointer to array, found '" ++ @typeName(T) ++ "'"),
39773931 };
3978 const Element = std.meta.Elem(Pointer);
3979 const ElementPointer = @Type(.{ .pointer = ptr: {
3980 var ptr = @typeInfo(Pointer).pointer;
3981 ptr.size = .one;
3982 ptr.child = Element;
3983 ptr.sentinel_ptr = null;
3984 break :ptr ptr;
3985 } });
3932 switch (ptr.size) {
3933 .slice => {},
3934 .one => if (@typeInfo(ptr.child) != .array) @compileError("expected slice or pointer to array, found '" ++ @typeName(T) ++ "'"),
3935 .many, .c => @compileError("expected slice or pointer to array, found '" ++ @typeName(T) ++ "'"),
3936 }
3937 const Element = std.meta.Elem(T);
3938 const attrs: std.builtin.Type.Pointer.Attributes = .{
3939 .@"const" = ptr.is_const,
3940 .@"volatile" = ptr.is_volatile,
3941 .@"allowzero" = ptr.is_allowzero,
3942 .@"align" = ptr.alignment,
3943 .@"addrspace" = ptr.address_space,
3944 };
3945 const Pointer = @Pointer(.many, attrs, Element, std.meta.sentinel(T));
3946 const ElementPointer = @Pointer(.one, attrs, Element, null);
39863947 return struct {
39873948 ptr: Pointer,
39883949 index: usize,
......@@ -4342,19 +4303,14 @@ fn CopyPtrAttrs(
43424303 comptime size: std.builtin.Type.Pointer.Size,
43434304 comptime child: type,
43444305) type {
4345 const info = @typeInfo(source).pointer;
4346 return @Type(.{
4347 .pointer = .{
4348 .size = size,
4349 .is_const = info.is_const,
4350 .is_volatile = info.is_volatile,
4351 .is_allowzero = info.is_allowzero,
4352 .alignment = info.alignment,
4353 .address_space = info.address_space,
4354 .child = child,
4355 .sentinel_ptr = null,
4356 },
4357 });
4306 const ptr = @typeInfo(source).pointer;
4307 return @Pointer(size, .{
4308 .@"const" = ptr.is_const,
4309 .@"volatile" = ptr.is_volatile,
4310 .@"allowzero" = ptr.is_allowzero,
4311 .@"align" = ptr.alignment,
4312 .@"addrspace" = ptr.address_space,
4313 }, child, null);
43584314}
43594315
43604316fn AsBytesReturnType(comptime P: type) type {
......@@ -4936,19 +4892,14 @@ test "freeing empty string with null-terminated sentinel" {
49364892/// Returns a slice with the given new alignment,
49374893/// all other pointer attributes copied from `AttributeSource`.
49384894fn AlignedSlice(comptime AttributeSource: type, comptime new_alignment: usize) type {
4939 const info = @typeInfo(AttributeSource).pointer;
4940 return @Type(.{
4941 .pointer = .{
4942 .size = .slice,
4943 .is_const = info.is_const,
4944 .is_volatile = info.is_volatile,
4945 .is_allowzero = info.is_allowzero,
4946 .alignment = new_alignment,
4947 .address_space = info.address_space,
4948 .child = info.child,
4949 .sentinel_ptr = null,
4950 },
4951 });
4895 const ptr = @typeInfo(AttributeSource).pointer;
4896 return @Pointer(.slice, .{
4897 .@"const" = ptr.is_const,
4898 .@"volatile" = ptr.is_volatile,
4899 .@"allowzero" = ptr.is_allowzero,
4900 .@"align" = new_alignment,
4901 .@"addrspace" = ptr.address_space,
4902 }, ptr.child, null);
49524903}
49534904
49544905/// Returns the largest slice in the given bytes that conforms to the new alignment,
lib/std/meta.zig+52-136
......@@ -171,58 +171,34 @@ pub fn Sentinel(comptime T: type, comptime sentinel_val: Elem(T)) type {
171171 switch (@typeInfo(T)) {
172172 .pointer => |info| switch (info.size) {
173173 .one => switch (@typeInfo(info.child)) {
174 .array => |array_info| return @Type(.{
175 .pointer = .{
176 .size = info.size,
177 .is_const = info.is_const,
178 .is_volatile = info.is_volatile,
179 .alignment = info.alignment,
180 .address_space = info.address_space,
181 .child = @Type(.{
182 .array = .{
183 .len = array_info.len,
184 .child = array_info.child,
185 .sentinel_ptr = @as(?*const anyopaque, @ptrCast(&sentinel_val)),
186 },
187 }),
188 .is_allowzero = info.is_allowzero,
189 .sentinel_ptr = info.sentinel_ptr,
190 },
191 }),
174 .array => |array_info| return @Pointer(.one, .{
175 .@"const" = info.is_const,
176 .@"volatile" = info.is_volatile,
177 .@"allowzero" = info.is_allowzero,
178 .@"align" = info.alignment,
179 .@"addrspace" = info.address_space,
180 }, [array_info.len:sentinel_val]array_info.child, null),
192181 else => {},
193182 },
194 .many, .slice => return @Type(.{
195 .pointer = .{
196 .size = info.size,
197 .is_const = info.is_const,
198 .is_volatile = info.is_volatile,
199 .alignment = info.alignment,
200 .address_space = info.address_space,
201 .child = info.child,
202 .is_allowzero = info.is_allowzero,
203 .sentinel_ptr = @as(?*const anyopaque, @ptrCast(&sentinel_val)),
204 },
205 }),
183 .many, .slice => |size| return @Pointer(size, .{
184 .@"const" = info.is_const,
185 .@"volatile" = info.is_volatile,
186 .@"allowzero" = info.is_allowzero,
187 .@"align" = info.alignment,
188 .@"addrspace" = info.address_space,
189 }, info.child, sentinel_val),
206190 else => {},
207191 },
208192 .optional => |info| switch (@typeInfo(info.child)) {
209193 .pointer => |ptr_info| switch (ptr_info.size) {
210 .many => return @Type(.{
211 .optional = .{
212 .child = @Type(.{
213 .pointer = .{
214 .size = ptr_info.size,
215 .is_const = ptr_info.is_const,
216 .is_volatile = ptr_info.is_volatile,
217 .alignment = ptr_info.alignment,
218 .address_space = ptr_info.address_space,
219 .child = ptr_info.child,
220 .is_allowzero = ptr_info.is_allowzero,
221 .sentinel_ptr = @as(?*const anyopaque, @ptrCast(&sentinel_val)),
222 },
223 }),
224 },
225 }),
194 .many => return ?@Pointer(.many, .{
195 .@"const" = ptr_info.is_const,
196 .@"volatile" = ptr_info.is_volatile,
197 .@"allowzero" = ptr_info.is_allowzero,
198 .@"align" = ptr_info.alignment,
199 .@"addrspace" = ptr_info.address_space,
200 .child = ptr_info.child,
201 }, ptr_info.child, sentinel_val),
226202 else => {},
227203 },
228204 else => {},
......@@ -487,46 +463,22 @@ test tags {
487463
488464/// Returns an enum with a variant named after each field of `T`.
489465pub fn FieldEnum(comptime T: type) type {
490 const field_infos = fields(T);
491
492 if (field_infos.len == 0) {
493 return @Type(.{
494 .@"enum" = .{
495 .tag_type = u0,
496 .fields = &.{},
497 .decls = &.{},
498 .is_exhaustive = true,
499 },
500 });
501 }
466 const field_names = fieldNames(T);
502467
503 if (@typeInfo(T) == .@"union") {
504 if (@typeInfo(T).@"union".tag_type) |tag_type| {
505 for (std.enums.values(tag_type), 0..) |v, i| {
468 switch (@typeInfo(T)) {
469 .@"union" => |@"union"| if (@"union".tag_type) |EnumTag| {
470 for (std.enums.values(EnumTag), 0..) |v, i| {
506471 if (@intFromEnum(v) != i) break; // enum values not consecutive
507 if (!std.mem.eql(u8, @tagName(v), field_infos[i].name)) break; // fields out of order
472 if (!std.mem.eql(u8, @tagName(v), field_names[i])) break; // fields out of order
508473 } else {
509 return tag_type;
474 return EnumTag;
510475 }
511 }
476 },
477 else => {},
512478 }
513479
514 var enumFields: [field_infos.len]std.builtin.Type.EnumField = undefined;
515 var decls = [_]std.builtin.Type.Declaration{};
516 inline for (field_infos, 0..) |field, i| {
517 enumFields[i] = .{
518 .name = field.name,
519 .value = i,
520 };
521 }
522 return @Type(.{
523 .@"enum" = .{
524 .tag_type = std.math.IntFittingRange(0, field_infos.len - 1),
525 .fields = &enumFields,
526 .decls = &decls,
527 .is_exhaustive = true,
528 },
529 });
480 const IntTag = std.math.IntFittingRange(0, field_names.len -| 1);
481 return @Enum(IntTag, .exhaustive, field_names, &std.simd.iota(IntTag, field_names.len));
530482}
531483
532484fn expectEqualEnum(expected: anytype, actual: @TypeOf(expected)) !void {
......@@ -583,20 +535,11 @@ test FieldEnum {
583535}
584536
585537pub fn DeclEnum(comptime T: type) type {
586 const fieldInfos = std.meta.declarations(T);
587 var enumDecls: [fieldInfos.len]std.builtin.Type.EnumField = undefined;
588 var decls = [_]std.builtin.Type.Declaration{};
589 inline for (fieldInfos, 0..) |field, i| {
590 enumDecls[i] = .{ .name = field.name, .value = i };
591 }
592 return @Type(.{
593 .@"enum" = .{
594 .tag_type = std.math.IntFittingRange(0, if (fieldInfos.len == 0) 0 else fieldInfos.len - 1),
595 .fields = &enumDecls,
596 .decls = &decls,
597 .is_exhaustive = true,
598 },
599 });
538 const decls = declarations(T);
539 var names: [decls.len][]const u8 = undefined;
540 for (&names, decls) |*name, decl| name.* = decl.name;
541 const IntTag = std.math.IntFittingRange(0, decls.len -| 1);
542 return @Enum(IntTag, .exhaustive, &names, &std.simd.iota(IntTag, decls.len));
600543}
601544
602545test DeclEnum {
......@@ -868,25 +811,26 @@ pub fn declList(comptime Namespace: type, comptime Decl: type) []const *const De
868811 }
869812}
870813
814/// Deprecated: use @Int
871815pub fn Int(comptime signedness: std.builtin.Signedness, comptime bit_count: u16) type {
872 return @Type(.{
873 .int = .{
874 .signedness = signedness,
875 .bits = bit_count,
876 },
877 });
816 return @Int(signedness, bit_count);
878817}
879818
880819pub fn Float(comptime bit_count: u8) type {
881 return @Type(.{
882 .float = .{ .bits = bit_count },
883 });
820 return switch (bit_count) {
821 16 => f16,
822 32 => f32,
823 64 => f64,
824 80 => f80,
825 128 => f128,
826 else => @compileError("invalid float bit count"),
827 };
884828}
885
886829test Float {
887830 try testing.expectEqual(f16, Float(16));
888831 try testing.expectEqual(f32, Float(32));
889832 try testing.expectEqual(f64, Float(64));
833 try testing.expectEqual(f80, Float(80));
890834 try testing.expectEqual(f128, Float(128));
891835}
892836
......@@ -912,42 +856,14 @@ pub fn ArgsTuple(comptime Function: type) type {
912856 argument_field_list[i] = T;
913857 }
914858
915 return CreateUniqueTuple(argument_field_list.len, argument_field_list);
859 return Tuple(&argument_field_list);
916860}
917861
918/// For a given anonymous list of types, returns a new tuple type
919/// with those types as fields.
862/// Deprecated; use `@Tuple` instead.
920863///
921/// Examples:
922/// - `Tuple(&[_]type {})` ⇒ `tuple { }`
923/// - `Tuple(&[_]type {f32})` ⇒ `tuple { f32 }`
924/// - `Tuple(&[_]type {f32,u32})` ⇒ `tuple { f32, u32 }`
864/// To be removed after Zig 0.16.0 releases.
925865pub fn Tuple(comptime types: []const type) type {
926 return CreateUniqueTuple(types.len, types[0..types.len].*);
927}
928
929fn CreateUniqueTuple(comptime N: comptime_int, comptime types: [N]type) type {
930 var tuple_fields: [types.len]std.builtin.Type.StructField = undefined;
931 inline for (types, 0..) |T, i| {
932 @setEvalBranchQuota(10_000);
933 var num_buf: [128]u8 = undefined;
934 tuple_fields[i] = .{
935 .name = std.fmt.bufPrintSentinel(&num_buf, "{d}", .{i}, 0) catch unreachable,
936 .type = T,
937 .default_value_ptr = null,
938 .is_comptime = false,
939 .alignment = @alignOf(T),
940 };
941 }
942
943 return @Type(.{
944 .@"struct" = .{
945 .is_tuple = true,
946 .layout = .auto,
947 .decls = &.{},
948 .fields = &tuple_fields,
949 },
950 });
866 return @Tuple(types);
951867}
952868
953869const TupleTester = struct {
lib/std/meta/trailer_flags.zig+9-17
......@@ -20,24 +20,16 @@ pub fn TrailerFlags(comptime Fields: type) type {
2020
2121 pub const ActiveFields = std.enums.EnumFieldStruct(FieldEnum, bool, false);
2222 pub const FieldValues = blk: {
23 var fields: [bit_count]Type.StructField = undefined;
24 for (@typeInfo(Fields).@"struct".fields, 0..) |struct_field, i| {
25 fields[i] = Type.StructField{
26 .name = struct_field.name,
27 .type = ?struct_field.type,
28 .default_value_ptr = &@as(?struct_field.type, null),
29 .is_comptime = false,
30 .alignment = @alignOf(?struct_field.type),
31 };
23 var field_names: [bit_count][]const u8 = undefined;
24 var field_types: [bit_count]type = undefined;
25 var field_attrs: [bit_count]std.builtin.Type.StructField.Attributes = undefined;
26 for (@typeInfo(Fields).@"struct".fields, &field_names, &field_types, &field_attrs) |field, *new_name, *NewType, *new_attrs| {
27 new_name.* = field.name;
28 NewType.* = ?field.type;
29 const default: ?field.type = null;
30 new_attrs.* = .{ .default_value_ptr = &default };
3231 }
33 break :blk @Type(.{
34 .@"struct" = .{
35 .layout = .auto,
36 .fields = &fields,
37 .decls = &.{},
38 .is_tuple = false,
39 },
40 });
32 break :blk @Struct(.auto, null, &field_names, &field_types, &field_attrs);
4133 };
4234
4335 pub const Self = @This();
lib/std/multi_array_list.zig+26-37
......@@ -32,12 +32,17 @@ pub fn MultiArrayList(comptime T: type) type {
3232 const Elem = switch (@typeInfo(T)) {
3333 .@"struct" => T,
3434 .@"union" => |u| struct {
35 pub const Bare = @Type(.{ .@"union" = .{
36 .layout = u.layout,
37 .tag_type = null,
38 .fields = u.fields,
39 .decls = &.{},
40 } });
35 pub const Bare = Bare: {
36 var field_names: [u.fields.len][]const u8 = undefined;
37 var field_types: [u.fields.len]type = undefined;
38 var field_attrs: [u.fields.len]std.builtin.Type.UnionField.Attributes = undefined;
39 for (u.fields, &field_names, &field_types, &field_attrs) |field, *name, *Type, *attrs| {
40 name.* = field.name;
41 Type.* = field.type;
42 attrs.* = .{ .@"align" = field.alignment };
43 }
44 break :Bare @Union(u.layout, null, &field_names, &field_types, &field_attrs);
45 };
4146 pub const Tag =
4247 u.tag_type orelse @compileError("MultiArrayList does not support untagged unions");
4348 tags: Tag,
......@@ -609,20 +614,18 @@ pub fn MultiArrayList(comptime T: type) type {
609614 }
610615
611616 const Entry = entry: {
612 var entry_fields: [fields.len]std.builtin.Type.StructField = undefined;
613 for (&entry_fields, sizes.fields) |*entry_field, i| entry_field.* = .{
614 .name = fields[i].name ++ "_ptr",
615 .type = *fields[i].type,
616 .default_value_ptr = null,
617 .is_comptime = fields[i].is_comptime,
618 .alignment = fields[i].alignment,
619 };
620 break :entry @Type(.{ .@"struct" = .{
621 .layout = .@"extern",
622 .fields = &entry_fields,
623 .decls = &.{},
624 .is_tuple = false,
625 } });
617 var field_names: [fields.len][]const u8 = undefined;
618 var field_types: [fields.len]type = undefined;
619 var field_attrs: [fields.len]std.builtin.Type.StructField.Attributes = undefined;
620 for (sizes.fields, &field_names, &field_types, &field_attrs) |i, *name, *Type, *attrs| {
621 name.* = fields[i].name ++ "_ptr";
622 Type.* = *fields[i].type;
623 attrs.* = .{
624 .@"comptime" = fields[i].is_comptime,
625 .@"align" = fields[i].alignment,
626 };
627 }
628 break :entry @Struct(.@"extern", null, &field_names, &field_types, &field_attrs);
626629 };
627630 /// This function is used in the debugger pretty formatters in tools/ to fetch the
628631 /// child field order and entry type to facilitate fancy debug printing for this type.
......@@ -1023,23 +1026,9 @@ test "struct with many fields" {
10231026 const ManyFields = struct {
10241027 fn Type(count: comptime_int) type {
10251028 @setEvalBranchQuota(50000);
1026 var fields: [count]std.builtin.Type.StructField = undefined;
1027 for (0..count) |i| {
1028 fields[i] = .{
1029 .name = std.fmt.comptimePrint("a{}", .{i}),
1030 .type = u32,
1031 .default_value_ptr = null,
1032 .is_comptime = false,
1033 .alignment = @alignOf(u32),
1034 };
1035 }
1036 const info: std.builtin.Type = .{ .@"struct" = .{
1037 .layout = .auto,
1038 .fields = &fields,
1039 .decls = &.{},
1040 .is_tuple = false,
1041 } };
1042 return @Type(info);
1029 var field_names: [count][]const u8 = undefined;
1030 for (&field_names, 0..) |*n, i| n.* = std.fmt.comptimePrint("a{d}", .{i});
1031 return @Struct(.@"extern", null, &field_names, &@splat(u32), &@splat(.{}));
10431032 }
10441033
10451034 fn doTest(ally: std.mem.Allocator, count: comptime_int) !void {
lib/std/std.zig+1-1
......@@ -124,7 +124,7 @@ pub const Options = struct {
124124
125125 logFn: fn (
126126 comptime message_level: log.Level,
127 comptime scope: @TypeOf(.enum_literal),
127 comptime scope: @EnumLiteral(),
128128 comptime format: []const u8,
129129 args: anytype,
130130 ) void = log.defaultLog,
lib/std/zig/c_translation/helpers.zig+10-18
......@@ -81,23 +81,15 @@ fn ToUnsigned(comptime T: type) type {
8181}
8282
8383/// Constructs a [*c] pointer with the const and volatile annotations
84/// from SelfType for pointing to a C flexible array of ElementType.
85pub fn FlexibleArrayType(comptime SelfType: type, comptime ElementType: type) type {
86 switch (@typeInfo(SelfType)) {
87 .pointer => |ptr| {
88 return @Type(.{ .pointer = .{
89 .size = .c,
90 .is_const = ptr.is_const,
91 .is_volatile = ptr.is_volatile,
92 .alignment = @alignOf(ElementType),
93 .address_space = .generic,
94 .child = ElementType,
95 .is_allowzero = true,
96 .sentinel_ptr = null,
97 } });
98 },
99 else => |info| @compileError("Invalid self type \"" ++ @tagName(info) ++ "\" for flexible array getter: " ++ @typeName(SelfType)),
100 }
84/// from Self for pointing to a C flexible array of Element.
85pub fn FlexibleArrayType(comptime Self: type, comptime Element: type) type {
86 return switch (@typeInfo(Self)) {
87 .pointer => |ptr| @Pointer(.c, .{
88 .@"const" = ptr.is_const,
89 .@"volatile" = ptr.is_volatile,
90 }, Element, null),
91 else => |info| @compileError("Invalid self type \"" ++ @tagName(info) ++ "\" for flexible array getter: " ++ @typeName(Self)),
92 };
10193}
10294
10395/// Promote the type of an integer literal until it fits as C would.
......@@ -219,7 +211,7 @@ fn castInt(comptime DestType: type, target: anytype) DestType {
219211 const dest = @typeInfo(DestType).int;
220212 const source = @typeInfo(@TypeOf(target)).int;
221213
222 const Int = @Type(.{ .int = .{ .bits = dest.bits, .signedness = source.signedness } });
214 const Int = @Int(source.signedness, dest.bits);
223215
224216 if (dest.bits < source.bits)
225217 return @as(DestType, @bitCast(@as(Int, @truncate(target))))
lib/std/zig/llvm/Builder.zig+9-30
......@@ -8614,39 +8614,18 @@ pub const Metadata = packed struct(u32) {
86148614 nodes: anytype,
86158615 w: *Writer,
86168616 ) !void {
8617 comptime var fmt_str: []const u8 = "";
86188617 const names = comptime std.meta.fieldNames(@TypeOf(nodes));
8619 comptime var fields: [2 + names.len]std.builtin.Type.StructField = undefined;
8620 inline for (fields[0..2], .{ "distinct", "node" }) |*field, name| {
8621 fmt_str = fmt_str ++ "{[" ++ name ++ "]s}";
8622 field.* = .{
8623 .name = name,
8624 .type = []const u8,
8625 .default_value_ptr = null,
8626 .is_comptime = false,
8627 .alignment = @alignOf([]const u8),
8628 };
8629 }
8630 fmt_str = fmt_str ++ "(";
8631 inline for (fields[2..], names) |*field, name| {
8632 fmt_str = fmt_str ++ "{[" ++ name ++ "]f}";
8633 const T = std.fmt.Alt(FormatData, format);
8634 field.* = .{
8635 .name = name,
8636 .type = T,
8637 .default_value_ptr = null,
8638 .is_comptime = false,
8639 .alignment = @alignOf(T),
8640 };
8641 }
8618
8619 comptime var fmt_str: []const u8 = "{[distinct]s}{[node]s}(";
8620 inline for (names) |name| fmt_str = fmt_str ++ "{[" ++ name ++ "]f}";
86428621 fmt_str = fmt_str ++ ")\n";
86438622
8644 var fmt_args: @Type(.{ .@"struct" = .{
8645 .layout = .auto,
8646 .fields = &fields,
8647 .decls = &.{},
8648 .is_tuple = false,
8649 } }) = undefined;
8623 const field_names = @as([]const []const u8, &.{ "distinct", "node" }) ++ names;
8624 comptime var field_types: [2 + names.len]type = undefined;
8625 @memset(field_types[0..2], []const u8);
8626 @memset(field_types[2..], std.fmt.Alt(FormatData, format));
8627
8628 var fmt_args: @Struct(.auto, null, field_names, &field_types, &@splat(.{})) = undefined;
86508629 fmt_args.distinct = @tagName(distinct);
86518630 fmt_args.node = @tagName(node);
86528631 inline for (names) |name| @field(fmt_args, name) = try formatter.fmt(
src/InternPool.zig+20-41
......@@ -1153,23 +1153,17 @@ const Local = struct {
11531153 fn PtrArrayElem(comptime len: usize) type {
11541154 const elem_info = @typeInfo(Elem).@"struct";
11551155 const elem_fields = elem_info.fields;
1156 var new_fields: [elem_fields.len]std.builtin.Type.StructField = undefined;
1157 for (&new_fields, elem_fields) |*new_field, elem_field| {
1158 const T = *[len]elem_field.type;
1159 new_field.* = .{
1160 .name = elem_field.name,
1161 .type = T,
1162 .default_value_ptr = null,
1163 .is_comptime = false,
1164 .alignment = @alignOf(T),
1165 };
1156 var new_names: [elem_fields.len][]const u8 = undefined;
1157 var new_types: [elem_fields.len]type = undefined;
1158 for (elem_fields, &new_names, &new_types) |elem_field, *new_name, *NewType| {
1159 new_name.* = elem_field.name;
1160 NewType.* = *[len]elem_field.type;
1161 }
1162 if (elem_info.is_tuple) {
1163 return @Tuple(&new_types);
1164 } else {
1165 return @Struct(.auto, null, &new_names, &new_types, &@splat(.{}));
11661166 }
1167 return @Type(.{ .@"struct" = .{
1168 .layout = .auto,
1169 .fields = &new_fields,
1170 .decls = &.{},
1171 .is_tuple = elem_info.is_tuple,
1172 } });
11731167 }
11741168 fn PtrElem(comptime opts: struct {
11751169 size: std.builtin.Type.Pointer.Size,
......@@ -1177,32 +1171,17 @@ const Local = struct {
11771171 }) type {
11781172 const elem_info = @typeInfo(Elem).@"struct";
11791173 const elem_fields = elem_info.fields;
1180 var new_fields: [elem_fields.len]std.builtin.Type.StructField = undefined;
1181 for (&new_fields, elem_fields) |*new_field, elem_field| {
1182 const T = @Type(.{ .pointer = .{
1183 .size = opts.size,
1184 .is_const = opts.is_const,
1185 .is_volatile = false,
1186 .alignment = @alignOf(elem_field.type),
1187 .address_space = .generic,
1188 .child = elem_field.type,
1189 .is_allowzero = false,
1190 .sentinel_ptr = null,
1191 } });
1192 new_field.* = .{
1193 .name = elem_field.name,
1194 .type = T,
1195 .default_value_ptr = null,
1196 .is_comptime = false,
1197 .alignment = @alignOf(T),
1198 };
1174 var new_names: [elem_fields.len][]const u8 = undefined;
1175 var new_types: [elem_fields.len]type = undefined;
1176 for (elem_fields, &new_names, &new_types) |elem_field, *new_name, *NewType| {
1177 new_name.* = elem_field.name;
1178 NewType.* = @Pointer(opts.size, .{ .@"const" = opts.is_const }, elem_field.type, null);
1179 }
1180 if (elem_info.is_tuple) {
1181 return @Tuple(&new_types);
1182 } else {
1183 return @Struct(.auto, null, &new_names, &new_types, &@splat(.{}));
11991184 }
1200 return @Type(.{ .@"struct" = .{
1201 .layout = .auto,
1202 .fields = &new_fields,
1203 .decls = &.{},
1204 .is_tuple = elem_info.is_tuple,
1205 } });
12061185 }
12071186
12081187 pub fn addOne(mutable: Mutable) Allocator.Error!PtrElem(.{ .size = .one }) {
src/Sema.zig+2-2
......@@ -23904,7 +23904,7 @@ fn analyzeShuffle(
2390423904 const b_src = block.builtinCallArgSrc(src_node, 2);
2390523905 const mask_src = block.builtinCallArgSrc(src_node, 3);
2390623906
23907 // If the type of `a` is `@Type(.undefined)`, i.e. the argument is untyped,
23907 // If the type of `a` is `@TypeOf(undefined)`, i.e. the argument is untyped,
2390823908 // this is 0, because it is an error to index into this vector.
2390923909 const a_len: u32 = switch (sema.typeOf(a_uncoerced).zigTypeTag(zcu)) {
2391023910 .array, .vector => @intCast(sema.typeOf(a_uncoerced).arrayLen(zcu)),
......@@ -23916,7 +23916,7 @@ fn analyzeShuffle(
2391623916 const a_ty = try pt.vectorType(.{ .len = a_len, .child = elem_ty.toIntern() });
2391723917 const a_coerced = try sema.coerce(block, a_ty, a_uncoerced, a_src);
2391823918
23919 // If the type of `b` is `@Type(.undefined)`, i.e. the argument is untyped, this is 0, because it is an error to index into this vector.
23919 // If the type of `b` is `@TypeOf(undefined)`, i.e. the argument is untyped, this is 0, because it is an error to index into this vector.
2392023920 const b_len: u32 = switch (sema.typeOf(b_uncoerced).zigTypeTag(zcu)) {
2392123921 .array, .vector => @intCast(sema.typeOf(b_uncoerced).arrayLen(zcu)),
2392223922 .undefined => 0,
src/codegen/aarch64/Assemble.zig+11-21
......@@ -120,23 +120,13 @@ const matchers = matchers: {
120120 );
121121 var symbols: Symbols: {
122122 const symbols = @typeInfo(@TypeOf(instruction.symbols)).@"struct".fields;
123 var symbol_fields: [symbols.len]std.builtin.Type.StructField = undefined;
124 for (&symbol_fields, symbols) |*symbol_field, symbol| {
125 const Storage = zonCast(SymbolSpec, @field(instruction.symbols, symbol.name), .{}).Storage();
126 symbol_field.* = .{
127 .name = symbol.name,
128 .type = Storage,
129 .default_value_ptr = null,
130 .is_comptime = false,
131 .alignment = @alignOf(Storage),
132 };
123 var field_names: [symbols.len][]const u8 = undefined;
124 var field_types: [symbols.len]type = undefined;
125 for (symbols, &field_names, &field_types) |symbol, *field_name, *FieldType| {
126 field_name.* = symbol.name;
127 FieldType.* = zonCast(SymbolSpec, @field(instruction.symbols, symbol.name), .{}).Storage();
133128 }
134 break :Symbols @Type(.{ .@"struct" = .{
135 .layout = .auto,
136 .fields = &symbol_fields,
137 .decls = &.{},
138 .is_tuple = false,
139 } });
129 break :Symbols @Struct(.auto, null, &field_names, &field_types, &@splat(.{}));
140130 } = undefined;
141131 const Symbol = std.meta.FieldEnum(@TypeOf(instruction.symbols));
142132 comptime var unused_symbols: std.enums.EnumSet(Symbol) = .initFull();
......@@ -334,7 +324,7 @@ const SymbolSpec = union(enum) {
334324 .reg => aarch64.encoding.Register,
335325 .arrangement => aarch64.encoding.Register.Arrangement,
336326 .systemreg => aarch64.encoding.Register.System,
337 .imm => |imm_spec| @Type(.{ .int = imm_spec.type }),
327 .imm => |imm_spec| @Int(imm_spec.type.signedness, imm_spec.type.bits),
338328 .fimm => f16,
339329 .extend => Instruction.DataProcessingRegister.AddSubtractExtendedRegister.Option,
340330 .shift => Instruction.DataProcessingRegister.Shift.Op,
......@@ -413,13 +403,13 @@ const SymbolSpec = union(enum) {
413403 return systemreg;
414404 },
415405 .imm => |imm_spec| {
416 const imm = std.fmt.parseInt(@Type(.{ .int = .{
417 .signedness = imm_spec.type.signedness,
418 .bits = switch (imm_spec.adjust) {
406 const imm = std.fmt.parseInt(@Int(
407 imm_spec.type.signedness,
408 switch (imm_spec.adjust) {
419409 .none, .neg_wrap => imm_spec.type.bits,
420410 .dec => imm_spec.type.bits + 1,
421411 },
422 } }), token, 0) catch {
412 ), token, 0) catch {
423413 log.debug("invalid immediate: \"{f}\"", .{std.zig.fmtString(token)});
424414 return null;
425415 };
src/codegen/aarch64/Select.zig+22-14
......@@ -8928,12 +8928,16 @@ pub const Value = struct {
89288928 constant: Constant,
89298929
89308930 pub const Tag = @typeInfo(Parent).@"union".tag_type.?;
8931 pub const Payload = @Type(.{ .@"union" = .{
8932 .layout = .auto,
8933 .tag_type = null,
8934 .fields = @typeInfo(Parent).@"union".fields,
8935 .decls = &.{},
8936 } });
8931 pub const Payload = Payload: {
8932 const fields = @typeInfo(Parent).@"union".fields;
8933 var types: [fields.len]type = undefined;
8934 var names: [fields.len][]const u8 = undefined;
8935 for (fields, &types, &names) |f, *ty, *name| {
8936 ty.* = f.type;
8937 name.* = f.name;
8938 }
8939 break :Payload @Union(.auto, null, &names, &types, &@splat(.{}));
8940 };
89378941 };
89388942
89398943 pub const Location = union(enum(u1)) {
......@@ -8949,12 +8953,16 @@ pub const Value = struct {
89498953 },
89508954
89518955 pub const Tag = @typeInfo(Location).@"union".tag_type.?;
8952 pub const Payload = @Type(.{ .@"union" = .{
8953 .layout = .auto,
8954 .tag_type = null,
8955 .fields = @typeInfo(Location).@"union".fields,
8956 .decls = &.{},
8957 } });
8956 pub const Payload = Payload: {
8957 const fields = @typeInfo(Location).@"union".fields;
8958 var types: [fields.len]type = undefined;
8959 var names: [fields.len][]const u8 = undefined;
8960 for (fields, &types, &names) |f, *ty, *name| {
8961 ty.* = f.type;
8962 name.* = f.name;
8963 }
8964 break :Payload @Union(.auto, null, &names, &types, &@splat(.{}));
8965 };
89588966 };
89598967
89608968 pub const Indirect = packed struct(u32) {
......@@ -11210,7 +11218,7 @@ pub const Value = struct {
1121011218 .storage = .{ .u64 = switch (size) {
1121111219 else => unreachable,
1121211220 inline 1...8 => |ct_size| std.mem.readInt(
11213 @Type(.{ .int = .{ .signedness = .unsigned, .bits = 8 * ct_size } }),
11221 @Int(.unsigned, 8 * ct_size),
1121411222 buffer[@intCast(offset)..][0..ct_size],
1121511223 isel.target.cpu.arch.endian(),
1121611224 ),
......@@ -11438,7 +11446,7 @@ fn writeKeyToMemory(isel: *Select, constant_key: InternPool.Key, buffer: []u8) e
1143811446 switch (buffer.len) {
1143911447 else => unreachable,
1144011448 inline 1...4 => |size| std.mem.writeInt(
11441 @Type(.{ .int = .{ .signedness = .unsigned, .bits = 8 * size } }),
11449 @Int(.unsigned, 8 * size),
1144211450 buffer[0..size],
1144311451 @intCast(error_int),
1144411452 isel.target.cpu.arch.endian(),
src/codegen/x86_64/CodeGen.zig+5-7
......@@ -189867,9 +189867,7 @@ const Select = struct {
189867189867 }
189868189868
189869189869 fn adjustedImm(op: Select.Operand, comptime SignedImm: type, s: *const Select) SignedImm {
189870 const UnsignedImm = @Type(.{
189871 .int = .{ .signedness = .unsigned, .bits = @typeInfo(SignedImm).int.bits },
189872 });
189870 const UnsignedImm = @Int(.unsigned, @typeInfo(SignedImm).int.bits);
189873189871 const lhs: SignedImm = lhs: switch (op.flags.adjust.lhs) {
189874189872 .none => 0,
189875189873 .ptr_size => @divExact(s.cg.target.ptrBitWidth(), 8),
......@@ -189934,10 +189932,10 @@ const Select = struct {
189934189932 const RefImm = switch (size) {
189935189933 else => comptime unreachable,
189936189934 .none => Imm,
189937 .byte, .word, .dword, .qword => @Type(comptime .{ .int = .{
189938 .signedness = @typeInfo(Imm).int.signedness,
189939 .bits = size.bitSize(undefined),
189940 } }),
189935 .byte, .word, .dword, .qword => @Int(
189936 @typeInfo(Imm).int.signedness,
189937 size.bitSize(undefined),
189938 ),
189941189939 };
189942189940 break :lhs @bitCast(@as(Imm, @intCast(@as(RefImm, switch (adjust) {
189943189941 else => comptime unreachable,
src/codegen/x86_64/Emit.zig+1-1
......@@ -708,7 +708,7 @@ pub fn emitMir(emit: *Emit) Error!void {
708708 switch (reloc.source_length) {
709709 else => unreachable,
710710 inline 1, 4 => |source_length| std.mem.writeInt(
711 @Type(.{ .int = .{ .signedness = .signed, .bits = @as(u16, 8) * source_length } }),
711 @Int(.signed, @as(u16, 8) * source_length),
712712 inst_bytes[reloc.source_offset..][0..source_length],
713713 @intCast(disp),
714714 .little,
src/link.zig+1-4
......@@ -51,10 +51,7 @@ pub const Diags = struct {
5151
5252 const Int = blk: {
5353 const bits = @typeInfo(@This()).@"struct".fields.len;
54 break :blk @Type(.{ .int = .{
55 .signedness = .unsigned,
56 .bits = bits,
57 } });
54 break :blk @Int(.unsigned, bits);
5855 };
5956
6057 pub fn anySet(ef: Flags) bool {
src/link/Dwarf.zig+13-13
......@@ -5130,25 +5130,23 @@ pub fn resolveRelocs(dwarf: *Dwarf) RelocError!void {
51305130
51315131fn DeclValEnum(comptime T: type) type {
51325132 const decls = @typeInfo(T).@"struct".decls;
5133 @setEvalBranchQuota(7 * decls.len);
5134 var fields: [decls.len]std.builtin.Type.EnumField = undefined;
5133 @setEvalBranchQuota(10 * decls.len);
5134 var field_names: [decls.len][]const u8 = undefined;
51355135 var fields_len = 0;
51365136 var min_value: ?comptime_int = null;
51375137 var max_value: ?comptime_int = null;
51385138 for (decls) |decl| {
51395139 if (std.mem.startsWith(u8, decl.name, "HP_") or std.mem.endsWith(u8, decl.name, "_user")) continue;
51405140 const value = @field(T, decl.name);
5141 fields[fields_len] = .{ .name = decl.name, .value = value };
5141 field_names[fields_len] = decl.name;
51425142 fields_len += 1;
51435143 if (min_value == null or min_value.? > value) min_value = value;
51445144 if (max_value == null or max_value.? < value) max_value = value;
51455145 }
5146 return @Type(.{ .@"enum" = .{
5147 .tag_type = std.math.IntFittingRange(min_value orelse 0, max_value orelse 0),
5148 .fields = fields[0..fields_len],
5149 .decls = &.{},
5150 .is_exhaustive = true,
5151 } });
5146 const TagInt = std.math.IntFittingRange(min_value orelse 0, max_value orelse 0);
5147 var field_vals: [fields_len]TagInt = undefined;
5148 for (field_names[0..fields_len], &field_vals) |name, *val| val.* = @field(T, name);
5149 return @Enum(TagInt, .exhaustive, field_names[0..fields_len], &field_vals);
51525150}
51535151
51545152const AbbrevCode = enum {
......@@ -6382,10 +6380,12 @@ fn freeCommonEntry(
63826380
63836381fn writeInt(dwarf: *Dwarf, buf: []u8, int: u64) void {
63846382 switch (buf.len) {
6385 inline 0...8 => |len| std.mem.writeInt(@Type(.{ .int = .{
6386 .signedness = .unsigned,
6387 .bits = len * 8,
6388 } }), buf[0..len], @intCast(int), dwarf.endian),
6383 inline 0...8 => |len| std.mem.writeInt(
6384 @Int(.unsigned, len * 8),
6385 buf[0..len],
6386 @intCast(int),
6387 dwarf.endian,
6388 ),
63896389 else => unreachable,
63906390 }
63916391}
src/link/MappedFile.zig+6-14
......@@ -108,10 +108,7 @@ pub const Node = extern struct {
108108 has_content: bool,
109109 /// Whether a moved event on this node bubbles down to children.
110110 bubbles_moved: bool,
111 unused: @Type(.{ .int = .{
112 .signedness = .unsigned,
113 .bits = 32 - @bitSizeOf(std.mem.Alignment) - 6,
114 } }) = 0,
111 unused: @Int(.unsigned, 32 - @bitSizeOf(std.mem.Alignment) - 6) = 0,
115112 };
116113
117114 pub const Location = union(enum(u1)) {
......@@ -122,19 +119,14 @@ pub const Node = extern struct {
122119 },
123120 large: extern struct {
124121 index: usize,
125 unused: @Type(.{ .int = .{
126 .signedness = .unsigned,
127 .bits = 64 - @bitSizeOf(usize),
128 } }) = 0,
122 unused: @Int(.unsigned, 64 - @bitSizeOf(usize)) = 0,
129123 },
130124
131125 pub const Tag = @typeInfo(Location).@"union".tag_type.?;
132 pub const Payload = @Type(.{ .@"union" = .{
133 .layout = .@"extern",
134 .tag_type = null,
135 .fields = @typeInfo(Location).@"union".fields,
136 .decls = &.{},
137 } });
126 pub const Payload = extern union {
127 small: @FieldType(Location, "small"),
128 large: @FieldType(Location, "large"),
129 };
138130
139131 pub fn resolve(loc: Location, mf: *const MappedFile) [2]u64 {
140132 return switch (loc) {
src/main.zig+1-1
......@@ -136,7 +136,7 @@ var log_scopes: std.ArrayList([]const u8) = .empty;
136136
137137pub fn log(
138138 comptime level: std.log.Level,
139 comptime scope: @Type(.enum_literal),
139 comptime scope: @EnumLiteral(),
140140 comptime format: []const u8,
141141 args: anytype,
142142) void {
test/behavior/basic.zig+2-5
......@@ -1264,12 +1264,9 @@ test "reference to inferred local variable works as expected" {
12641264 try expect(crasher_local.lets_crash != a.lets_crash);
12651265}
12661266
1267test "@Type returned from block" {
1267test "@Int returned from block" {
12681268 const T = comptime b: {
1269 break :b @Type(.{ .int = .{
1270 .signedness = .unsigned,
1271 .bits = 8,
1272 } });
1269 break :b @Int(.unsigned, 8);
12731270 };
12741271 try std.testing.expect(T == u8);
12751272}
test/behavior/bit_shifting.zig+1-10
......@@ -119,21 +119,12 @@ test "Saturating Shift Left where lhs is of a computed type" {
119119 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
120120
121121 const S = struct {
122 fn getIntShiftType(comptime T: type) type {
123 var unsigned_shift_type = @typeInfo(std.math.Log2Int(T)).int;
124 unsigned_shift_type.signedness = .signed;
125
126 return @Type(.{
127 .int = unsigned_shift_type,
128 });
129 }
130
131122 pub fn FixedPoint(comptime ValueType: type) type {
132123 return struct {
133124 value: ValueType,
134125 exponent: ShiftType,
135126
136 const ShiftType: type = getIntShiftType(ValueType);
127 const ShiftType = @Int(.signed, @typeInfo(std.math.Log2Int(ValueType)).int.bits);
137128
138129 pub fn shiftExponent(self: @This(), shift: ShiftType) @This() {
139130 const shiftAbs = @abs(shift);
test/behavior/call.zig+1-1
......@@ -355,7 +355,7 @@ test "inline call doesn't re-evaluate non generic struct" {
355355 try comptime @call(.always_inline, S.foo, ArgTuple{.{ .a = 123, .b = 45 }});
356356}
357357
358test "Enum constructed by @Type passed as generic argument" {
358test "Enum constructed by @Enum passed as generic argument" {
359359 const S = struct {
360360 const E = std.meta.FieldEnum(struct {
361361 prev_pos: bool,
test/behavior/cast.zig+8-3
......@@ -2446,9 +2446,14 @@ test "peer type resolution: pointer attributes are combined correctly" {
24462446 };
24472447
24482448 const NonAllowZero = comptime blk: {
2449 var ti = @typeInfo(@TypeOf(r1, r2, r3, r4));
2450 ti.pointer.is_allowzero = false;
2451 break :blk @Type(ti);
2449 const ptr = @typeInfo(@TypeOf(r1, r2, r3, r4)).pointer;
2450 break :blk @Pointer(ptr.size, .{
2451 .@"const" = ptr.is_const,
2452 .@"volatile" = ptr.is_volatile,
2453 .@"allowzero" = false,
2454 .@"align" = ptr.alignment,
2455 .@"addrspace" = ptr.address_space,
2456 }, ptr.child, ptr.sentinel());
24522457 };
24532458 try expectEqualSlices(u8, std.mem.span(@volatileCast(@as(NonAllowZero, @ptrCast(r1)))), "foo");
24542459 try expectEqualSlices(u8, std.mem.span(@volatileCast(@as(NonAllowZero, @ptrCast(r2)))), "bar");
test/behavior/enum.zig+1-4
......@@ -1283,10 +1283,7 @@ test "Non-exhaustive enum backed by comptime_int" {
12831283test "matching captures causes enum equivalence" {
12841284 const S = struct {
12851285 fn Nonexhaustive(comptime I: type) type {
1286 const UTag = @Type(.{ .int = .{
1287 .signedness = .unsigned,
1288 .bits = @typeInfo(I).int.bits,
1289 } });
1286 const UTag = @Int(.unsigned, @typeInfo(I).int.bits);
12901287 return enum(UTag) { _ };
12911288 }
12921289 };
test/behavior/fn.zig+2-2
......@@ -556,10 +556,10 @@ test "lazy values passed to anytype parameter" {
556556
557557test "pass and return comptime-only types" {
558558 const S = struct {
559 fn returnNull(comptime x: @Type(.null)) @Type(.null) {
559 fn returnNull(comptime x: @TypeOf(null)) @TypeOf(null) {
560560 return x;
561561 }
562 fn returnUndefined(comptime x: @Type(.undefined)) @Type(.undefined) {
562 fn returnUndefined(comptime x: @TypeOf(undefined)) @TypeOf(undefined) {
563563 return x;
564564 }
565565 };
test/behavior/generics.zig+1-9
......@@ -263,15 +263,7 @@ test "generic function instantiation turns into comptime call" {
263263
264264 pub fn FieldEnum(comptime T: type) type {
265265 _ = T;
266 var enumFields: [1]std.builtin.Type.EnumField = .{.{ .name = "A", .value = 0 }};
267 return @Type(.{
268 .@"enum" = .{
269 .tag_type = u0,
270 .fields = &enumFields,
271 .decls = &.{},
272 .is_exhaustive = true,
273 },
274 });
266 return @Enum(u0, .exhaustive, &.{"A"}, &.{0});
275267 }
276268 };
277269 try S.doTheTest();
test/behavior/sizeof_and_typeof.zig+6-6
......@@ -338,14 +338,14 @@ test "peer type resolution with @TypeOf doesn't trigger dependency loop check" {
338338
339339test "@sizeOf reified union zero-size payload fields" {
340340 comptime {
341 try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union {}))));
342 try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union { a: void }))));
341 try std.testing.expect(0 == @sizeOf(@Union(.auto, null, &.{}, &.{}, &.{})));
342 try std.testing.expect(0 == @sizeOf(@Union(.auto, null, &.{"a"}, &.{void}, &.{.{}})));
343343 if (builtin.mode == .Debug or builtin.mode == .ReleaseSafe) {
344 try std.testing.expect(1 == @sizeOf(@Type(@typeInfo(union { a: void, b: void }))));
345 try std.testing.expect(1 == @sizeOf(@Type(@typeInfo(union { a: void, b: void, c: void }))));
344 try std.testing.expect(1 == @sizeOf(@Union(.auto, null, &.{ "a", "b" }, &.{ void, void }, &.{ .{}, .{} })));
345 try std.testing.expect(1 == @sizeOf(@Union(.auto, null, &.{ "a", "b", "c" }, &.{ void, void, void }, &.{ .{}, .{}, .{} })));
346346 } else {
347 try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union { a: void, b: void }))));
348 try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union { a: void, b: void, c: void }))));
347 try std.testing.expect(0 == @sizeOf(@Union(.auto, null, &.{ "a", "b" }, &.{ void, void }, &.{ .{}, .{} })));
348 try std.testing.expect(0 == @sizeOf(@Union(.auto, null, &.{ "a", "b", "c" }, &.{ void, void, void }, &.{ .{}, .{}, .{} })));
349349 }
350350 }
351351}
test/behavior/struct.zig+1-4
......@@ -2034,10 +2034,7 @@ test "matching captures causes struct equivalence" {
20342034 fn UnsignedWrapper(comptime I: type) type {
20352035 const bits = @typeInfo(I).int.bits;
20362036 return struct {
2037 x: @Type(.{ .int = .{
2038 .signedness = .unsigned,
2039 .bits = bits,
2040 } }),
2037 x: @Int(.unsigned, bits),
20412038 };
20422039 }
20432040 };
test/behavior/switch.zig+4-2
......@@ -843,7 +843,8 @@ test "switch capture peer type resolution for in-memory coercible payloads" {
843843 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
844844
845845 const T1 = c_int;
846 const T2 = @Type(@typeInfo(T1));
846 const t1_info = @typeInfo(T1).int;
847 const T2 = @Int(t1_info.signedness, t1_info.bits);
847848
848849 comptime assert(T1 != T2);
849850
......@@ -865,7 +866,8 @@ test "switch pointer capture peer type resolution" {
865866 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
866867
867868 const T1 = c_int;
868 const T2 = @Type(@typeInfo(T1));
869 const t1_info = @typeInfo(T1).int;
870 const T2 = @Int(t1_info.signedness, t1_info.bits);
869871
870872 comptime assert(T1 != T2);
871873
test/behavior/switch_loop.zig+1-4
......@@ -230,10 +230,7 @@ test "switch loop on larger than pointer integer" {
230230 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
231231 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
232232
233 var entry: @Type(.{ .int = .{
234 .signedness = .unsigned,
235 .bits = @bitSizeOf(usize) + 1,
236 } }) = undefined;
233 var entry: @Int(.unsigned, @bitSizeOf(usize) + 1) = undefined;
237234 entry = 0;
238235 loop: switch (entry) {
239236 0 => {
test/behavior/tuple.zig+4-55
......@@ -130,29 +130,7 @@ test "array-like initializer for tuple types" {
130130 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
131131 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
132132
133 const T = @Type(.{
134 .@"struct" = .{
135 .is_tuple = true,
136 .layout = .auto,
137 .decls = &.{},
138 .fields = &.{
139 .{
140 .name = "0",
141 .type = i32,
142 .default_value_ptr = null,
143 .is_comptime = false,
144 .alignment = @alignOf(i32),
145 },
146 .{
147 .name = "1",
148 .type = u8,
149 .default_value_ptr = null,
150 .is_comptime = false,
151 .alignment = @alignOf(u8),
152 },
153 },
154 },
155 });
133 const T = @Tuple(&.{ i32, u8 });
156134 const S = struct {
157135 fn doTheTest() !void {
158136 var obj: T = .{ -1234, 128 };
......@@ -320,20 +298,7 @@ test "zero sized struct in tuple handled correctly" {
320298 const Self = @This();
321299 const Inner = struct {};
322300
323 data: @Type(.{
324 .@"struct" = .{
325 .is_tuple = true,
326 .layout = .auto,
327 .decls = &.{},
328 .fields = &.{.{
329 .name = "0",
330 .type = Inner,
331 .default_value_ptr = null,
332 .is_comptime = false,
333 .alignment = @alignOf(Inner),
334 }},
335 },
336 }),
301 data: @Tuple(&.{Inner}),
337302
338303 pub fn do(this: Self) usize {
339304 return @sizeOf(@TypeOf(this));
......@@ -470,12 +435,7 @@ test "coerce anon tuple to tuple" {
470435}
471436
472437test "empty tuple type" {
473 const S = @Type(.{ .@"struct" = .{
474 .layout = .auto,
475 .fields = &.{},
476 .decls = &.{},
477 .is_tuple = true,
478 } });
438 const S = @Tuple(&.{});
479439
480440 const s: S = .{};
481441 try expect(s.len == 0);
......@@ -616,18 +576,7 @@ test "OPV tuple fields aren't comptime" {
616576 const t_info = @typeInfo(T);
617577 try expect(!t_info.@"struct".fields[0].is_comptime);
618578
619 const T2 = @Type(.{ .@"struct" = .{
620 .layout = .auto,
621 .fields = &.{.{
622 .name = "0",
623 .type = void,
624 .default_value_ptr = null,
625 .is_comptime = false,
626 .alignment = @alignOf(void),
627 }},
628 .decls = &.{},
629 .is_tuple = true,
630 } });
579 const T2 = @Tuple(&.{void});
631580 const t2_info = @typeInfo(T2);
632581 try expect(!t2_info.@"struct".fields[0].is_comptime);
633582}
test/behavior/type.zig+93-477
......@@ -4,63 +4,17 @@ const Type = std.builtin.Type;
44const testing = std.testing;
55const assert = std.debug.assert;
66
7fn testTypes(comptime types: []const type) !void {
8 inline for (types) |testType| {
9 try testing.expect(testType == @Type(@typeInfo(testType)));
10 }
11}
12
13test "Type.MetaType" {
14 try testing.expect(type == @Type(.{ .type = {} }));
15 try testTypes(&[_]type{type});
16}
17
18test "Type.Void" {
19 try testing.expect(void == @Type(.{ .void = {} }));
20 try testTypes(&[_]type{void});
21}
22
23test "Type.Bool" {
24 try testing.expect(bool == @Type(.{ .bool = {} }));
25 try testTypes(&[_]type{bool});
26}
27
28test "Type.NoReturn" {
29 try testing.expect(noreturn == @Type(.{ .noreturn = {} }));
30 try testTypes(&[_]type{noreturn});
31}
32
337test "Type.Int" {
34 try testing.expect(u1 == @Type(.{ .int = .{ .signedness = .unsigned, .bits = 1 } }));
35 try testing.expect(i1 == @Type(.{ .int = .{ .signedness = .signed, .bits = 1 } }));
36 try testing.expect(u8 == @Type(.{ .int = .{ .signedness = .unsigned, .bits = 8 } }));
37 try testing.expect(i8 == @Type(.{ .int = .{ .signedness = .signed, .bits = 8 } }));
38 try testing.expect(u64 == @Type(.{ .int = .{ .signedness = .unsigned, .bits = 64 } }));
39 try testing.expect(i64 == @Type(.{ .int = .{ .signedness = .signed, .bits = 64 } }));
40 try testTypes(&[_]type{ u8, u32, i64 });
41}
42
43test "Type.ComptimeFloat" {
44 try testTypes(&[_]type{comptime_float});
45}
46test "Type.ComptimeInt" {
47 try testTypes(&[_]type{comptime_int});
48}
49test "Type.Undefined" {
50 try testTypes(&[_]type{@TypeOf(undefined)});
51}
52test "Type.Null" {
53 try testTypes(&[_]type{@TypeOf(null)});
54}
55
56test "Type.EnumLiteral" {
57 try testTypes(&[_]type{
58 @TypeOf(.Dummy),
59 });
8 try testing.expect(u1 == @Int(.unsigned, 1));
9 try testing.expect(i1 == @Int(.signed, 1));
10 try testing.expect(u8 == @Int(.unsigned, 8));
11 try testing.expect(i8 == @Int(.signed, 8));
12 try testing.expect(u64 == @Int(.unsigned, 64));
13 try testing.expect(i64 == @Int(.signed, 64));
6014}
6115
6216test "Type.Pointer" {
63 try testTypes(&[_]type{
17 inline for (&[_]type{
6418 // One Value Pointer Types
6519 *u8, *const u8,
6620 *volatile u8, *const volatile u8,
......@@ -101,62 +55,30 @@ test "Type.Pointer" {
10155 [*c]align(4) volatile u8, [*c]align(4) const volatile u8,
10256 [*c]align(8) u8, [*c]align(8) const u8,
10357 [*c]align(8) volatile u8, [*c]align(8) const volatile u8,
104 });
58 }) |testType| {
59 const ptr = @typeInfo(testType).pointer;
60 try testing.expect(testType == @Pointer(ptr.size, .{
61 .@"const" = ptr.is_const,
62 .@"volatile" = ptr.is_volatile,
63 .@"allowzero" = ptr.is_allowzero,
64 .@"align" = ptr.alignment,
65 .@"addrspace" = ptr.address_space,
66 }, ptr.child, ptr.sentinel()));
67 }
10568}
10669
107test "Type.Float" {
108 try testing.expect(f16 == @Type(.{ .float = .{ .bits = 16 } }));
109 try testing.expect(f32 == @Type(.{ .float = .{ .bits = 32 } }));
110 try testing.expect(f64 == @Type(.{ .float = .{ .bits = 64 } }));
111 try testing.expect(f80 == @Type(.{ .float = .{ .bits = 80 } }));
112 try testing.expect(f128 == @Type(.{ .float = .{ .bits = 128 } }));
113 try testTypes(&[_]type{ f16, f32, f64, f80, f128 });
70test "@Pointer create slice without sentinel" {
71 const Slice = @Pointer(.slice, .{ .@"const" = true, .@"align" = 8 }, ?*i32, null);
72 try testing.expect(Slice == []align(8) const ?*i32);
11473}
11574
116test "Type.Array" {
117 try testing.expect([123]u8 == @Type(.{
118 .array = .{
119 .len = 123,
120 .child = u8,
121 .sentinel_ptr = null,
122 },
123 }));
124 try testing.expect([2]u32 == @Type(.{
125 .array = .{
126 .len = 2,
127 .child = u32,
128 .sentinel_ptr = null,
129 },
130 }));
131 try testing.expect([2:0]u32 == @Type(.{
132 .array = .{
133 .len = 2,
134 .child = u32,
135 .sentinel_ptr = &@as(u32, 0),
136 },
137 }));
138 try testTypes(&[_]type{ [1]u8, [30]usize, [7]bool });
75test "@Pointer create slice with null sentinel" {
76 const Slice = @Pointer(.slice, .{ .@"const" = true, .@"align" = 8 }, ?*i32, @as(?*i32, null));
77 try testing.expect(Slice == [:null]align(8) const ?*i32);
13978}
14079
141test "@Type create slice with null sentinel" {
142 const Slice = @Type(.{
143 .pointer = .{
144 .size = .slice,
145 .is_const = true,
146 .is_volatile = false,
147 .is_allowzero = false,
148 .alignment = 8,
149 .address_space = .generic,
150 .child = *i32,
151 .sentinel_ptr = null,
152 },
153 });
154 try testing.expect(Slice == []align(8) const *i32);
155}
156
157test "@Type picks up the sentinel value from Type" {
158 try testTypes(&[_]type{
159 [11:0]u8, [4:10]u8,
80test "@Pointer on @typeInfo round-trips sentinels" {
81 inline for (&[_]type{
16082 [*:0]u8, [*:0]const u8,
16183 [*:0]volatile u8, [*:0]const volatile u8,
16284 [*:0]align(4) u8, [*:0]align(4) const u8,
......@@ -179,24 +101,16 @@ test "@Type picks up the sentinel value from Type" {
179101 [:0]allowzero align(4) u8, [:0]allowzero align(4) const u8,
180102 [:0]allowzero align(4) volatile u8, [:0]allowzero align(4) const volatile u8,
181103 [:4]allowzero align(4) volatile u8, [:4]allowzero align(4) const volatile u8,
182 });
183}
184
185test "Type.Optional" {
186 try testTypes(&[_]type{
187 ?u8,
188 ?*u8,
189 ?[]u8,
190 ?[*]u8,
191 ?[*c]u8,
192 });
193}
194
195test "Type.ErrorUnion" {
196 try testTypes(&[_]type{
197 error{}!void,
198 error{Error}!void,
199 });
104 }) |TestType| {
105 const ptr = @typeInfo(TestType).pointer;
106 try testing.expect(TestType == @Pointer(ptr.size, .{
107 .@"const" = ptr.is_const,
108 .@"volatile" = ptr.is_volatile,
109 .@"allowzero" = ptr.is_allowzero,
110 .@"align" = ptr.alignment,
111 .@"addrspace" = ptr.address_space,
112 }, ptr.child, ptr.sentinel()));
113 }
200114}
201115
202116test "Type.Opaque" {
......@@ -205,11 +119,7 @@ test "Type.Opaque" {
205119 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
206120 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
207121
208 const Opaque = @Type(.{
209 .@"opaque" = .{
210 .decls = &.{},
211 },
212 });
122 const Opaque = opaque {};
213123 try testing.expect(Opaque != opaque {});
214124 try testing.expectEqualSlices(
215125 Type.Declaration,
......@@ -218,52 +128,17 @@ test "Type.Opaque" {
218128 );
219129}
220130
221test "Type.Vector" {
222 try testTypes(&[_]type{
223 @Vector(0, u8),
224 @Vector(4, u8),
225 @Vector(8, *u8),
226 @Vector(0, u8),
227 @Vector(4, u8),
228 @Vector(8, *u8),
229 });
230}
231
232test "Type.AnyFrame" {
233 if (true) {
234 // https://github.com/ziglang/zig/issues/6025
235 return error.SkipZigTest;
236 }
237
238 try testTypes(&[_]type{
239 anyframe,
240 anyframe->u8,
241 anyframe->anyframe->u8,
242 });
243}
244
245131fn add(a: i32, b: i32) i32 {
246132 return a + b;
247133}
248134
249test "Type.ErrorSet" {
250 try testing.expect(@Type(.{ .error_set = null }) == anyerror);
251
252 // error sets don't compare equal so just check if they compile
253 inline for (.{ error{}, error{A}, error{ A, B, C } }) |T| {
254 const info = @typeInfo(T);
255 const T2 = @Type(info);
256 try testing.expect(T == T2);
257 }
258}
259
260135test "Type.Struct" {
261136 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
262137 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
263138 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
264139 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
265140
266 const A = @Type(@typeInfo(struct { x: u8, y: u32 }));
141 const A = @Struct(.auto, null, &.{ "x", "y" }, &.{ u8, u32 }, &@splat(.{}));
267142 const infoA = @typeInfo(A).@"struct";
268143 try testing.expectEqual(Type.ContainerLayout.auto, infoA.layout);
269144 try testing.expectEqualSlices(u8, "x", infoA.fields[0].name);
......@@ -281,7 +156,13 @@ test "Type.Struct" {
281156 a.y += 1;
282157 try testing.expectEqual(@as(u32, 2), a.y);
283158
284 const B = @Type(@typeInfo(extern struct { x: u8, y: u32 = 5 }));
159 const B = @Struct(
160 .@"extern",
161 null,
162 &.{ "x", "y" },
163 &.{ u8, u32 },
164 &.{ .{}, .{ .default_value_ptr = &@as(u32, 5) } },
165 );
285166 const infoB = @typeInfo(B).@"struct";
286167 try testing.expectEqual(Type.ContainerLayout.@"extern", infoB.layout);
287168 try testing.expectEqualSlices(u8, "x", infoB.fields[0].name);
......@@ -293,7 +174,16 @@ test "Type.Struct" {
293174 try testing.expectEqual(@as(usize, 0), infoB.decls.len);
294175 try testing.expectEqual(@as(bool, false), infoB.is_tuple);
295176
296 const C = @Type(@typeInfo(packed struct { x: u8 = 3, y: u32 = 5 }));
177 const C = @Struct(
178 .@"packed",
179 null,
180 &.{ "x", "y" },
181 &.{ u8, u32 },
182 &.{
183 .{ .default_value_ptr = &@as(u8, 3) },
184 .{ .default_value_ptr = &@as(u32, 5) },
185 },
186 );
297187 const infoC = @typeInfo(C).@"struct";
298188 try testing.expectEqual(Type.ContainerLayout.@"packed", infoC.layout);
299189 try testing.expectEqualSlices(u8, "x", infoC.fields[0].name);
......@@ -305,76 +195,23 @@ test "Type.Struct" {
305195 try testing.expectEqual(@as(usize, 0), infoC.decls.len);
306196 try testing.expectEqual(@as(bool, false), infoC.is_tuple);
307197
308 // anon structs
309 const D = @Type(@typeInfo(@TypeOf(.{ .x = 3, .y = 5 })));
310 const infoD = @typeInfo(D).@"struct";
311 try testing.expectEqual(Type.ContainerLayout.auto, infoD.layout);
312 try testing.expectEqualSlices(u8, "x", infoD.fields[0].name);
313 try testing.expectEqual(comptime_int, infoD.fields[0].type);
314 try testing.expectEqual(@as(comptime_int, 3), infoD.fields[0].defaultValue().?);
315 try testing.expectEqualSlices(u8, "y", infoD.fields[1].name);
316 try testing.expectEqual(comptime_int, infoD.fields[1].type);
317 try testing.expectEqual(@as(comptime_int, 5), infoD.fields[1].defaultValue().?);
318 try testing.expectEqual(@as(usize, 0), infoD.decls.len);
319 try testing.expectEqual(@as(bool, false), infoD.is_tuple);
320
321 // tuples
322 const E = @Type(@typeInfo(@TypeOf(.{ 1, 2 })));
323 const infoE = @typeInfo(E).@"struct";
324 try testing.expectEqual(Type.ContainerLayout.auto, infoE.layout);
325 try testing.expectEqualSlices(u8, "0", infoE.fields[0].name);
326 try testing.expectEqual(comptime_int, infoE.fields[0].type);
327 try testing.expectEqual(@as(comptime_int, 1), infoE.fields[0].defaultValue().?);
328 try testing.expectEqualSlices(u8, "1", infoE.fields[1].name);
329 try testing.expectEqual(comptime_int, infoE.fields[1].type);
330 try testing.expectEqual(@as(comptime_int, 2), infoE.fields[1].defaultValue().?);
331 try testing.expectEqual(@as(usize, 0), infoE.decls.len);
332 try testing.expectEqual(@as(bool, true), infoE.is_tuple);
333
334198 // empty struct
335 const F = @Type(@typeInfo(struct {}));
199 const F = @Struct(.auto, null, &.{}, &.{}, &.{});
336200 const infoF = @typeInfo(F).@"struct";
337201 try testing.expectEqual(Type.ContainerLayout.auto, infoF.layout);
338202 try testing.expect(infoF.fields.len == 0);
339203 try testing.expectEqual(@as(bool, false), infoF.is_tuple);
340
341 // empty tuple
342 const G = @Type(@typeInfo(@TypeOf(.{})));
343 const infoG = @typeInfo(G).@"struct";
344 try testing.expectEqual(Type.ContainerLayout.auto, infoG.layout);
345 try testing.expect(infoG.fields.len == 0);
346 try testing.expectEqual(@as(bool, true), infoG.is_tuple);
347204}
348205
349206test "Type.Enum" {
350207 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
351208 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
352209
353 const Foo = @Type(.{
354 .@"enum" = .{
355 .tag_type = u8,
356 .fields = &.{
357 .{ .name = "a", .value = 1 },
358 .{ .name = "b", .value = 5 },
359 },
360 .decls = &.{},
361 .is_exhaustive = true,
362 },
363 });
210 const Foo = @Enum(u8, .exhaustive, &.{ "a", "b" }, &.{ 1, 5 });
364211 try testing.expectEqual(true, @typeInfo(Foo).@"enum".is_exhaustive);
365212 try testing.expectEqual(@as(u8, 1), @intFromEnum(Foo.a));
366213 try testing.expectEqual(@as(u8, 5), @intFromEnum(Foo.b));
367 const Bar = @Type(.{
368 .@"enum" = .{
369 .tag_type = u32,
370 .fields = &.{
371 .{ .name = "a", .value = 1 },
372 .{ .name = "b", .value = 5 },
373 },
374 .decls = &.{},
375 .is_exhaustive = false,
376 },
377 });
214 const Bar = @Enum(u32, .nonexhaustive, &.{ "a", "b" }, &.{ 1, 5 });
378215 try testing.expectEqual(false, @typeInfo(Bar).@"enum".is_exhaustive);
379216 try testing.expectEqual(@as(u32, 1), @intFromEnum(Bar.a));
380217 try testing.expectEqual(@as(u32, 5), @intFromEnum(Bar.b));
......@@ -382,12 +219,7 @@ test "Type.Enum" {
382219
383220 { // from https://github.com/ziglang/zig/issues/19985
384221 { // enum with single field can be initialized.
385 const E = @Type(.{ .@"enum" = .{
386 .tag_type = u0,
387 .is_exhaustive = true,
388 .fields = &.{.{ .name = "foo", .value = 0 }},
389 .decls = &.{},
390 } });
222 const E = @Enum(u0, .exhaustive, &.{"foo"}, &.{0});
391223 const s: struct { E } = .{.foo};
392224 try testing.expectEqual(.foo, s[0]);
393225 }
......@@ -411,60 +243,20 @@ test "Type.Union" {
411243 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
412244 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
413245
414 const Untagged = @Type(.{
415 .@"union" = .{
416 .layout = .@"extern",
417 .tag_type = null,
418 .fields = &.{
419 .{ .name = "int", .type = i32, .alignment = @alignOf(f32) },
420 .{ .name = "float", .type = f32, .alignment = @alignOf(f32) },
421 },
422 .decls = &.{},
423 },
424 });
246 const Untagged = @Union(.@"extern", null, &.{ "int", "float" }, &.{ i32, f32 }, &.{ .{}, .{} });
425247 var untagged = Untagged{ .int = 1 };
426248 untagged.float = 2.0;
427249 untagged.int = 3;
428250 try testing.expectEqual(@as(i32, 3), untagged.int);
429251
430 const PackedUntagged = @Type(.{
431 .@"union" = .{
432 .layout = .@"packed",
433 .tag_type = null,
434 .fields = &.{
435 .{ .name = "signed", .type = i32, .alignment = 0 },
436 .{ .name = "unsigned", .type = u32, .alignment = 0 },
437 },
438 .decls = &.{},
439 },
440 });
252 const PackedUntagged = @Union(.@"packed", null, &.{ "signed", "unsigned" }, &.{ i32, u32 }, &.{ .{}, .{} });
441253 var packed_untagged: PackedUntagged = .{ .signed = -1 };
442254 _ = &packed_untagged;
443255 try testing.expectEqual(@as(i32, -1), packed_untagged.signed);
444256 try testing.expectEqual(~@as(u32, 0), packed_untagged.unsigned);
445257
446 const Tag = @Type(.{
447 .@"enum" = .{
448 .tag_type = u1,
449 .fields = &.{
450 .{ .name = "signed", .value = 0 },
451 .{ .name = "unsigned", .value = 1 },
452 },
453 .decls = &.{},
454 .is_exhaustive = true,
455 },
456 });
457 const Tagged = @Type(.{
458 .@"union" = .{
459 .layout = .auto,
460 .tag_type = Tag,
461 .fields = &.{
462 .{ .name = "signed", .type = i32, .alignment = @alignOf(i32) },
463 .{ .name = "unsigned", .type = u32, .alignment = @alignOf(u32) },
464 },
465 .decls = &.{},
466 },
467 });
258 const Tag = @Enum(u1, .exhaustive, &.{ "signed", "unsigned" }, &.{ 0, 1 });
259 const Tagged = @Union(.auto, Tag, &.{ "signed", "unsigned" }, &.{ i32, u32 }, &.{ .{}, .{} });
468260 var tagged = Tagged{ .signed = -1 };
469261 try testing.expectEqual(Tag.signed, @as(Tag, tagged));
470262 tagged = .{ .unsigned = 1 };
......@@ -472,74 +264,26 @@ test "Type.Union" {
472264}
473265
474266test "Type.Union from Type.Enum" {
475 const Tag = @Type(.{
476 .@"enum" = .{
477 .tag_type = u0,
478 .fields = &.{
479 .{ .name = "working_as_expected", .value = 0 },
480 },
481 .decls = &.{},
482 .is_exhaustive = true,
483 },
484 });
485 const T = @Type(.{
486 .@"union" = .{
487 .layout = .auto,
488 .tag_type = Tag,
489 .fields = &.{
490 .{ .name = "working_as_expected", .type = u32, .alignment = @alignOf(u32) },
491 },
492 .decls = &.{},
493 },
494 });
267 const Tag = @Enum(u0, .exhaustive, &.{"working_as_expected"}, &.{0});
268 const T = @Union(.auto, Tag, &.{"working_as_expected"}, &.{u32}, &.{.{}});
495269 _ = @typeInfo(T).@"union";
496270}
497271
498272test "Type.Union from regular enum" {
499273 const E = enum { working_as_expected };
500 const T = @Type(.{
501 .@"union" = .{
502 .layout = .auto,
503 .tag_type = E,
504 .fields = &.{
505 .{ .name = "working_as_expected", .type = u32, .alignment = @alignOf(u32) },
506 },
507 .decls = &.{},
508 },
509 });
274 const T = @Union(.auto, E, &.{"working_as_expected"}, &.{u32}, &.{.{}});
510275 _ = @typeInfo(T).@"union";
511276}
512277
513278test "Type.Union from empty regular enum" {
514279 const E = enum {};
515 const U = @Type(.{
516 .@"union" = .{
517 .layout = .auto,
518 .tag_type = E,
519 .fields = &.{},
520 .decls = &.{},
521 },
522 });
280 const U = @Union(.auto, E, &.{}, &.{}, &.{});
523281 try testing.expectEqual(@sizeOf(U), 0);
524282}
525283
526284test "Type.Union from empty Type.Enum" {
527 const E = @Type(.{
528 .@"enum" = .{
529 .tag_type = u0,
530 .fields = &.{},
531 .decls = &.{},
532 .is_exhaustive = true,
533 },
534 });
535 const U = @Type(.{
536 .@"union" = .{
537 .layout = .auto,
538 .tag_type = E,
539 .fields = &.{},
540 .decls = &.{},
541 },
542 });
285 const E = @Enum(u0, .exhaustive, &.{}, &.{});
286 const U = @Union(.auto, E, &.{}, &.{}, &.{});
543287 try testing.expectEqual(@sizeOf(U), 0);
544288}
545289
......@@ -548,47 +292,22 @@ test "Type.Fn" {
548292
549293 const some_opaque = opaque {};
550294 const some_ptr = *some_opaque;
551 const T = fn (c_int, some_ptr) callconv(.c) void;
552
553 {
554 const fn_info = std.builtin.Type{ .@"fn" = .{
555 .calling_convention = .c,
556 .is_generic = false,
557 .is_var_args = false,
558 .return_type = void,
559 .params = &.{
560 .{ .is_generic = false, .is_noalias = false, .type = c_int },
561 .{ .is_generic = false, .is_noalias = false, .type = some_ptr },
562 },
563 } };
564
565 const fn_type = @Type(fn_info);
566 try std.testing.expectEqual(T, fn_type);
567 }
568295
569 {
570 const fn_info = @typeInfo(T);
571 const fn_type = @Type(fn_info);
572 try std.testing.expectEqual(T, fn_type);
573 }
296 const A = @Fn(&.{ c_int, some_ptr }, &@splat(.{}), void, .{ .@"callconv" = .c });
297 comptime assert(A == fn (c_int, some_ptr) callconv(.c) void);
298
299 const B = @Fn(&.{ c_int, some_ptr, u32 }, &.{ .{}, .{ .@"noalias" = true }, .{} }, u64, .{});
300 comptime assert(B == fn (c_int, noalias some_ptr, u32) u64);
301
302 const C = @Fn(&.{?[*]u8}, &.{.{}}, *const anyopaque, .{ .@"callconv" = .c, .varargs = true });
303 comptime assert(C == fn (?[*]u8, ...) callconv(.c) *const anyopaque);
574304}
575305
576306test "reified struct field name from optional payload" {
577307 comptime {
578308 const m_name: ?[1:0]u8 = "a".*;
579309 if (m_name) |*name| {
580 const T = @Type(.{ .@"struct" = .{
581 .layout = .auto,
582 .fields = &.{.{
583 .name = name,
584 .type = u8,
585 .default_value_ptr = null,
586 .is_comptime = false,
587 .alignment = 1,
588 }},
589 .decls = &.{},
590 .is_tuple = false,
591 } });
310 const T = @Struct(.auto, null, &.{name}, &.{u8}, &.{.{}});
592311 const t: T = .{ .a = 123 };
593312 try std.testing.expect(t.a == 123);
594313 }
......@@ -598,20 +317,7 @@ test "reified struct field name from optional payload" {
598317test "reified union uses @alignOf" {
599318 const S = struct {
600319 fn CreateUnion(comptime T: type) type {
601 return @Type(.{
602 .@"union" = .{
603 .layout = .auto,
604 .tag_type = null,
605 .fields = &[_]std.builtin.Type.UnionField{
606 .{
607 .name = "field",
608 .type = T,
609 .alignment = @alignOf(T),
610 },
611 },
612 .decls = &.{},
613 },
614 });
320 return @Union(.auto, null, &.{"field"}, &.{T}, &.{.{}});
615321 }
616322 };
617323 _ = S.CreateUnion(struct {});
......@@ -620,22 +326,13 @@ test "reified union uses @alignOf" {
620326test "reified struct uses @alignOf" {
621327 const S = struct {
622328 fn NamespacedGlobals(comptime modules: anytype) type {
623 return @Type(.{
624 .@"struct" = .{
625 .layout = .auto,
626 .is_tuple = false,
627 .fields = &.{
628 .{
629 .name = "globals",
630 .type = modules.mach.globals,
631 .default_value_ptr = null,
632 .is_comptime = false,
633 .alignment = @alignOf(modules.mach.globals),
634 },
635 },
636 .decls = &.{},
637 },
638 });
329 return @Struct(
330 .auto,
331 null,
332 &.{"globals"},
333 &.{modules.mach.globals},
334 &.{.{ .@"align" = @alignOf(modules.mach.globals) }},
335 );
639336 }
640337 };
641338 _ = S.NamespacedGlobals(.{
......@@ -645,56 +342,10 @@ test "reified struct uses @alignOf" {
645342 });
646343}
647344
648test "reified error set initialized with field pointer" {
649 const S = struct {
650 const info = .{
651 .args = [_]Type.Error{
652 .{ .name = "bar" },
653 },
654 };
655 const Foo = @Type(.{
656 .error_set = &info.args,
657 });
658 };
659 try testing.expect(S.Foo == error{bar});
660}
661test "reified function type params initialized with field pointer" {
662 const S = struct {
663 const fn_info = .{
664 .params = [_]Type.Fn.Param{
665 .{ .is_generic = false, .is_noalias = false, .type = u8 },
666 },
667 };
668 const Bar = @Type(.{
669 .@"fn" = .{
670 .calling_convention = .auto,
671 .is_generic = false,
672 .is_var_args = false,
673 .return_type = void,
674 .params = &fn_info.params,
675 },
676 });
677 };
678 try testing.expect(@typeInfo(S.Bar) == .@"fn");
679}
680
681345test "empty struct assigned to reified struct field" {
682346 const S = struct {
683347 fn NamespacedComponents(comptime modules: anytype) type {
684 return @Type(.{
685 .@"struct" = .{
686 .layout = .auto,
687 .is_tuple = false,
688 .fields = &.{.{
689 .name = "components",
690 .type = @TypeOf(modules.components),
691 .default_value_ptr = null,
692 .is_comptime = false,
693 .alignment = @alignOf(@TypeOf(modules.components)),
694 }},
695 .decls = &.{},
696 },
697 });
348 return @Struct(.auto, null, &.{"components"}, &.{@TypeOf(modules.components)}, &.{.{}});
698349 }
699350
700351 fn namespacedComponents(comptime modules: anytype) NamespacedComponents(modules) {
......@@ -710,16 +361,6 @@ test "empty struct assigned to reified struct field" {
710361 });
711362}
712363
713test "@Type should resolve its children types" {
714 const sparse = enum(u2) { a, b, c };
715 const dense = enum(u2) { a, b, c, d };
716
717 comptime var sparse_info = @typeInfo(anyerror!sparse);
718 sparse_info.error_union.payload = dense;
719 const B = @Type(sparse_info);
720 try testing.expectEqual(anyerror!dense, B);
721}
722
723364test "struct field names sliced at comptime from larger string" {
724365 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
725366
......@@ -729,28 +370,14 @@ test "struct field names sliced at comptime from larger string" {
729370 \\f3
730371 ;
731372 comptime {
732 var fields: []const Type.StructField = &[0]Type.StructField{};
373 var field_names: []const []const u8 = &.{};
733374
734375 var it = std.mem.tokenizeScalar(u8, text, '\n');
735376 while (it.next()) |name| {
736 fields = fields ++ &[_]Type.StructField{.{
737 .alignment = @alignOf(usize),
738 .name = name ++ "",
739 .type = usize,
740 .default_value_ptr = null,
741 .is_comptime = false,
742 }};
377 field_names = field_names ++ @as([]const []const u8, &.{name});
743378 }
744379
745 const T = @Type(.{
746 .@"struct" = .{
747 .layout = .auto,
748 .is_tuple = false,
749 .fields = fields,
750 .decls = &.{},
751 },
752 });
753
380 const T = @Struct(.auto, null, field_names, &@splat(usize), &@splat(.{}));
754381 const gen_fields = @typeInfo(T).@"struct".fields;
755382 try testing.expectEqual(3, gen_fields.len);
756383 try testing.expectEqualStrings("f1", gen_fields[0].name);
......@@ -762,10 +389,7 @@ test "struct field names sliced at comptime from larger string" {
762389test "matching captures causes opaque equivalence" {
763390 const S = struct {
764391 fn UnsignedId(comptime I: type) type {
765 const U = @Type(.{ .int = .{
766 .signedness = .unsigned,
767 .bits = @typeInfo(I).int.bits,
768 } });
392 const U = @Int(.unsigned, @typeInfo(I).int.bits);
769393 return opaque {
770394 fn id(x: U) U {
771395 return x;
......@@ -785,17 +409,9 @@ test "matching captures causes opaque equivalence" {
785409}
786410
787411test "reify enum where fields refers to part of array" {
788 const fields: [3]std.builtin.Type.EnumField = .{
789 .{ .name = "foo", .value = 0 },
790 .{ .name = "bar", .value = 1 },
791 undefined,
792 };
793 const E = @Type(.{ .@"enum" = .{
794 .tag_type = u8,
795 .fields = fields[0..2],
796 .decls = &.{},
797 .is_exhaustive = true,
798 } });
412 const field_names: [3][]const u8 = .{ "foo", "bar", undefined };
413 const field_values: [3]u8 = .{ undefined, 0, 1 };
414 const E = @Enum(u8, .exhaustive, field_names[0..2], field_values[1..3]);
799415 var a: E = undefined;
800416 var b: E = undefined;
801417 a = .foo;
test/behavior/union.zig+2-8
......@@ -2198,14 +2198,8 @@ test "matching captures causes union equivalence" {
21982198 fn SignedUnsigned(comptime I: type) type {
21992199 const bits = @typeInfo(I).int.bits;
22002200 return union {
2201 u: @Type(.{ .int = .{
2202 .signedness = .unsigned,
2203 .bits = bits,
2204 } }),
2205 i: @Type(.{ .int = .{
2206 .signedness = .signed,
2207 .bits = bits,
2208 } }),
2201 u: @Int(.unsigned, bits),
2202 i: @Int(.signed, bits),
22092203 };
22102204 }
22112205 };
test/behavior/x86_64/math.zig+5-14
......@@ -36,34 +36,28 @@ pub fn ChangeScalar(comptime Type: type, comptime NewScalar: type) type {
3636}
3737pub fn AsSignedness(comptime Type: type, comptime signedness: std.builtin.Signedness) type {
3838 return switch (@typeInfo(Scalar(Type))) {
39 .int => |int| ChangeScalar(Type, @Type(.{ .int = .{
40 .signedness = signedness,
41 .bits = int.bits,
42 } })),
39 .int => |int| ChangeScalar(Type, @Int(signedness, int.bits)),
4340 .float => Type,
4441 else => @compileError(@typeName(Type)),
4542 };
4643}
4744pub fn AddOneBit(comptime Type: type) type {
4845 return ChangeScalar(Type, switch (@typeInfo(Scalar(Type))) {
49 .int => |int| @Type(.{ .int = .{ .signedness = int.signedness, .bits = 1 + int.bits } }),
46 .int => |int| @Int(int.signedness, 1 + int.bits),
5047 .float => Scalar(Type),
5148 else => @compileError(@typeName(Type)),
5249 });
5350}
5451pub fn DoubleBits(comptime Type: type) type {
5552 return ChangeScalar(Type, switch (@typeInfo(Scalar(Type))) {
56 .int => |int| @Type(.{ .int = .{ .signedness = int.signedness, .bits = int.bits * 2 } }),
53 .int => |int| @Int(int.signedness, int.bits * 2),
5754 .float => Scalar(Type),
5855 else => @compileError(@typeName(Type)),
5956 });
6057}
6158pub fn RoundBitsUp(comptime Type: type, comptime multiple: u16) type {
6259 return ChangeScalar(Type, switch (@typeInfo(Scalar(Type))) {
63 .int => |int| @Type(.{ .int = .{
64 .signedness = int.signedness,
65 .bits = std.mem.alignForward(u16, int.bits, multiple),
66 } }),
60 .int => |int| @Int(int.signedness, std.mem.alignForward(u16, int.bits, multiple)),
6761 .float => Scalar(Type),
6862 else => @compileError(@typeName(Type)),
6963 });
......@@ -83,10 +77,7 @@ pub fn splat(comptime Type: type, scalar: Scalar(Type)) Type {
8377pub fn sign(rhs: anytype) ChangeScalar(@TypeOf(rhs), bool) {
8478 const Int = ChangeScalar(@TypeOf(rhs), switch (@typeInfo(Scalar(@TypeOf(rhs)))) {
8579 .int, .comptime_int => Scalar(@TypeOf(rhs)),
86 .float => |float| @Type(.{ .int = .{
87 .signedness = .signed,
88 .bits = float.bits,
89 } }),
80 .float => |float| @Int(.signed, float.bits),
9081 else => @compileError(@typeName(@TypeOf(rhs))),
9182 });
9283 return @as(Int, @bitCast(rhs)) < splat(Int, 0);
test/cases/compile_errors/@import_zon_bad_type.zig+1-1
......@@ -116,7 +116,7 @@ export fn testMutablePointer() void {
116116// tmp.zig:85:26: note: ZON does not allow nested optionals
117117// tmp.zig:90:29: error: type '*i32' is not available in ZON
118118// tmp.zig:90:29: note: ZON does not allow mutable pointers
119// neg_inf.zon:1:1: error: expected type '@Type(.enum_literal)'
119// neg_inf.zon:1:1: error: expected type '@EnumLiteral()'
120120// tmp.zig:37:38: note: imported here
121121// neg_inf.zon:1:1: error: expected type '?u8'
122122// tmp.zig:57:28: note: imported here
test/cases/compile_errors/@import_zon_opt_in_err.zig+1-1
......@@ -70,7 +70,7 @@ export fn testVector() void {
7070// tmp.zig:22:29: note: imported here
7171// vec2.zon:1:2: error: expected type '?tmp.Enum'
7272// tmp.zig:28:30: note: imported here
73// vec2.zon:1:2: error: expected type '?@Type(.enum_literal)'
73// vec2.zon:1:2: error: expected type '?@EnumLiteral()'
7474// tmp.zig:33:39: note: imported here
7575// vec2.zon:1:2: error: expected type '?[1]u8'
7676// tmp.zig:38:31: note: imported here
test/cases/compile_errors/align_zero.zig+4-24
......@@ -38,31 +38,11 @@ export fn i() void {
3838}
3939
4040export fn j() void {
41 _ = @Type(.{ .@"struct" = .{
42 .layout = .auto,
43 .fields = &.{.{
44 .name = "test",
45 .type = u32,
46 .default_value_ptr = null,
47 .is_comptime = false,
48 .alignment = 0,
49 }},
50 .decls = &.{},
51 .is_tuple = false,
52 } });
41 _ = @Struct(.auto, null, &.{"test"}, &.{u32}, &.{.{ .@"align" = 0 }});
5342}
5443
5544export fn k() void {
56 _ = @Type(.{ .pointer = .{
57 .size = .one,
58 .is_const = false,
59 .is_volatile = false,
60 .alignment = 0,
61 .address_space = .generic,
62 .child = u32,
63 .is_allowzero = false,
64 .sentinel_ptr = null,
65 } });
45 _ = @Pointer(.one, .{ .@"align" = 0 }, u32, null);
6646}
6747
6848// error
......@@ -76,5 +56,5 @@ export fn k() void {
7656// :29:17: error: alignment must be >= 1
7757// :33:35: error: alignment must be >= 1
7858// :37:34: error: alignment must be >= 1
79// :41:9: error: alignment must be >= 1
80// :56:9: error: alignment must be >= 1
59// :41:51: error: alignment must be >= 1
60// :45:25: error: alignment must be >= 1
test/cases/compile_errors/attempt_to_cast_enum_literal_to_error.zig+1-1
......@@ -6,4 +6,4 @@ export fn entry() void {
66
77// error
88//
9// :3:10: error: expected type 'error{Hi}', found '@Type(.enum_literal)'
9// :3:10: error: expected type 'error{Hi}', found '@EnumLiteral()'
test/cases/compile_errors/attempt_to_create_17_bit_float_type.zig deleted-8
......@@ -1,8 +0,0 @@
1const builtin = @import("std").builtin;
2comptime {
3 _ = @Type(.{ .float = .{ .bits = 17 } });
4}
5
6// error
7//
8// :3:9: error: 17-bit float unsupported
test/cases/compile_errors/enum_with_declarations_unavailable_for_reify_type.zig deleted-10
......@@ -1,10 +0,0 @@
1export fn entry() void {
2 _ = @Type(@typeInfo(enum {
3 foo,
4 pub const bar = 1;
5 }));
6}
7
8// error
9//
10// :2:9: error: reified enums must have no decls
test/cases/compile_errors/error_set_decl_literal.zig+1-1
......@@ -6,4 +6,4 @@ export fn entry() void {
66
77// error
88//
9// :3:19: error: expected type 'error{Foo}', found '@Type(.enum_literal)'
9// :3:19: error: expected type 'error{Foo}', found '@EnumLiteral()'
test/cases/compile_errors/invalid_pointer_to_opaque.zig+5-32
......@@ -9,40 +9,13 @@ export fn c() void {
99}
1010
1111export fn d() void {
12 _ = @Type(.{ .pointer = .{
13 .size = .slice,
14 .is_const = false,
15 .is_volatile = false,
16 .alignment = 1,
17 .address_space = .generic,
18 .child = anyopaque,
19 .is_allowzero = false,
20 .sentinel_ptr = null,
21 } });
12 _ = @Pointer(.slice, .{}, anyopaque, null);
2213}
2314export fn e() void {
24 _ = @Type(.{ .pointer = .{
25 .size = .many,
26 .is_const = false,
27 .is_volatile = false,
28 .alignment = 1,
29 .address_space = .generic,
30 .child = anyopaque,
31 .is_allowzero = false,
32 .sentinel_ptr = null,
33 } });
15 _ = @Pointer(.many, .{}, anyopaque, null);
3416}
3517export fn f() void {
36 _ = @Type(.{ .pointer = .{
37 .size = .c,
38 .is_const = false,
39 .is_volatile = false,
40 .alignment = 1,
41 .address_space = .generic,
42 .child = anyopaque,
43 .is_allowzero = false,
44 .sentinel_ptr = null,
45 } });
18 _ = @Pointer(.c, .{}, anyopaque, null);
4619}
4720
4821// error
......@@ -51,5 +24,5 @@ export fn f() void {
5124// :5:12: error: indexable pointer to opaque type 'anyopaque' not allowed
5225// :8:13: error: indexable pointer to opaque type 'anyopaque' not allowed
5326// :12:9: error: indexable pointer to opaque type 'anyopaque' not allowed
54// :24:9: error: indexable pointer to opaque type 'anyopaque' not allowed
55// :36:9: error: indexable pointer to opaque type 'anyopaque' not allowed
27// :15:9: error: indexable pointer to opaque type 'anyopaque' not allowed
28// :18:9: error: indexable pointer to opaque type 'anyopaque' not allowed
test/cases/compile_errors/invalid_pointer_with_reify_type.zig+2-11
......@@ -1,16 +1,7 @@
11export fn entry() void {
2 _ = @Type(.{ .pointer = .{
3 .size = .one,
4 .is_const = false,
5 .is_volatile = false,
6 .alignment = 1,
7 .address_space = .generic,
8 .child = u8,
9 .is_allowzero = false,
10 .sentinel_ptr = &@as(u8, 0),
11 } });
2 _ = @Pointer(.one, .{}, u8, 0);
123}
134
145// error
156//
16// :2:9: error: sentinels are only allowed on slices and unknown-length pointers
7// :2:33: error: sentinels are only allowed on slices and unknown-length pointers
test/cases/compile_errors/minmax_nonnumeric_operand.zig+1-1
......@@ -36,4 +36,4 @@ const Union = union { foo: void };
3636// :13:29: error: expected number, found 'tmp.Union'
3737// :19:15: note: union declared here
3838// :14:61: error: expected number, found 'fn () u8'
39// :15:25: error: expected number, found '@Type(.enum_literal)'
39// :15:25: error: expected number, found '@EnumLiteral()'
test/cases/compile_errors/nested_vectors.zig+2-2
......@@ -1,10 +1,10 @@
11export fn entry() void {
22 const V1 = @Vector(4, u8);
3 const V2 = @Type(.{ .vector = .{ .len = 4, .child = V1 } });
3 const V2 = @Vector(4, V1);
44 const v: V2 = undefined;
55 _ = v;
66}
77
88// error
99//
10// :3:16: error: expected integer, float, bool, or pointer for the vector element type; found '@Vector(4, u8)'
10// :3:27: error: expected integer, float, bool, or pointer for the vector element type; found '@Vector(4, u8)'
test/cases/compile_errors/non_constant_expression_in_array_size.zig+1-1
......@@ -14,4 +14,4 @@ export fn entry() usize {
1414//
1515// :6:12: error: unable to resolve comptime value
1616// :2:12: note: called at comptime from here
17// :1:13: note: struct fields must be comptime-known
17// :1:13: note: types must be comptime-known
test/cases/compile_errors/non_scalar_sentinel.zig+4-27
......@@ -12,31 +12,10 @@ comptime {
1212}
1313
1414comptime {
15 _ = @Type(.{ .array = .{ .child = S, .len = 0, .sentinel_ptr = &sentinel } });
15 _ = @Pointer(.slice, .{}, S, sentinel);
1616}
1717comptime {
18 _ = @Type(.{ .pointer = .{
19 .size = .slice,
20 .is_const = false,
21 .is_volatile = false,
22 .alignment = @alignOf(S),
23 .address_space = .generic,
24 .child = S,
25 .is_allowzero = false,
26 .sentinel_ptr = &sentinel,
27 } });
28}
29comptime {
30 _ = @Type(.{ .pointer = .{
31 .size = .many,
32 .is_const = false,
33 .is_volatile = false,
34 .alignment = @alignOf(S),
35 .address_space = .generic,
36 .child = S,
37 .is_allowzero = false,
38 .sentinel_ptr = &sentinel,
39 } });
18 _ = @Pointer(.many, .{}, S, sentinel);
4019}
4120
4221// error
......@@ -47,9 +26,7 @@ comptime {
4726// :1:11: note: struct declared here
4827// :11:12: error: non-scalar sentinel type 'tmp.S'
4928// :1:11: note: struct declared here
50// :15:9: error: non-scalar sentinel type 'tmp.S'
51// :1:11: note: struct declared here
52// :18:9: error: non-scalar sentinel type 'tmp.S'
29// :15:34: error: non-scalar sentinel type 'tmp.S'
5330// :1:11: note: struct declared here
54// :30:9: error: non-scalar sentinel type 'tmp.S'
31// :18:33: error: non-scalar sentinel type 'tmp.S'
5532// :1:11: note: struct declared here
test/cases/compile_errors/reified_enum_field_value_overflow.zig+2-11
......@@ -1,17 +1,8 @@
11comptime {
2 const E = @Type(.{ .@"enum" = .{
3 .tag_type = u1,
4 .fields = &.{
5 .{ .name = "f0", .value = 0 },
6 .{ .name = "f1", .value = 1 },
7 .{ .name = "f2", .value = 2 },
8 },
9 .decls = &.{},
10 .is_exhaustive = true,
11 } });
2 const E = @Enum(u1, .exhaustive, &.{ "f0", "f1", "f2" }, &.{ 0, 1, 2 });
123 _ = E;
134}
145
156// error
167//
17// :2:15: error: field 'f2' with enumeration value '2' is too large for backing int type 'u1'
8// :2:72: error: type 'u1' cannot represent integer value '2'
test/cases/compile_errors/reify_enum_with_duplicate_field.zig+3-13
......@@ -1,18 +1,8 @@
11export fn entry() void {
2 _ = @Type(.{
3 .@"enum" = .{
4 .tag_type = u32,
5 .fields = &.{
6 .{ .name = "A", .value = 0 },
7 .{ .name = "A", .value = 1 },
8 },
9 .decls = &.{},
10 .is_exhaustive = false,
11 },
12 });
2 _ = @Enum(u32, .nonexhaustive, &.{ "A", "A" }, &.{ 0, 1 });
133}
144
155// error
166//
17// :2:9: error: duplicate enum field 'A'
18// :2:9: note: other field here
7// :2:36: error: duplicate enum field 'A'
8// :2:36: note: other field here
test/cases/compile_errors/reify_enum_with_duplicate_tag_value.zig+3-13
......@@ -1,18 +1,8 @@
11export fn entry() void {
2 _ = @Type(.{
3 .@"enum" = .{
4 .tag_type = u32,
5 .fields = &.{
6 .{ .name = "A", .value = 10 },
7 .{ .name = "B", .value = 10 },
8 },
9 .decls = &.{},
10 .is_exhaustive = false,
11 },
12 });
2 _ = @Enum(u32, .nonexhaustive, &.{ "A", "B" }, &.{ 10, 10 });
133}
144
155// error
166//
17// :2:9: error: enum tag value 10 already taken
18// :2:9: note: other enum tag value here
7// :2:52: error: enum tag value 10 already taken
8// :2:52: note: other enum tag value here
test/cases/compile_errors/reify_struct.zig+6-69
......@@ -1,79 +1,16 @@
11comptime {
2 @Type(.{ .@"struct" = .{
3 .layout = .auto,
4 .fields = &.{.{
5 .name = "foo",
6 .type = u32,
7 .default_value_ptr = null,
8 .is_comptime = false,
9 .alignment = 4,
10 }},
11 .decls = &.{},
12 .is_tuple = true,
13 } });
2 @Struct(.auto, null, &.{"foo"}, &.{u32}, &.{.{ .@"comptime" = true }});
143}
154comptime {
16 @Type(.{ .@"struct" = .{
17 .layout = .auto,
18 .fields = &.{.{
19 .name = "3",
20 .type = u32,
21 .default_value_ptr = null,
22 .is_comptime = false,
23 .alignment = 4,
24 }},
25 .decls = &.{},
26 .is_tuple = true,
27 } });
5 @Struct(.@"extern", null, &.{"foo"}, &.{u32}, &.{.{ .@"comptime" = true, .default_value_ptr = &@as(u32, 10) }});
286}
297comptime {
30 @Type(.{ .@"struct" = .{
31 .layout = .auto,
32 .fields = &.{.{
33 .name = "0",
34 .type = u32,
35 .default_value_ptr = null,
36 .is_comptime = true,
37 .alignment = 4,
38 }},
39 .decls = &.{},
40 .is_tuple = true,
41 } });
42}
43comptime {
44 @Type(.{ .@"struct" = .{
45 .layout = .@"extern",
46 .fields = &.{.{
47 .name = "0",
48 .type = u32,
49 .default_value_ptr = null,
50 .is_comptime = true,
51 .alignment = 4,
52 }},
53 .decls = &.{},
54 .is_tuple = false,
55 } });
56}
57comptime {
58 @Type(.{ .@"struct" = .{
59 .layout = .@"packed",
60 .fields = &.{.{
61 .name = "0",
62 .type = u32,
63 .default_value_ptr = null,
64 .is_comptime = true,
65 .alignment = 4,
66 }},
67 .decls = &.{},
68 .is_tuple = false,
69 } });
8 @Struct(.@"packed", null, &.{"foo"}, &.{u32}, &.{.{ .@"align" = 4 }});
709}
7110
7211// error
7312//
74// :2:5: error: tuple cannot have non-numeric field 'foo'
75// :16:5: error: tuple field name '3' does not match field index 0
76// :30:5: error: comptime field without default initialization value
77// :44:5: error: extern struct fields cannot be marked comptime
78// :58:5: error: alignment of a packed struct field must be set to 0
13// :2:46: error: comptime field without default initialization value
14// :5:51: error: extern struct fields cannot be marked comptime
15// :8:51: error: packed struct fields cannot be aligned
7916
test/cases/compile_errors/reify_type.Fn_with_is_generic_true.zig deleted-16
......@@ -1,16 +0,0 @@
1const Foo = @Type(.{
2 .@"fn" = .{
3 .calling_convention = .auto,
4 .is_generic = true,
5 .is_var_args = false,
6 .return_type = u0,
7 .params = &.{},
8 },
9});
10comptime {
11 _ = Foo;
12}
13
14// error
15//
16// :1:13: error: Type.Fn.is_generic must be false for @Type
test/cases/compile_errors/reify_type.Fn_with_is_var_args_true_and_non-C_callconv.zig+3-12
......@@ -1,18 +1,9 @@
1const Foo = @Type(.{
2 .@"fn" = .{
3 .calling_convention = .auto,
4 .is_generic = false,
5 .is_var_args = true,
6 .return_type = u0,
7 .params = &.{},
8 },
9});
101comptime {
11 _ = Foo;
2 _ = @Fn(&.{u32}, &.{.{}}, u8, .{ .varargs = true });
123}
134
145// error
156// target=x86_64-linux
167//
17// :1:13: error: variadic function does not support 'auto' calling convention
18// :1:13: note: supported calling conventions: 'x86_64_sysv', 'x86_64_x32', 'x86_64_win'
8// :2:36: error: variadic function does not support 'auto' calling convention
9// :2:36: note: supported calling conventions: 'x86_64_sysv', 'x86_64_x32', 'x86_64_win'
test/cases/compile_errors/reify_type.Fn_with_return_type_null.zig deleted-16
......@@ -1,16 +0,0 @@
1const Foo = @Type(.{
2 .@"fn" = .{
3 .calling_convention = .auto,
4 .is_generic = false,
5 .is_var_args = false,
6 .return_type = null,
7 .params = &.{},
8 },
9});
10comptime {
11 _ = Foo;
12}
13
14// error
15//
16// :1:13: error: Type.Fn.return_type must be non-null for @Type
test/cases/compile_errors/reify_type_for_exhaustive_enum_with_non-integer_tag_type.zig+2-9
......@@ -1,15 +1,8 @@
1const Tag = @Type(.{
2 .@"enum" = .{
3 .tag_type = bool,
4 .fields = &.{},
5 .decls = &.{},
6 .is_exhaustive = false,
7 },
8});
1const Tag = @Enum(bool, .nonexhaustive, &.{}, &.{});
92export fn entry() void {
103 _ = @as(Tag, @enumFromInt(0));
114}
125
136// error
147//
15// :1:13: error: Type.Enum.tag_type must be an integer type
8// :1:19: error: tag type must be an integer type
test/cases/compile_errors/reify_type_for_exhaustive_enum_with_undefined_tag_type.zig+2-9
......@@ -1,15 +1,8 @@
1const Tag = @Type(.{
2 .@"enum" = .{
3 .tag_type = undefined,
4 .fields = &.{},
5 .decls = &.{},
6 .is_exhaustive = false,
7 },
8});
1const Tag = @Enum(undefined, .exhaustive, &.{}, &.{});
92export fn entry() void {
103 _ = @as(Tag, @enumFromInt(0));
114}
125
136// error
147//
15// :1:20: error: use of undefined value here causes illegal behavior
8// :1:19: error: use of undefined value here causes illegal behavior
test/cases/compile_errors/reify_type_for_tagged_extern_union.zig+3-24
......@@ -1,26 +1,5 @@
1const Tag = @Type(.{
2 .@"enum" = .{
3 .tag_type = u2,
4 .fields = &.{
5 .{ .name = "signed", .value = 0 },
6 .{ .name = "unsigned", .value = 1 },
7 },
8 .decls = &.{},
9 .is_exhaustive = true,
10 },
11});
12
13const Extern = @Type(.{
14 .@"union" = .{
15 .layout = .@"extern",
16 .tag_type = Tag,
17 .fields = &.{
18 .{ .name = "signed", .type = i32, .alignment = @alignOf(i32) },
19 .{ .name = "unsigned", .type = u32, .alignment = @alignOf(u32) },
20 },
21 .decls = &.{},
22 },
23});
1const Tag = @Enum(u2, .exhaustive, &.{ "signed", "unsigned" }, &.{ 0, 1 });
2const Extern = @Union(.@"extern", Tag, &.{ "signed", "unsigned" }, &.{ i32, u32 }, &@splat(.{}));
243
254export fn entry() void {
265 const tagged: Extern = .{ .signed = -1 };
......@@ -29,4 +8,4 @@ export fn entry() void {
298
309// error
3110//
32// :13:16: error: extern union does not support enum tag type
11// :2:35: error: extern union does not support enum tag type
test/cases/compile_errors/reify_type_for_tagged_packed_union.zig+3-24
......@@ -1,26 +1,5 @@
1const Tag = @Type(.{
2 .@"enum" = .{
3 .tag_type = u2,
4 .fields = &.{
5 .{ .name = "signed", .value = 0 },
6 .{ .name = "unsigned", .value = 1 },
7 },
8 .decls = &.{},
9 .is_exhaustive = true,
10 },
11});
12
13const Packed = @Type(.{
14 .@"union" = .{
15 .layout = .@"packed",
16 .tag_type = Tag,
17 .fields = &.{
18 .{ .name = "signed", .type = i32, .alignment = @alignOf(i32) },
19 .{ .name = "unsigned", .type = u32, .alignment = @alignOf(u32) },
20 },
21 .decls = &.{},
22 },
23});
1const Tag = @Enum(u2, .exhaustive, &.{ "signed", "unsigned" }, &.{ 0, 1 });
2const Packed = @Union(.@"packed", Tag, &.{ "signed", "unsigned" }, &.{ i32, u32 }, &@splat(.{}));
243
254export fn entry() void {
265 const tagged: Packed = .{ .signed = -1 };
......@@ -29,4 +8,4 @@ export fn entry() void {
298
309// error
3110//
32// :13:16: error: packed union does not support enum tag type
11// :2:35: error: packed union does not support enum tag type
test/cases/compile_errors/reify_type_for_tagged_union_with_extra_enum_field.zig+3-24
......@@ -1,26 +1,5 @@
1const Tag = @Type(.{
2 .@"enum" = .{
3 .tag_type = u2,
4 .fields = &.{
5 .{ .name = "signed", .value = 0 },
6 .{ .name = "unsigned", .value = 1 },
7 .{ .name = "arst", .value = 2 },
8 },
9 .decls = &.{},
10 .is_exhaustive = true,
11 },
12});
13const Tagged = @Type(.{
14 .@"union" = .{
15 .layout = .auto,
16 .tag_type = Tag,
17 .fields = &.{
18 .{ .name = "signed", .type = i32, .alignment = @alignOf(i32) },
19 .{ .name = "unsigned", .type = u32, .alignment = @alignOf(u32) },
20 },
21 .decls = &.{},
22 },
23});
1const Tag = @Enum(u2, .exhaustive, &.{ "signed", "unsigned", "arst" }, &.{ 0, 1, 2 });
2const Tagged = @Union(.auto, Tag, &.{ "signed", "unsigned" }, &.{ i32, u32 }, &@splat(.{}));
243export fn entry() void {
254 var tagged = Tagged{ .signed = -1 };
265 tagged = .{ .unsigned = 1 };
......@@ -28,6 +7,6 @@ export fn entry() void {
287
298// error
309//
31// :13:16: error: enum fields missing in union
10// :2:35: error: 1 enum fields missing in union
3211// :1:13: note: field 'arst' missing, declared here
3312// :1:13: note: enum declared here
test/cases/compile_errors/reify_type_for_tagged_union_with_extra_union_field.zig+3-24
......@@ -1,26 +1,5 @@
1const Tag = @Type(.{
2 .@"enum" = .{
3 .tag_type = u1,
4 .fields = &.{
5 .{ .name = "signed", .value = 0 },
6 .{ .name = "unsigned", .value = 1 },
7 },
8 .decls = &.{},
9 .is_exhaustive = true,
10 },
11});
12const Tagged = @Type(.{
13 .@"union" = .{
14 .layout = .auto,
15 .tag_type = Tag,
16 .fields = &.{
17 .{ .name = "signed", .type = i32, .alignment = @alignOf(i32) },
18 .{ .name = "unsigned", .type = u32, .alignment = @alignOf(u32) },
19 .{ .name = "arst", .type = f32, .alignment = @alignOf(f32) },
20 },
21 .decls = &.{},
22 },
23});
1const Tag = @Enum(u1, .exhaustive, &.{ "signed", "unsigned" }, &.{ 0, 1 });
2const Tagged = @Union(.auto, Tag, &.{ "signed", "unsigned", "arst" }, &.{ i32, u32, f32 }, &@splat(.{}));
243export fn entry() void {
254 var tagged = Tagged{ .signed = -1 };
265 tagged = .{ .unsigned = 1 };
......@@ -28,5 +7,5 @@ export fn entry() void {
287
298// error
309//
31// :12:16: error: no field named 'arst' in enum 'tmp.Tag'
10// :2:35: error: no field named 'arst' in enum 'tmp.Tag'
3211// :1:13: note: enum declared here
test/cases/compile_errors/reify_type_for_tagged_union_with_no_enum_fields.zig+3-20
......@@ -1,22 +1,5 @@
1const Tag = @Type(.{
2 .@"enum" = .{
3 .tag_type = u0,
4 .fields = &.{},
5 .decls = &.{},
6 .is_exhaustive = true,
7 },
8});
9const Tagged = @Type(.{
10 .@"union" = .{
11 .layout = .auto,
12 .tag_type = Tag,
13 .fields = &.{
14 .{ .name = "signed", .type = i32, .alignment = @alignOf(i32) },
15 .{ .name = "unsigned", .type = u32, .alignment = @alignOf(u32) },
16 },
17 .decls = &.{},
18 },
19});
1const Tag = @Enum(u0, .exhaustive, &.{}, &.{});
2const Tagged = @Union(.auto, Tag, &.{ "signed", "unsigned" }, &.{ i32, u32 }, &@splat(.{}));
203export fn entry() void {
214 const tagged: Tagged = undefined;
225 _ = tagged;
......@@ -24,5 +7,5 @@ export fn entry() void {
247
258// error
269//
27// :9:16: error: no field named 'signed' in enum 'tmp.Tag'
10// :2:35: error: no field named 'signed' in enum 'tmp.Tag'
2811// :1:13: note: enum declared here
test/cases/compile_errors/reify_type_for_tagged_union_with_no_union_fields.zig+3-20
......@@ -1,22 +1,5 @@
1const Tag = @Type(.{
2 .@"enum" = .{
3 .tag_type = u1,
4 .fields = &.{
5 .{ .name = "signed", .value = 0 },
6 .{ .name = "unsigned", .value = 1 },
7 },
8 .decls = &.{},
9 .is_exhaustive = true,
10 },
11});
12const Tagged = @Type(.{
13 .@"union" = .{
14 .layout = .auto,
15 .tag_type = Tag,
16 .fields = &.{},
17 .decls = &.{},
18 },
19});
1const Tag = @Enum(u1, .exhaustive, &.{ "signed", "unsigned" }, &.{ 0, 1 });
2const Tagged = @Union(.auto, Tag, &.{}, &.{}, &.{});
203export fn entry() void {
214 const tagged: Tagged = undefined;
225 _ = tagged;
......@@ -24,7 +7,7 @@ export fn entry() void {
247
258// error
269//
27// :12:16: error: enum fields missing in union
10// :2:35: error: 2 enum fields missing in union
2811// :1:13: note: field 'signed' missing, declared here
2912// :1:13: note: field 'unsigned' missing, declared here
3013// :1:13: note: enum declared here
test/cases/compile_errors/reify_type_for_union_with_opaque_field.zig+3-12
......@@ -1,18 +1,9 @@
1const Untagged = @Type(.{
2 .@"union" = .{
3 .layout = .auto,
4 .tag_type = null,
5 .fields = &.{
6 .{ .name = "foo", .type = opaque {}, .alignment = 1 },
7 },
8 .decls = &.{},
9 },
10});
1const Untagged = @Union(.auto, null, &.{"foo"}, &.{opaque {}}, &.{.{}});
112export fn entry() usize {
123 return @sizeOf(Untagged);
134}
145
156// error
167//
17// :1:18: error: opaque types have unknown size and therefore cannot be directly embedded in unions
18// :6:39: note: opaque declared here
8// :1:49: error: opaque types have unknown size and therefore cannot be directly embedded in unions
9// :1:52: note: opaque declared here
test/cases/compile_errors/reify_type_union_payload_is_undefined.zig deleted-10
......@@ -1,10 +0,0 @@
1const Foo = @Type(.{
2 .@"struct" = undefined,
3});
4comptime {
5 _ = Foo;
6}
7
8// error
9//
10// :1:20: error: use of undefined value here causes illegal behavior
test/cases/compile_errors/reify_type_with_Type.Int.zig deleted-13
......@@ -1,13 +0,0 @@
1const builtin = @import("std").builtin;
2export fn entry() void {
3 _ = @Type(builtin.Type.Int{
4 .signedness = .signed,
5 .bits = 8,
6 });
7}
8
9// error
10//
11// :3:31: error: expected type 'builtin.Type', found 'builtin.Type.Int'
12// :?:?: note: struct declared here
13// :?:?: note: union declared here
test/cases/compile_errors/reify_type_with_invalid_field_alignment.zig+6-39
......@@ -1,48 +1,15 @@
11comptime {
2 _ = @Type(.{
3 .@"union" = .{
4 .layout = .auto,
5 .tag_type = null,
6 .fields = &.{
7 .{ .name = "foo", .type = usize, .alignment = 3 },
8 },
9 .decls = &.{},
10 },
11 });
2 _ = @Union(.auto, null, &.{"foo"}, &.{usize}, &.{.{ .@"align" = 3 }});
123}
134comptime {
14 _ = @Type(.{
15 .@"struct" = .{
16 .layout = .auto,
17 .fields = &.{.{
18 .name = "0",
19 .type = u32,
20 .default_value_ptr = null,
21 .is_comptime = true,
22 .alignment = 5,
23 }},
24 .decls = &.{},
25 .is_tuple = false,
26 },
27 });
5 _ = @Struct(.auto, null, &.{"a"}, &.{u32}, &.{.{ .@"comptime" = true, .@"align" = 5 }});
286}
297comptime {
30 _ = @Type(.{
31 .pointer = .{
32 .size = .many,
33 .is_const = true,
34 .is_volatile = false,
35 .alignment = 7,
36 .address_space = .generic,
37 .child = u8,
38 .is_allowzero = false,
39 .sentinel_ptr = null,
40 },
41 });
8 _ = @Pointer(.many, .{ .@"align" = 7 }, u8, null);
429}
4310
4411// error
4512//
46// :2:9: error: alignment value '3' is not a power of two
47// :14:9: error: alignment value '5' is not a power of two
48// :30:9: error: alignment value '7' is not a power of two
13// :2:51: error: alignment value '3' is not a power of two
14// :5:48: error: alignment value '5' is not a power of two
15// :8:26: error: alignment value '7' is not a power of two
test/cases/compile_errors/reify_type_with_undefined.zig+4-24
......@@ -1,31 +1,11 @@
11comptime {
2 _ = @Type(.{ .array = .{ .len = 0, .child = u8, .sentinel_ptr = undefined } });
2 _ = @Struct(.auto, null, &.{}, &.{}, undefined);
33}
44comptime {
5 _ = @Type(.{
6 .@"struct" = .{
7 .fields = undefined,
8 .decls = undefined,
9 .is_tuple = false,
10 .layout = .auto,
11 },
12 });
13}
14comptime {
15 const std = @import("std");
16 const fields: [1]std.builtin.Type.StructField = undefined;
17 _ = @Type(.{
18 .@"struct" = .{
19 .layout = .auto,
20 .fields = &fields,
21 .decls = &.{},
22 .is_tuple = false,
23 },
24 });
5 _ = @Struct(.auto, null, &.{"foo"}, &.{undefined}, &.{.{}});
256}
267
278// error
289//
29// :2:16: error: use of undefined value here causes illegal behavior
30// :5:16: error: use of undefined value here causes illegal behavior
31// :17:16: error: use of undefined value here causes illegal behavior
10// :2:42: error: use of undefined value here causes illegal behavior
11// :5:41: error: use of undefined value here causes illegal behavior
test/cases/compile_errors/runtime_condition_comptime_type_in_destructure.zig+1-1
......@@ -7,4 +7,4 @@ export fn foobar() void {
77
88// error
99//
10// :4:5: error: value with comptime-only type '@Type(.enum_literal)' depends on runtime control flow
10// :4:5: error: value with comptime-only type '@EnumLiteral()' depends on runtime control flow
test/cases/compile_errors/struct_with_declarations_unavailable_for_reify_type.zig deleted-9
......@@ -1,9 +0,0 @@
1export fn entry() void {
2 _ = @Type(@typeInfo(struct {
3 pub const foo = 1;
4 }));
5}
6
7// error
8//
9// :2:9: error: reified structs must have no decls
test/cases/compile_errors/tagName_on_undef_enum_literal.zig+1-1
......@@ -1,5 +1,5 @@
11comptime {
2 const undef: @Type(.enum_literal) = undefined;
2 const undef: @EnumLiteral() = undefined;
33 _ = @tagName(undef);
44}
55
test/cases/compile_errors/unable_to_evaluate_comptime_expr.zig+1-1
......@@ -42,4 +42,4 @@ pub export fn entry3() void {
4242// :13:13: note: initializer of container-level variable must be comptime-known
4343// :22:9: error: unable to evaluate comptime expression
4444// :22:21: note: operation is runtime due to this operand
45// :21:13: note: enum fields must be comptime-known
45// :21:13: note: enum field values must be comptime-known
test/cases/compile_errors/wrong_type_for_reify_type.zig+21-4
......@@ -1,8 +1,25 @@
1export fn entry() void {
2 _ = @Type(0);
1export fn entryI() void {
2 _ = @Int(0, 0);
3}
4
5export fn entryE() void {
6 _ = @Enum(0, 0, 0, 0);
7}
8
9export fn entryS() void {
10 _ = @Struct(0, 0, &.{}, &.{}, &.{});
11}
12
13export fn entryU() void {
14 _ = @Union(0, 0, &.{}, &.{}, &.{});
315}
416
517// error
618//
7// :2:15: error: expected type 'builtin.Type', found 'comptime_int'
8// :?:?: note: union declared here
19// :2:14: error: expected type 'builtin.Signedness', found 'comptime_int'
20// :?:?: note: enum declared here
21// :6:15: error: expected type 'type', found 'comptime_int'
22// :10:17: error: expected type 'builtin.Type.ContainerLayout', found 'comptime_int'
23// :?:?: enum declared here
24// :14:16: error: expected type 'builtin.Type.ContainerLayout', found 'comptime_int'
25// :?:?: enum declared here
test/cases/default_value_references_comptime_var.zig+13-35
......@@ -2,49 +2,27 @@ export fn foo() void {
22 comptime var a: u8 = 0;
33 _ = struct { comptime *u8 = &a };
44}
5export fn bar() void {
6 comptime var a: u8 = 0;
7 _ = @Type(.{ .@"struct" = .{
8 .layout = .auto,
9 .fields = &.{.{
10 .name = "0",
11 .type = *u8,
12 .default_value_ptr = @ptrCast(&&a),
13 .is_comptime = true,
14 .alignment = @alignOf(*u8),
15 }},
16 .decls = &.{},
17 .is_tuple = true,
18 } });
19}
205
21export fn baz() void {
6export fn bar() void {
227 comptime var a: u8 = 0;
238 _ = struct { foo: *u8 = &a };
249}
25export fn qux() void {
10export fn baz() void {
2611 comptime var a: u8 = 0;
27 _ = @Type(.{ .@"struct" = .{
28 .layout = .auto,
29 .fields = &.{.{
30 .name = "foo",
31 .type = *u8,
32 .default_value_ptr = @ptrCast(&&a),
33 .is_comptime = false,
34 .alignment = @alignOf(*u8),
35 }},
36 .decls = &.{},
37 .is_tuple = false,
38 } });
12 _ = @Struct(
13 .auto,
14 null,
15 &.{"foo"},
16 &.{*u8},
17 &.{.{ .default_value_ptr = @ptrCast(&&a) }},
18 );
3919}
4020
4121// error
4222//
4323// :3:33: error: field default value contains reference to comptime var
4424// :2:14: note: '0' points to comptime var declared here
45// :7:9: error: field default value contains reference to comptime var
46// :6:14: note: '0' points to comptime var declared here
47// :23:9: error: captured value contains reference to comptime var
48// :22:14: note: 'a' points to comptime var declared here
49// :27:9: error: field default value contains reference to comptime var
50// :26:14: note: 'foo' points to comptime var declared here
25// :8:9: error: captured value contains reference to comptime var
26// :7:14: note: 'a' points to comptime var declared here
27// :17:9: error: field default value contains reference to comptime var
28// :11:14: note: 'foo' points to comptime var declared here
test/cases/sentinel_references_comptime_var.zig+5-24
......@@ -2,14 +2,6 @@ export fn foo() void {
22 comptime var a: u8 = 0;
33 _ = [0:&a]*u8;
44}
5export fn bar() void {
6 comptime var a: u8 = 0;
7 _ = @Type(.{ .array = .{
8 .child = *u8,
9 .len = 0,
10 .sentinel_ptr = @ptrCast(&&a),
11 } });
12}
135
146export fn baz() void {
157 comptime var a: u8 = 0;
......@@ -17,25 +9,14 @@ export fn baz() void {
179}
1810export fn qux() void {
1911 comptime var a: u8 = 0;
20 _ = @Type(.{ .pointer = .{
21 .size = .many,
22 .is_const = false,
23 .is_volatile = false,
24 .alignment = @alignOf(u8),
25 .address_space = .generic,
26 .child = *u8,
27 .is_allowzero = false,
28 .sentinel_ptr = @ptrCast(&&a),
29 } });
12 _ = @Pointer(.many, .{}, *u8, &a);
3013}
3114
3215// error
3316//
3417// :3:12: error: sentinel contains reference to comptime var
3518// :2:14: note: 'sentinel' points to comptime var declared here
36// :7:9: error: sentinel contains reference to comptime var
37// :6:14: note: 'sentinel_ptr' points to comptime var declared here
38// :16:11: error: sentinel contains reference to comptime var
39// :15:14: note: 'sentinel' points to comptime var declared here
40// :20:9: error: sentinel contains reference to comptime var
41// :19:14: note: 'sentinel_ptr' points to comptime var declared here
19// :8:11: error: sentinel contains reference to comptime var
20// :7:14: note: 'sentinel' points to comptime var declared here
21// :12:35: error: sentinel contains reference to comptime var
22// :11:14: note: 'sentinel' points to comptime var declared here
test/standalone/simple/issue_7030.zig+1-1
......@@ -6,7 +6,7 @@ pub const std_options: std.Options = .{
66
77pub fn log(
88 comptime message_level: std.log.Level,
9 comptime scope: @Type(.enum_literal),
9 comptime scope: @EnumLiteral(),
1010 comptime format: []const u8,
1111 args: anytype,
1212) void {
test/standalone/simple/std_enums_big_enums.zig+14-15
......@@ -3,20 +3,18 @@ const std = @import("std");
33// big enums should not hit the eval branch quota
44pub fn main() void {
55 const big = struct {
6 const Big = @Type(.{ .@"enum" = .{
7 .tag_type = u16,
8 .fields = make_fields: {
9 @setEvalBranchQuota(500000);
10 var fields: [1001]std.builtin.Type.EnumField = undefined;
11 for (&fields, 0..) |*field, i| {
12 field.* = .{ .name = std.fmt.comptimePrint("field_{d}", .{i}), .value = i };
13 }
14 fields[1000] = .{ .name = "field_9999", .value = 9999 };
15 break :make_fields &fields;
16 },
17 .decls = &.{},
18 .is_exhaustive = true,
19 } });
6 const Big = Big: {
7 @setEvalBranchQuota(500000);
8 var names: [1001][]const u8 = undefined;
9 var values: [1001]u16 = undefined;
10 for (values[0..1000], names[0..1000], 0..1000) |*val, *name, i| {
11 name.* = std.fmt.comptimePrint("field_{d}", .{i});
12 val.* = i;
13 }
14 names[1000] = "field_9999";
15 values[1000] = 9999;
16 break :Big @Enum(u16, .exhaustive, &names, &values);
17 };
2018 };
2119
2220 var set = std.enums.EnumSet(big.Big).init(.{});
......@@ -29,10 +27,11 @@ pub fn main() void {
2927 var multiset = std.enums.EnumMultiset(big.Big).init(.{});
3028 _ = &multiset;
3129
30 @setEvalBranchQuota(4000);
31
3232 var bounded_multiset = std.enums.BoundedEnumMultiset(big.Big, u8).init(.{});
3333 _ = &bounded_multiset;
3434
35 @setEvalBranchQuota(3000);
3635 var array = std.enums.EnumArray(big.Big, u8).init(undefined);
3736 array = std.enums.EnumArray(big.Big, u8).initDefault(123, .{});
3837}
tools/lldb_pretty_printers.py+1-1
......@@ -559,7 +559,7 @@ type_tag_handlers = {
559559 'extern_options': lambda payload: 'std.builtin.ExternOptions',
560560 'type_info': lambda payload: 'std.builtin.Type',
561561
562 'enum_literal': lambda payload: '@TypeOf(.enum_literal)',
562 'enum_literal': lambda payload: '@EnumLiteral()',
563563 'null': lambda payload: '@TypeOf(null)',
564564 'undefined': lambda payload: '@TypeOf(undefined)',
565565 'empty_struct_literal': lambda payload: '@TypeOf(.{})',