From af6bad46cd132113e7b8497829a660a79e101742 Mon Sep 17 00:00:00 2001 From: mlugg Date: Wed, 15 Jan 2025 16:49:57 +0000 Subject: [PATCH 1/7] std.builtin.Type: rename `Pointer.Size` fields to lowercase This matches established naming conventions. Now is an opportune time to make this change, since we're already performing breaking changes to `std.builtin.Type`. --- lib/std/builtin.zig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index eda7f0ff4f5e..91ef1c38f960 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -613,10 +613,10 @@ pub const Type = union(enum) { /// This data structure is used by the Zig language code generation and /// therefore must be kept in sync with the compiler implementation. pub const Size = enum(u2) { - One, - Many, - Slice, - C, + one, + many, + slice, + c, }; }; From d00e05f18609921c1a051a637c24e47cfa304243 Mon Sep 17 00:00:00 2001 From: mlugg Date: Wed, 15 Jan 2025 17:53:05 +0000 Subject: [PATCH 2/7] all: update to `std.builtin.Type.Pointer.Size` field renames This was done by regex substitution with `sed`. I then manually went over the entire diff and fixed any incorrect changes. This diff also changes a lot of `callconv(.C)` to `callconv(.c)`, since my regex happened to also trigger here. I opted to leave these changes in, since they *are* a correct migration, even if they're not the one I was trying to do! --- lib/std/Build/Step/ConfigHeader.zig | 4 +- lib/std/Build/Step/Options.zig | 2 +- lib/std/Progress.zig | 2 +- lib/std/Random.zig | 2 +- lib/std/c.zig | 62 ++-- lib/std/c/darwin.zig | 4 +- lib/std/c/dragonfly.zig | 2 +- lib/std/crypto/tlcsprng.zig | 2 +- lib/std/debug.zig | 2 +- lib/std/fmt.zig | 14 +- lib/std/hash/auto_hash.zig | 10 +- lib/std/io/fixed_buffer_stream.zig | 6 +- lib/std/json/static.zig | 8 +- lib/std/json/stringify.zig | 8 +- lib/std/mem.zig | 62 ++-- lib/std/mem/Allocator.zig | 2 +- lib/std/meta.zig | 30 +- lib/std/os/emscripten.zig | 44 +-- lib/std/os/linux.zig | 22 +- lib/std/os/linux/sparc64.zig | 2 +- lib/std/os/plan9.zig | 4 +- lib/std/os/uefi/tables/boot_services.zig | 4 +- lib/std/posix.zig | 2 +- lib/std/posix/test.zig | 2 +- lib/std/testing.zig | 10 +- lib/std/zig/Ast.zig | 11 +- lib/std/zig/AstGen.zig | 4 +- lib/std/zig/c_translation.zig | 6 +- lib/std/zig/parser_test.zig | 8 +- lib/std/zig/render.zig | 8 +- lib/std/zig/system/x86.zig | 4 +- src/InternPool.zig | 62 ++-- src/Sema.zig | 330 +++++++++--------- src/Type.zig | 64 ++-- src/Value.zig | 32 +- src/Zcu/PerThread.zig | 6 +- src/arch/aarch64/CodeGen.zig | 2 +- src/arch/arm/CodeGen.zig | 2 +- src/arch/riscv64/CodeGen.zig | 22 +- src/arch/riscv64/abi.zig | 2 +- src/arch/sparc64/CodeGen.zig | 2 +- src/arch/wasm/CodeGen.zig | 16 +- src/arch/x86_64/CodeGen.zig | 28 +- src/arch/x86_64/abi.zig | 2 +- src/clang.zig | 2 +- src/codegen.zig | 2 +- src/codegen/c.zig | 38 +- src/codegen/c/Type.zig | 6 +- src/codegen/llvm.zig | 34 +- src/codegen/spirv.zig | 16 +- src/codegen/spirv/Section.zig | 4 +- src/crash_report.zig | 2 +- src/link/Dwarf.zig | 4 +- src/link/tapi/yaml.zig | 8 +- src/mutable_value.zig | 2 +- src/translate_c.zig | 4 +- test/behavior/align.zig | 4 +- test/behavior/cast.zig | 10 +- test/behavior/export_builtin.zig | 2 +- test/behavior/export_keyword.zig | 2 +- test/behavior/extern.zig | 6 +- test/behavior/fn.zig | 10 +- test/behavior/generics.zig | 12 +- test/behavior/import_c_keywords.zig | 2 +- test/behavior/packed-struct.zig | 6 +- test/behavior/struct.zig | 2 +- test/behavior/type.zig | 6 +- test/behavior/type_info.zig | 18 +- test/behavior/union.zig | 2 +- test/behavior/var_args.zig | 16 +- ...ailure_in_generic_function_return_type.zig | 2 +- .../invalid_pointer_with_reify_type.zig | 4 +- .../compile_errors/non_scalar_sentinel.zig | 4 +- ...eify_type_with_invalid_field_alignment.zig | 4 +- 74 files changed, 576 insertions(+), 581 deletions(-) diff --git a/lib/std/Build/Step/ConfigHeader.zig b/lib/std/Build/Step/ConfigHeader.zig index 895f50f5d05b..fe16532dc362 100644 --- a/lib/std/Build/Step/ConfigHeader.zig +++ b/lib/std/Build/Step/ConfigHeader.zig @@ -144,13 +144,13 @@ fn putValue(config_header: *ConfigHeader, field_name: []const u8, comptime T: ty .pointer => |ptr| { switch (@typeInfo(ptr.child)) { .array => |array| { - if (ptr.size == .One and array.child == u8) { + if (ptr.size == .one and array.child == u8) { try config_header.values.put(field_name, .{ .string = v }); return; } }, .int => { - if (ptr.size == .Slice and ptr.child == u8) { + if (ptr.size == .slice and ptr.child == u8) { try config_header.values.put(field_name, .{ .string = v }); return; } diff --git a/lib/std/Build/Step/Options.zig b/lib/std/Build/Step/Options.zig index 44228bef2084..5a7332d9d8ec 100644 --- a/lib/std/Build/Step/Options.zig +++ b/lib/std/Build/Step/Options.zig @@ -172,7 +172,7 @@ fn printType(options: *Options, out: anytype, comptime T: type, value: T, indent return; }, .pointer => |p| { - if (p.size != .Slice) { + if (p.size != .slice) { @compileError("Non-slice pointers are not yet supported in build options"); } diff --git a/lib/std/Progress.zig b/lib/std/Progress.zig index 513a9393673b..24f58e1c685b 100644 --- a/lib/std/Progress.zig +++ b/lib/std/Progress.zig @@ -1366,7 +1366,7 @@ fn maybeUpdateSize(resize_flag: bool) void { } } -fn handleSigWinch(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.C) void { +fn handleSigWinch(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.c) void { _ = info; _ = ctx_ptr; assert(sig == posix.SIG.WINCH); diff --git a/lib/std/Random.zig b/lib/std/Random.zig index c700f7d0f39f..8c68bdf6daef 100644 --- a/lib/std/Random.zig +++ b/lib/std/Random.zig @@ -35,7 +35,7 @@ fillFn: *const fn (ptr: *anyopaque, buf: []u8) void, pub fn init(pointer: anytype, comptime fillFn: fn (ptr: @TypeOf(pointer), buf: []u8) void) Random { const Ptr = @TypeOf(pointer); assert(@typeInfo(Ptr) == .pointer); // Must be a pointer - assert(@typeInfo(Ptr).pointer.size == .One); // Must be a single-item pointer + assert(@typeInfo(Ptr).pointer.size == .one); // Must be a single-item pointer assert(@typeInfo(@typeInfo(Ptr).pointer.child) == .@"struct"); // Must point to a struct const gen = struct { fn fill(ptr: *anyopaque, buf: []u8) void { diff --git a/lib/std/c.zig b/lib/std/c.zig index e31d90c79f67..70af17aa2e9f 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -2733,8 +2733,8 @@ pub const Sigaction = switch (native_os) { => if (builtin.target.isMusl()) linux.Sigaction else if (builtin.target.ptrBitWidth() == 64) extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; flags: c_uint, handler: extern union { @@ -2742,10 +2742,10 @@ pub const Sigaction = switch (native_os) { sigaction: ?sigaction_fn, }, mask: sigset_t, - restorer: ?*const fn () callconv(.C) void = null, + restorer: ?*const fn () callconv(.c) void = null, } else extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; flags: c_uint, handler: extern union { @@ -2753,12 +2753,12 @@ pub const Sigaction = switch (native_os) { sigaction: ?sigaction_fn, }, mask: sigset_t, - restorer: ?*const fn () callconv(.C) void = null, + restorer: ?*const fn () callconv(.c) void = null, __resv: [1]c_int = .{0}, }, .s390x => if (builtin.abi == .gnu) extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; handler: extern union { handler: ?handler_fn, @@ -2766,15 +2766,15 @@ pub const Sigaction = switch (native_os) { }, __glibc_reserved0: c_int = 0, flags: c_uint, - restorer: ?*const fn () callconv(.C) void = null, + restorer: ?*const fn () callconv(.c) void = null, mask: sigset_t, } else linux.Sigaction, else => linux.Sigaction, }, .emscripten => emscripten.Sigaction, .netbsd, .macos, .ios, .tvos, .watchos, .visionos => extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; handler: extern union { handler: ?handler_fn, @@ -2784,8 +2784,8 @@ pub const Sigaction = switch (native_os) { flags: c_uint, }, .dragonfly, .freebsd => extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; /// signal handler handler: extern union { @@ -2798,8 +2798,8 @@ pub const Sigaction = switch (native_os) { mask: sigset_t, }, .solaris, .illumos => extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; /// signal options flags: c_uint, @@ -2812,8 +2812,8 @@ pub const Sigaction = switch (native_os) { mask: sigset_t, }, .haiku => extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; /// signal handler handler: extern union { @@ -2831,8 +2831,8 @@ pub const Sigaction = switch (native_os) { userdata: *allowzero anyopaque = undefined, }, .openbsd => extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; /// signal handler handler: extern union { @@ -6410,7 +6410,7 @@ pub const EAI = switch (native_os) { else => void, }; -pub const dl_iterate_phdr_callback = *const fn (info: *dl_phdr_info, size: usize, data: ?*anyopaque) callconv(.C) c_int; +pub const dl_iterate_phdr_callback = *const fn (info: *dl_phdr_info, size: usize, data: ?*anyopaque) callconv(.c) c_int; pub const Stat = switch (native_os) { .linux => switch (native_arch) { @@ -9396,7 +9396,7 @@ pub extern "c" fn futimens(fd: fd_t, times: *const [2]timespec) c_int; pub extern "c" fn pthread_create( noalias newthread: *pthread_t, noalias attr: ?*const pthread_attr_t, - start_routine: *const fn (?*anyopaque) callconv(.C) ?*anyopaque, + start_routine: *const fn (?*anyopaque) callconv(.c) ?*anyopaque, noalias arg: ?*anyopaque, ) E; pub extern "c" fn pthread_attr_init(attr: *pthread_attr_t) E; @@ -9408,13 +9408,13 @@ pub extern "c" fn pthread_self() pthread_t; pub extern "c" fn pthread_join(thread: pthread_t, arg_return: ?*?*anyopaque) E; pub extern "c" fn pthread_detach(thread: pthread_t) E; pub extern "c" fn pthread_atfork( - prepare: ?*const fn () callconv(.C) void, - parent: ?*const fn () callconv(.C) void, - child: ?*const fn () callconv(.C) void, + prepare: ?*const fn () callconv(.c) void, + parent: ?*const fn () callconv(.c) void, + child: ?*const fn () callconv(.c) void, ) c_int; pub extern "c" fn pthread_key_create( key: *pthread_key_t, - destructor: ?*const fn (value: *anyopaque) callconv(.C) void, + destructor: ?*const fn (value: *anyopaque) callconv(.c) void, ) E; pub extern "c" fn pthread_key_delete(key: pthread_key_t) E; pub extern "c" fn pthread_getspecific(key: pthread_key_t) ?*anyopaque; @@ -9530,12 +9530,12 @@ pub extern "c" fn pthread_cond_signal(cond: *pthread_cond_t) E; pub extern "c" fn pthread_cond_broadcast(cond: *pthread_cond_t) E; pub extern "c" fn pthread_cond_destroy(cond: *pthread_cond_t) E; -pub extern "c" fn pthread_rwlock_destroy(rwl: *pthread_rwlock_t) callconv(.C) E; -pub extern "c" fn pthread_rwlock_rdlock(rwl: *pthread_rwlock_t) callconv(.C) E; -pub extern "c" fn pthread_rwlock_wrlock(rwl: *pthread_rwlock_t) callconv(.C) E; -pub extern "c" fn pthread_rwlock_tryrdlock(rwl: *pthread_rwlock_t) callconv(.C) E; -pub extern "c" fn pthread_rwlock_trywrlock(rwl: *pthread_rwlock_t) callconv(.C) E; -pub extern "c" fn pthread_rwlock_unlock(rwl: *pthread_rwlock_t) callconv(.C) E; +pub extern "c" fn pthread_rwlock_destroy(rwl: *pthread_rwlock_t) callconv(.c) E; +pub extern "c" fn pthread_rwlock_rdlock(rwl: *pthread_rwlock_t) callconv(.c) E; +pub extern "c" fn pthread_rwlock_wrlock(rwl: *pthread_rwlock_t) callconv(.c) E; +pub extern "c" fn pthread_rwlock_tryrdlock(rwl: *pthread_rwlock_t) callconv(.c) E; +pub extern "c" fn pthread_rwlock_trywrlock(rwl: *pthread_rwlock_t) callconv(.c) E; +pub extern "c" fn pthread_rwlock_unlock(rwl: *pthread_rwlock_t) callconv(.c) E; pub const pthread_t = *opaque {}; pub const FILE = opaque {}; diff --git a/lib/std/c/darwin.zig b/lib/std/c/darwin.zig index 77a1b09311b6..4dc12828b270 100644 --- a/lib/std/c/darwin.zig +++ b/lib/std/c/darwin.zig @@ -379,7 +379,7 @@ pub const MACH_MSG_TYPE = enum(mach_msg_type_name_t) { }; extern "c" var mach_task_self_: mach_port_t; -pub fn mach_task_self() callconv(.C) mach_port_t { +pub fn mach_task_self() callconv(.c) mach_port_t { return mach_task_self_; } @@ -873,7 +873,7 @@ pub const DISPATCH_TIME_FOREVER = ~@as(dispatch_time_t, 0); pub extern "c" fn dispatch_time(when: dispatch_time_t, delta: i64) dispatch_time_t; const dispatch_once_t = usize; -const dispatch_function_t = fn (?*anyopaque) callconv(.C) void; +const dispatch_function_t = fn (?*anyopaque) callconv(.c) void; pub extern fn dispatch_once_f( predicate: *dispatch_once_t, context: ?*anyopaque, diff --git a/lib/std/c/dragonfly.zig b/lib/std/c/dragonfly.zig index 5840fc22694c..cb33fc1e5649 100644 --- a/lib/std/c/dragonfly.zig +++ b/lib/std/c/dragonfly.zig @@ -156,7 +156,7 @@ pub const E = enum(u16) { pub const BADSIG = SIG.ERR; -pub const sig_t = *const fn (i32) callconv(.C) void; +pub const sig_t = *const fn (i32) callconv(.c) void; pub const cmsghdr = extern struct { len: socklen_t, diff --git a/lib/std/crypto/tlcsprng.zig b/lib/std/crypto/tlcsprng.zig index 672d6c2ecb9f..bad4df2ea85b 100644 --- a/lib/std/crypto/tlcsprng.zig +++ b/lib/std/crypto/tlcsprng.zig @@ -133,7 +133,7 @@ fn setupPthreadAtforkAndFill(buffer: []u8) void { return initAndFill(buffer); } -fn childAtForkHandler() callconv(.C) void { +fn childAtForkHandler() callconv(.c) void { // The atfork handler is global, this function may be called after // fork()-ing threads that never initialized the CSPRNG context. if (wipe_mem.len == 0) return; diff --git a/lib/std/debug.zig b/lib/std/debug.zig index e8855f5d1ad3..3664bd0cef07 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -1269,7 +1269,7 @@ fn resetSegfaultHandler() void { updateSegfaultHandler(&act); } -fn handleSegfaultPosix(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.C) noreturn { +fn handleSegfaultPosix(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.c) noreturn { // Reset to the default handler so that if a segfault happens in this handler it will crash // the process. Also when this handler returns, the original instruction will be repeated // and the resulting segfault will crash the process rather than continually dump stack traces. diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 2b5e78975e97..a044bbe608c6 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -434,7 +434,7 @@ pub fn formatAddress(value: anytype, options: FormatOptions, writer: anytype) @T switch (@typeInfo(T)) { .pointer => |info| { try writer.writeAll(@typeName(info.child) ++ "@"); - if (info.size == .Slice) + if (info.size == .slice) try formatInt(@intFromPtr(value.ptr), 16, .lower, FormatOptions{}, writer) else try formatInt(@intFromPtr(value), 16, .lower, FormatOptions{}, writer); @@ -460,12 +460,12 @@ pub fn defaultSpec(comptime T: type) [:0]const u8 { switch (@typeInfo(T)) { .array, .vector => return ANY, .pointer => |ptr_info| switch (ptr_info.size) { - .One => switch (@typeInfo(ptr_info.child)) { + .one => switch (@typeInfo(ptr_info.child)) { .array => return ANY, else => {}, }, - .Many, .C => return "*", - .Slice => return ANY, + .many, .c => return "*", + .slice => return ANY, }, .optional => |info| return "?" ++ defaultSpec(info.child), .error_union => |info| return "!" ++ defaultSpec(info.payload), @@ -624,13 +624,13 @@ pub fn formatType( try writer.writeAll(" }"); }, .pointer => |ptr_info| switch (ptr_info.size) { - .One => switch (@typeInfo(ptr_info.child)) { + .one => switch (@typeInfo(ptr_info.child)) { .array, .@"enum", .@"union", .@"struct" => { return formatType(value.*, actual_fmt, options, writer, max_depth); }, else => return format(writer, "{s}@{x}", .{ @typeName(ptr_info.child), @intFromPtr(value) }), }, - .Many, .C => { + .many, .c => { if (actual_fmt.len == 0) @compileError("cannot format pointer without a specifier (i.e. {s} or {*})"); if (ptr_info.sentinel) |_| { @@ -641,7 +641,7 @@ pub fn formatType( } invalidFmtError(fmt, value); }, - .Slice => { + .slice => { if (actual_fmt.len == 0) @compileError("cannot format slice without a specifier (i.e. {s} or {any})"); if (max_depth == 0) { diff --git a/lib/std/hash/auto_hash.zig b/lib/std/hash/auto_hash.zig index d9d3b1836d73..7ecd1860e460 100644 --- a/lib/std/hash/auto_hash.zig +++ b/lib/std/hash/auto_hash.zig @@ -23,13 +23,13 @@ pub fn hashPointer(hasher: anytype, key: anytype, comptime strat: HashStrategy) const info = @typeInfo(@TypeOf(key)); switch (info.pointer.size) { - .One => switch (strat) { + .one => switch (strat) { .Shallow => hash(hasher, @intFromPtr(key), .Shallow), .Deep => hash(hasher, key.*, .Shallow), .DeepRecursive => hash(hasher, key.*, .DeepRecursive), }, - .Slice => { + .slice => { switch (strat) { .Shallow => { hashPointer(hasher, key.ptr, .Shallow); @@ -40,8 +40,8 @@ pub fn hashPointer(hasher: anytype, key: anytype, comptime strat: HashStrategy) hash(hasher, key.len, .Shallow); }, - .Many, - .C, + .many, + .c, => switch (strat) { .Shallow => hash(hasher, @intFromPtr(key), .Shallow), else => @compileError( @@ -167,7 +167,7 @@ pub fn hash(hasher: anytype, key: anytype, comptime strat: HashStrategy) void { inline fn typeContainsSlice(comptime K: type) bool { return switch (@typeInfo(K)) { - .pointer => |info| info.size == .Slice, + .pointer => |info| info.size == .slice, inline .@"struct", .@"union" => |info| { inline for (info.fields) |field| { diff --git a/lib/std/io/fixed_buffer_stream.zig b/lib/std/io/fixed_buffer_stream.zig index 7750c29fc8c0..bfc25eb6ac54 100644 --- a/lib/std/io/fixed_buffer_stream.zig +++ b/lib/std/io/fixed_buffer_stream.zig @@ -118,14 +118,14 @@ fn Slice(comptime T: type) type { .pointer => |ptr_info| { var new_ptr_info = ptr_info; switch (ptr_info.size) { - .Slice => {}, - .One => switch (@typeInfo(ptr_info.child)) { + .slice => {}, + .one => switch (@typeInfo(ptr_info.child)) { .array => |info| new_ptr_info.child = info.child, else => @compileError("invalid type given to fixedBufferStream"), }, else => @compileError("invalid type given to fixedBufferStream"), } - new_ptr_info.size = .Slice; + new_ptr_info.size = .slice; return @Type(.{ .pointer = new_ptr_info }); }, else => @compileError("invalid type given to fixedBufferStream"), diff --git a/lib/std/json/static.zig b/lib/std/json/static.zig index 15cb5bc75a16..d2972be7b9a3 100644 --- a/lib/std/json/static.zig +++ b/lib/std/json/static.zig @@ -451,12 +451,12 @@ pub fn innerParse( .pointer => |ptrInfo| { switch (ptrInfo.size) { - .One => { + .one => { const r: *ptrInfo.child = try allocator.create(ptrInfo.child); r.* = try innerParse(ptrInfo.child, allocator, source, options); return r; }, - .Slice => { + .slice => { switch (try source.peekNextTokenType()) { .array_begin => { _ = try source.next(); @@ -706,12 +706,12 @@ pub fn innerParseFromValue( .pointer => |ptrInfo| { switch (ptrInfo.size) { - .One => { + .one => { const r: *ptrInfo.child = try allocator.create(ptrInfo.child); r.* = try innerParseFromValue(ptrInfo.child, allocator, source, options); return r; }, - .Slice => { + .slice => { switch (source) { .array => |array| { const r = if (ptrInfo.sentinel) |sentinel_ptr| diff --git a/lib/std/json/stringify.zig b/lib/std/json/stringify.zig index 9bc0e564a1ad..9761196151bf 100644 --- a/lib/std/json/stringify.zig +++ b/lib/std/json/stringify.zig @@ -631,7 +631,7 @@ pub fn WriteStream( }, .error_set => return self.stringValue(@errorName(value)), .pointer => |ptr_info| switch (ptr_info.size) { - .One => switch (@typeInfo(ptr_info.child)) { + .one => switch (@typeInfo(ptr_info.child)) { .array => { // Coerce `*[N]T` to `[]const T`. const Slice = []const std.meta.Elem(ptr_info.child); @@ -641,10 +641,10 @@ pub fn WriteStream( return self.write(value.*); }, }, - .Many, .Slice => { - if (ptr_info.size == .Many and ptr_info.sentinel == null) + .many, .slice => { + if (ptr_info.size == .many and ptr_info.sentinel == null) @compileError("unable to stringify type '" ++ @typeName(T) ++ "' without sentinel"); - const slice = if (ptr_info.size == .Many) std.mem.span(value) else value; + const slice = if (ptr_info.size == .many) std.mem.span(value) else value; if (ptr_info.child == u8) { // This is a []const u8, or some similar Zig string. diff --git a/lib/std/mem.zig b/lib/std/mem.zig index 583f6eb00a57..d9469ab7388d 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -262,7 +262,7 @@ pub fn zeroes(comptime T: type) T { }, .pointer => |ptr_info| { switch (ptr_info.size) { - .Slice => { + .slice => { if (ptr_info.sentinel) |sentinel| { if (ptr_info.child == u8 and @as(*const u8, @ptrCast(sentinel)).* == 0) { return ""; // A special case for the most common use-case: null-terminated strings. @@ -272,10 +272,10 @@ pub fn zeroes(comptime T: type) T { return &[_]ptr_info.child{}; } }, - .C => { + .c => { return null; }, - .One, .Many => { + .one, .many => { if (ptr_info.is_allowzero) return @ptrFromInt(0); @compileError("Only nullable and allowzero pointers can be set to zero."); }, @@ -781,14 +781,14 @@ fn Span(comptime T: type) type { .pointer => |ptr_info| { var new_ptr_info = ptr_info; switch (ptr_info.size) { - .C => { + .c => { new_ptr_info.sentinel = &@as(ptr_info.child, 0); new_ptr_info.is_allowzero = false; }, - .Many => if (ptr_info.sentinel == null) @compileError("invalid type given to std.mem.span: " ++ @typeName(T)), - .One, .Slice => @compileError("invalid type given to std.mem.span: " ++ @typeName(T)), + .many => if (ptr_info.sentinel == null) @compileError("invalid type given to std.mem.span: " ++ @typeName(T)), + .one, .slice => @compileError("invalid type given to std.mem.span: " ++ @typeName(T)), } - new_ptr_info.size = .Slice; + new_ptr_info.size = .slice; return @Type(.{ .pointer = new_ptr_info }); }, else => {}, @@ -845,9 +845,9 @@ fn SliceTo(comptime T: type, comptime end: std.meta.Elem(T)) type { }, .pointer => |ptr_info| { var new_ptr_info = ptr_info; - new_ptr_info.size = .Slice; + new_ptr_info.size = .slice; switch (ptr_info.size) { - .One => switch (@typeInfo(ptr_info.child)) { + .one => switch (@typeInfo(ptr_info.child)) { .array => |array_info| { new_ptr_info.child = array_info.child; // The return type must only be sentinel terminated if we are guaranteed @@ -864,7 +864,7 @@ fn SliceTo(comptime T: type, comptime end: std.meta.Elem(T)) type { }, else => {}, }, - .Many, .Slice => { + .many, .slice => { // The return type must only be sentinel terminated if we are guaranteed // to find the value searched for, which is only the case if it matches // the sentinel of the type passed. @@ -877,7 +877,7 @@ fn SliceTo(comptime T: type, comptime end: std.meta.Elem(T)) type { } } }, - .C => { + .c => { new_ptr_info.sentinel = &end; // C pointers are always allowzero, but we don't want the return type to be. assert(new_ptr_info.is_allowzero); @@ -957,7 +957,7 @@ test sliceTo { fn lenSliceTo(ptr: anytype, comptime end: std.meta.Elem(@TypeOf(ptr))) usize { switch (@typeInfo(@TypeOf(ptr))) { .pointer => |ptr_info| switch (ptr_info.size) { - .One => switch (@typeInfo(ptr_info.child)) { + .one => switch (@typeInfo(ptr_info.child)) { .array => |array_info| { if (array_info.sentinel) |sentinel_ptr| { const sentinel = @as(*align(1) const array_info.child, @ptrCast(sentinel_ptr)).*; @@ -969,7 +969,7 @@ fn lenSliceTo(ptr: anytype, comptime end: std.meta.Elem(@TypeOf(ptr))) usize { }, else => {}, }, - .Many => if (ptr_info.sentinel) |sentinel_ptr| { + .many => if (ptr_info.sentinel) |sentinel_ptr| { const sentinel = @as(*align(1) const ptr_info.child, @ptrCast(sentinel_ptr)).*; if (sentinel == end) { return indexOfSentinel(ptr_info.child, end, ptr); @@ -981,11 +981,11 @@ fn lenSliceTo(ptr: anytype, comptime end: std.meta.Elem(@TypeOf(ptr))) usize { while (ptr[i] != end and ptr[i] != sentinel) i += 1; return i; }, - .C => { + .c => { assert(ptr != null); return indexOfSentinel(ptr_info.child, end, ptr); }, - .Slice => { + .slice => { if (ptr_info.sentinel) |sentinel_ptr| { const sentinel = @as(*align(1) const ptr_info.child, @ptrCast(sentinel_ptr)).*; if (sentinel == end) { @@ -1039,13 +1039,13 @@ test lenSliceTo { pub fn len(value: anytype) usize { switch (@typeInfo(@TypeOf(value))) { .pointer => |info| switch (info.size) { - .Many => { + .many => { const sentinel_ptr = info.sentinel orelse @compileError("invalid type given to std.mem.len: " ++ @typeName(@TypeOf(value))); const sentinel = @as(*align(1) const info.child, @ptrCast(sentinel_ptr)).*; return indexOfSentinel(info.child, sentinel, value); }, - .C => { + .c => { assert(value != null); return indexOfSentinel(info.child, 0, value); }, @@ -3582,19 +3582,19 @@ fn ReverseIterator(comptime T: type) type { const Pointer = blk: { switch (@typeInfo(T)) { .pointer => |ptr_info| switch (ptr_info.size) { - .One => switch (@typeInfo(ptr_info.child)) { + .one => switch (@typeInfo(ptr_info.child)) { .array => |array_info| { var new_ptr_info = ptr_info; - new_ptr_info.size = .Many; + new_ptr_info.size = .many; new_ptr_info.child = array_info.child; new_ptr_info.sentinel = array_info.sentinel; break :blk @Type(.{ .pointer = new_ptr_info }); }, else => {}, }, - .Slice => { + .slice => { var new_ptr_info = ptr_info; - new_ptr_info.size = .Many; + new_ptr_info.size = .many; break :blk @Type(.{ .pointer = new_ptr_info }); }, else => {}, @@ -3606,7 +3606,7 @@ fn ReverseIterator(comptime T: type) type { const Element = std.meta.Elem(Pointer); const ElementPointer = @Type(.{ .pointer = ptr: { var ptr = @typeInfo(Pointer).pointer; - ptr.size = .One; + ptr.size = .one; ptr.child = Element; ptr.sentinel = null; break :ptr ptr; @@ -3912,7 +3912,7 @@ pub fn alignPointerOffset(ptr: anytype, align_to: usize) ?usize { const T = @TypeOf(ptr); const info = @typeInfo(T); - if (info != .pointer or info.pointer.size != .Many) + if (info != .pointer or info.pointer.size != .many) @compileError("expected many item pointer, got " ++ @typeName(T)); // Do nothing if the pointer is already well-aligned. @@ -3986,9 +3986,9 @@ fn CopyPtrAttrs( fn AsBytesReturnType(comptime P: type) type { const pointer = @typeInfo(P).pointer; - assert(pointer.size == .One); + assert(pointer.size == .one); const size = @sizeOf(pointer.child); - return CopyPtrAttrs(P, .One, [size]u8); + return CopyPtrAttrs(P, .one, [size]u8); } /// Given a pointer to a single item, returns a slice of the underlying bytes, preserving pointer attributes. @@ -4071,7 +4071,7 @@ test toBytes { } fn BytesAsValueReturnType(comptime T: type, comptime B: type) type { - return CopyPtrAttrs(B, .One, T); + return CopyPtrAttrs(B, .one, T); } /// Given a pointer to an array of bytes, returns a pointer to a value of the specified type @@ -4150,7 +4150,7 @@ test bytesToValue { } fn BytesAsSliceReturnType(comptime T: type, comptime bytesType: type) type { - return CopyPtrAttrs(bytesType, .Slice, T); + return CopyPtrAttrs(bytesType, .slice, T); } /// Given a slice of bytes, returns a slice of the specified type @@ -4162,7 +4162,7 @@ pub fn bytesAsSlice(comptime T: type, bytes: anytype) BytesAsSliceReturnType(T, return &[0]T{}; } - const cast_target = CopyPtrAttrs(@TypeOf(bytes), .Many, T); + const cast_target = CopyPtrAttrs(@TypeOf(bytes), .many, T); return @as(cast_target, @ptrCast(bytes))[0..@divExact(bytes.len, @sizeOf(T))]; } @@ -4237,7 +4237,7 @@ test "bytesAsSlice preserves pointer attributes" { } fn SliceAsBytesReturnType(comptime Slice: type) type { - return CopyPtrAttrs(Slice, .Slice, u8); + return CopyPtrAttrs(Slice, .slice, u8); } /// Given a slice, returns a slice of the underlying bytes, preserving pointer attributes. @@ -4251,7 +4251,7 @@ pub fn sliceAsBytes(slice: anytype) SliceAsBytesReturnType(@TypeOf(slice)) { // it may be equal to zero and fail a null check if (slice.len == 0 and std.meta.sentinel(Slice) == null) return &[0]u8{}; - const cast_target = CopyPtrAttrs(Slice, .Many, u8); + const cast_target = CopyPtrAttrs(Slice, .many, u8); return @as(cast_target, @ptrCast(slice))[0 .. slice.len * @sizeOf(std.meta.Elem(Slice))]; } @@ -4540,7 +4540,7 @@ fn AlignedSlice(comptime AttributeSource: type, comptime new_alignment: usize) t const info = @typeInfo(AttributeSource).pointer; return @Type(.{ .pointer = .{ - .size = .Slice, + .size = .slice, .is_const = info.is_const, .is_volatile = info.is_volatile, .is_allowzero = info.is_allowzero, diff --git a/lib/std/mem/Allocator.zig b/lib/std/mem/Allocator.zig index 8aea197d6ae8..5f403be16227 100644 --- a/lib/std/mem/Allocator.zig +++ b/lib/std/mem/Allocator.zig @@ -110,7 +110,7 @@ pub fn create(self: Allocator, comptime T: type) Error!*T { /// have the same address and alignment property. pub fn destroy(self: Allocator, ptr: anytype) void { const info = @typeInfo(@TypeOf(ptr)).pointer; - if (info.size != .One) @compileError("ptr must be a single item pointer"); + if (info.size != .one) @compileError("ptr must be a single item pointer"); const T = info.child; if (@sizeOf(T) == 0) return; const non_const_ptr = @as([*]u8, @ptrCast(@constCast(ptr))); diff --git a/lib/std/meta.zig b/lib/std/meta.zig index 44bfb65f8a04..5d3c9f34bef6 100644 --- a/lib/std/meta.zig +++ b/lib/std/meta.zig @@ -103,12 +103,12 @@ pub fn Elem(comptime T: type) type { .array => |info| return info.child, .vector => |info| return info.child, .pointer => |info| switch (info.size) { - .One => switch (@typeInfo(info.child)) { + .one => switch (@typeInfo(info.child)) { .array => |array_info| return array_info.child, .vector => |vector_info| return vector_info.child, else => {}, }, - .Many, .C, .Slice => return info.child, + .many, .c, .slice => return info.child, }, .optional => |info| return Elem(info.child), else => {}, @@ -138,11 +138,11 @@ pub inline fn sentinel(comptime T: type) ?Elem(T) { }, .pointer => |info| { switch (info.size) { - .Many, .Slice => { + .many, .slice => { const sentinel_ptr = info.sentinel orelse return null; return @as(*align(1) const info.child, @ptrCast(sentinel_ptr)).*; }, - .One => switch (@typeInfo(info.child)) { + .one => switch (@typeInfo(info.child)) { .array => |array_info| { const sentinel_ptr = array_info.sentinel orelse return null; return @as(*align(1) const array_info.child, @ptrCast(sentinel_ptr)).*; @@ -178,7 +178,7 @@ fn testSentinel() !void { pub fn Sentinel(comptime T: type, comptime sentinel_val: Elem(T)) type { switch (@typeInfo(T)) { .pointer => |info| switch (info.size) { - .One => switch (@typeInfo(info.child)) { + .one => switch (@typeInfo(info.child)) { .array => |array_info| return @Type(.{ .pointer = .{ .size = info.size, @@ -199,7 +199,7 @@ pub fn Sentinel(comptime T: type, comptime sentinel_val: Elem(T)) type { }), else => {}, }, - .Many, .Slice => return @Type(.{ + .many, .slice => return @Type(.{ .pointer = .{ .size = info.size, .is_const = info.is_const, @@ -215,7 +215,7 @@ pub fn Sentinel(comptime T: type, comptime sentinel_val: Elem(T)) type { }, .optional => |info| switch (@typeInfo(info.child)) { .pointer => |ptr_info| switch (ptr_info.size) { - .Many => return @Type(.{ + .many => return @Type(.{ .optional = .{ .child = @Type(.{ .pointer = .{ @@ -786,8 +786,8 @@ pub fn eql(a: anytype, b: @TypeOf(a)) bool { }, .pointer => |info| { return switch (info.size) { - .One, .Many, .C => a == b, - .Slice => a.ptr == b.ptr and a.len == b.len, + .one, .many, .c => a == b, + .slice => a.ptr == b.ptr and a.len == b.len, }; }, .optional => { @@ -1090,7 +1090,7 @@ test "Tuple deduplication" { test "ArgsTuple forwarding" { const T1 = std.meta.Tuple(&.{ u32, f32, i8 }); const T2 = std.meta.ArgsTuple(fn (u32, f32, i8) void); - const T3 = std.meta.ArgsTuple(fn (u32, f32, i8) callconv(.C) noreturn); + const T3 = std.meta.ArgsTuple(fn (u32, f32, i8) callconv(.c) noreturn); if (T1 != T2) { @compileError("std.meta.ArgsTuple produces different types than std.meta.Tuple"); @@ -1144,8 +1144,8 @@ test hasFn { pub inline fn hasMethod(comptime T: type, comptime name: []const u8) bool { return switch (@typeInfo(T)) { .pointer => |P| switch (P.size) { - .One => hasFn(P.child, name), - .Many, .Slice, .C => false, + .one => hasFn(P.child, name), + .many, .slice, .c => false, }, else => hasFn(T, name), }; @@ -1200,12 +1200,12 @@ pub inline fn hasUniqueRepresentation(comptime T: type) bool { .int => |info| @sizeOf(T) * 8 == info.bits, - .pointer => |info| info.size != .Slice, + .pointer => |info| info.size != .slice, .optional => |info| switch (@typeInfo(info.child)) { .pointer => |ptr| !ptr.is_allowzero and switch (ptr.size) { - .Slice, .C => false, - .One, .Many => true, + .slice, .c => false, + .one, .many => true, }, else => false, }, diff --git a/lib/std/os/emscripten.zig b/lib/std/os/emscripten.zig index 6c6a34ac47ef..ad7a3f65c1ce 100644 --- a/lib/std/os/emscripten.zig +++ b/lib/std/os/emscripten.zig @@ -12,7 +12,7 @@ const c = std.c; pub const FILE = c.FILE; var __stack_chk_guard: usize = 0; -fn __stack_chk_fail() callconv(.C) void { +fn __stack_chk_fail() callconv(.c) void { std.debug.print("stack smashing detected: terminated\n", .{}); emscripten_force_exit(127); } @@ -547,8 +547,8 @@ pub const SIG = struct { }; pub const Sigaction = extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; handler: extern union { handler: ?handler_fn, @@ -556,7 +556,7 @@ pub const Sigaction = extern struct { }, mask: sigset_t, flags: c_uint, - restorer: ?*const fn () callconv(.C) void = null, + restorer: ?*const fn () callconv(.c) void = null, }; pub const sigset_t = [1024 / 32]u32; @@ -909,23 +909,23 @@ pub const LOG = struct { pub const INFO = 512; }; -pub const em_callback_func = ?*const fn () callconv(.C) void; -pub const em_arg_callback_func = ?*const fn (?*anyopaque) callconv(.C) void; -pub const em_str_callback_func = ?*const fn ([*:0]const u8) callconv(.C) void; +pub const em_callback_func = ?*const fn () callconv(.c) void; +pub const em_arg_callback_func = ?*const fn (?*anyopaque) callconv(.c) void; +pub const em_str_callback_func = ?*const fn ([*:0]const u8) callconv(.c) void; pub extern "c" fn emscripten_async_wget(url: [*:0]const u8, file: [*:0]const u8, onload: em_str_callback_func, onerror: em_str_callback_func) void; -pub const em_async_wget_onload_func = ?*const fn (?*anyopaque, ?*anyopaque, c_int) callconv(.C) void; +pub const em_async_wget_onload_func = ?*const fn (?*anyopaque, ?*anyopaque, c_int) callconv(.c) void; pub extern "c" fn emscripten_async_wget_data(url: [*:0]const u8, arg: ?*anyopaque, onload: em_async_wget_onload_func, onerror: em_arg_callback_func) void; -pub const em_async_wget2_onload_func = ?*const fn (c_uint, ?*anyopaque, [*:0]const u8) callconv(.C) void; -pub const em_async_wget2_onstatus_func = ?*const fn (c_uint, ?*anyopaque, c_int) callconv(.C) void; +pub const em_async_wget2_onload_func = ?*const fn (c_uint, ?*anyopaque, [*:0]const u8) callconv(.c) void; +pub const em_async_wget2_onstatus_func = ?*const fn (c_uint, ?*anyopaque, c_int) callconv(.c) void; pub extern "c" fn emscripten_async_wget2(url: [*:0]const u8, file: [*:0]const u8, requesttype: [*:0]const u8, param: [*:0]const u8, arg: ?*anyopaque, onload: em_async_wget2_onload_func, onerror: em_async_wget2_onstatus_func, onprogress: em_async_wget2_onstatus_func) c_int; -pub const em_async_wget2_data_onload_func = ?*const fn (c_uint, ?*anyopaque, ?*anyopaque, c_uint) callconv(.C) void; -pub const em_async_wget2_data_onerror_func = ?*const fn (c_uint, ?*anyopaque, c_int, [*:0]const u8) callconv(.C) void; -pub const em_async_wget2_data_onprogress_func = ?*const fn (c_uint, ?*anyopaque, c_int, c_int) callconv(.C) void; +pub const em_async_wget2_data_onload_func = ?*const fn (c_uint, ?*anyopaque, ?*anyopaque, c_uint) callconv(.c) void; +pub const em_async_wget2_data_onerror_func = ?*const fn (c_uint, ?*anyopaque, c_int, [*:0]const u8) callconv(.c) void; +pub const em_async_wget2_data_onprogress_func = ?*const fn (c_uint, ?*anyopaque, c_int, c_int) callconv(.c) void; pub extern "c" fn emscripten_async_wget2_data(url: [*:0]const u8, requesttype: [*:0]const u8, param: [*:0]const u8, arg: ?*anyopaque, free: c_int, onload: em_async_wget2_data_onload_func, onerror: em_async_wget2_data_onerror_func, onprogress: em_async_wget2_data_onprogress_func) c_int; pub extern "c" fn emscripten_async_wget2_abort(handle: c_int) void; @@ -944,8 +944,8 @@ pub extern "c" fn emscripten_pause_main_loop() void; pub extern "c" fn emscripten_resume_main_loop() void; pub extern "c" fn emscripten_cancel_main_loop() void; -pub const em_socket_callback = ?*const fn (c_int, ?*anyopaque) callconv(.C) void; -pub const em_socket_error_callback = ?*const fn (c_int, c_int, [*:0]const u8, ?*anyopaque) callconv(.C) void; +pub const em_socket_callback = ?*const fn (c_int, ?*anyopaque) callconv(.c) void; +pub const em_socket_error_callback = ?*const fn (c_int, c_int, [*:0]const u8, ?*anyopaque) callconv(.c) void; pub extern "c" fn emscripten_set_socket_error_callback(userData: ?*anyopaque, callback: em_socket_error_callback) void; pub extern "c" fn emscripten_set_socket_open_callback(userData: ?*anyopaque, callback: em_socket_callback) void; @@ -968,11 +968,11 @@ pub extern "c" fn emscripten_set_canvas_size(width: c_int, height: c_int) void; pub extern "c" fn emscripten_get_canvas_size(width: *c_int, height: *c_int, isFullscreen: *c_int) void; pub extern "c" fn emscripten_get_now() f64; pub extern "c" fn emscripten_random() f32; -pub const em_idb_onload_func = ?*const fn (?*anyopaque, ?*anyopaque, c_int) callconv(.C) void; +pub const em_idb_onload_func = ?*const fn (?*anyopaque, ?*anyopaque, c_int) callconv(.c) void; pub extern "c" fn emscripten_idb_async_load(db_name: [*:0]const u8, file_id: [*:0]const u8, arg: ?*anyopaque, onload: em_idb_onload_func, onerror: em_arg_callback_func) void; pub extern "c" fn emscripten_idb_async_store(db_name: [*:0]const u8, file_id: [*:0]const u8, ptr: ?*anyopaque, num: c_int, arg: ?*anyopaque, onstore: em_arg_callback_func, onerror: em_arg_callback_func) void; pub extern "c" fn emscripten_idb_async_delete(db_name: [*:0]const u8, file_id: [*:0]const u8, arg: ?*anyopaque, ondelete: em_arg_callback_func, onerror: em_arg_callback_func) void; -pub const em_idb_exists_func = ?*const fn (?*anyopaque, c_int) callconv(.C) void; +pub const em_idb_exists_func = ?*const fn (?*anyopaque, c_int) callconv(.c) void; pub extern "c" fn emscripten_idb_async_exists(db_name: [*:0]const u8, file_id: [*:0]const u8, arg: ?*anyopaque, oncheck: em_idb_exists_func, onerror: em_arg_callback_func) void; pub extern "c" fn emscripten_idb_load(db_name: [*:0]const u8, file_id: [*:0]const u8, pbuffer: *?*anyopaque, pnum: *c_int, perror: *c_int) void; pub extern "c" fn emscripten_idb_store(db_name: [*:0]const u8, file_id: [*:0]const u8, buffer: *anyopaque, num: c_int, perror: *c_int) void; @@ -983,13 +983,13 @@ pub extern "c" fn emscripten_idb_store_blob(db_name: [*:0]const u8, file_id: [*: pub extern "c" fn emscripten_idb_read_from_blob(blob: c_int, start: c_int, num: c_int, buffer: ?*anyopaque) void; pub extern "c" fn emscripten_idb_free_blob(blob: c_int) void; pub extern "c" fn emscripten_run_preload_plugins(file: [*:0]const u8, onload: em_str_callback_func, onerror: em_str_callback_func) c_int; -pub const em_run_preload_plugins_data_onload_func = ?*const fn (?*anyopaque, [*:0]const u8) callconv(.C) void; +pub const em_run_preload_plugins_data_onload_func = ?*const fn (?*anyopaque, [*:0]const u8) callconv(.c) void; pub extern "c" fn emscripten_run_preload_plugins_data(data: [*]u8, size: c_int, suffix: [*:0]const u8, arg: ?*anyopaque, onload: em_run_preload_plugins_data_onload_func, onerror: em_arg_callback_func) void; pub extern "c" fn emscripten_lazy_load_code() void; pub const worker_handle = c_int; pub extern "c" fn emscripten_create_worker(url: [*:0]const u8) worker_handle; pub extern "c" fn emscripten_destroy_worker(worker: worker_handle) void; -pub const em_worker_callback_func = ?*const fn ([*]u8, c_int, ?*anyopaque) callconv(.C) void; +pub const em_worker_callback_func = ?*const fn ([*]u8, c_int, ?*anyopaque) callconv(.c) void; pub extern "c" fn emscripten_call_worker(worker: worker_handle, funcname: [*:0]const u8, data: [*]u8, size: c_int, callback: em_worker_callback_func, arg: ?*anyopaque) void; pub extern "c" fn emscripten_worker_respond(data: [*]u8, size: c_int) void; pub extern "c" fn emscripten_worker_respond_provisionally(data: [*]u8, size: c_int) void; @@ -1003,10 +1003,10 @@ pub extern "c" fn emscripten_get_preloaded_image_data_from_FILE(file: *FILE, w: pub extern "c" fn emscripten_log(flags: c_int, format: [*:0]const u8, ...) void; pub extern "c" fn emscripten_get_callstack(flags: c_int, out: ?[*]u8, maxbytes: c_int) c_int; pub extern "c" fn emscripten_print_double(x: f64, to: ?[*]u8, max: c_int) c_int; -pub const em_scan_func = ?*const fn (?*anyopaque, ?*anyopaque) callconv(.C) void; +pub const em_scan_func = ?*const fn (?*anyopaque, ?*anyopaque) callconv(.c) void; pub extern "c" fn emscripten_scan_registers(func: em_scan_func) void; pub extern "c" fn emscripten_scan_stack(func: em_scan_func) void; -pub const em_dlopen_callback = ?*const fn (?*anyopaque, ?*anyopaque) callconv(.C) void; +pub const em_dlopen_callback = ?*const fn (?*anyopaque, ?*anyopaque) callconv(.c) void; pub extern "c" fn emscripten_dlopen(filename: [*:0]const u8, flags: c_int, user_data: ?*anyopaque, onsuccess: em_dlopen_callback, onerror: em_arg_callback_func) void; pub extern "c" fn emscripten_dlopen_promise(filename: [*:0]const u8, flags: c_int) em_promise_t; pub extern "c" fn emscripten_throw_number(number: f64) void; @@ -1024,7 +1024,7 @@ pub const struct__em_promise = opaque {}; pub const em_promise_t = ?*struct__em_promise; pub const enum_em_promise_result_t = c_uint; pub const em_promise_result_t = enum_em_promise_result_t; -pub const em_promise_callback_t = ?*const fn (?*?*anyopaque, ?*anyopaque, ?*anyopaque) callconv(.C) em_promise_result_t; +pub const em_promise_callback_t = ?*const fn (?*?*anyopaque, ?*anyopaque, ?*anyopaque) callconv(.c) em_promise_result_t; pub extern "c" fn emscripten_promise_create() em_promise_t; pub extern "c" fn emscripten_promise_destroy(promise: em_promise_t) void; diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 85a98a574f66..09d82b8a6181 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -67,7 +67,7 @@ pub const syscall_pipe = syscall_bits.syscall_pipe; pub const syscall_fork = syscall_bits.syscall_fork; pub fn clone( - func: *const fn (arg: usize) callconv(.C) u8, + func: *const fn (arg: usize) callconv(.c) u8, stack: usize, flags: u32, arg: usize, @@ -77,14 +77,14 @@ pub fn clone( ) usize { // Can't directly call a naked function; cast to C calling convention first. return @as(*const fn ( - *const fn (arg: usize) callconv(.C) u8, + *const fn (arg: usize) callconv(.c) u8, usize, u32, usize, ?*i32, usize, ?*i32, - ) callconv(.C) usize, @ptrCast(&syscall_bits.clone))(func, stack, flags, arg, ptid, tp, ctid); + ) callconv(.c) usize, @ptrCast(&syscall_bits.clone))(func, stack, flags, arg, ptid, tp, ctid); } pub const ARCH = arch_bits.ARCH; @@ -494,7 +494,7 @@ pub const getauxval = if (extern_getauxval) struct { extern fn getauxval(index: usize) usize; }.getauxval else getauxvalImpl; -fn getauxvalImpl(index: usize) callconv(.C) usize { +fn getauxvalImpl(index: usize) callconv(.c) usize { const auxv = elf_aux_maybe orelse return 0; var i: usize = 0; while (auxv[i].a_type != std.elf.AT_NULL) : (i += 1) { @@ -1485,7 +1485,7 @@ pub fn flock(fd: fd_t, operation: i32) usize { } // We must follow the C calling convention when we call into the VDSO -const VdsoClockGettime = *align(1) const fn (clockid_t, *timespec) callconv(.C) usize; +const VdsoClockGettime = *align(1) const fn (clockid_t, *timespec) callconv(.c) usize; var vdso_clock_gettime: ?VdsoClockGettime = &init_vdso_clock_gettime; pub fn clock_gettime(clk_id: clockid_t, tp: *timespec) usize { @@ -1502,7 +1502,7 @@ pub fn clock_gettime(clk_id: clockid_t, tp: *timespec) usize { return syscall2(.clock_gettime, @intFromEnum(clk_id), @intFromPtr(tp)); } -fn init_vdso_clock_gettime(clk: clockid_t, ts: *timespec) callconv(.C) usize { +fn init_vdso_clock_gettime(clk: clockid_t, ts: *timespec) callconv(.c) usize { const ptr: ?VdsoClockGettime = @ptrFromInt(vdso.lookup(VDSO.CGT_VER, VDSO.CGT_SYM)); // Note that we may not have a VDSO at all, update the stub address anyway // so that clock_gettime will fall back on the good old (and slow) syscall @@ -5070,8 +5070,8 @@ pub const all_mask: sigset_t = [_]u32{0xffffffff} ** @typeInfo(sigset_t).array.l pub const app_mask: sigset_t = [2]u32{ 0xfffffffc, 0x7fffffff } ++ [_]u32{0xffffffff} ** 30; const k_sigaction_funcs = struct { - const handler = ?*align(1) const fn (i32) callconv(.C) void; - const restorer = *const fn () callconv(.C) void; + const handler = ?*align(1) const fn (i32) callconv(.c) void; + const restorer = *const fn () callconv(.c) void; }; pub const k_sigaction = switch (native_arch) { @@ -5097,8 +5097,8 @@ pub const k_sigaction = switch (native_arch) { /// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall. pub const Sigaction = extern struct { - pub const handler_fn = *align(1) const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *align(1) const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; handler: extern union { handler: ?handler_fn, @@ -5106,7 +5106,7 @@ pub const Sigaction = extern struct { }, mask: sigset_t, flags: c_uint, - restorer: ?*const fn () callconv(.C) void = null, + restorer: ?*const fn () callconv(.c) void = null, }; const sigset_len = @typeInfo(sigset_t).array.len; diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig index d81e6fb40a78..17df65feb72d 100644 --- a/lib/std/os/linux/sparc64.zig +++ b/lib/std/os/linux/sparc64.zig @@ -233,7 +233,7 @@ pub const restore = restore_rt; // Need to use C ABI here instead of naked // to prevent an infinite loop when calling rt_sigreturn. -pub fn restore_rt() callconv(.C) void { +pub fn restore_rt() callconv(.c) void { return asm volatile ("t 0x6d" : : [number] "{g1}" (@intFromEnum(SYS.rt_sigreturn)), diff --git a/lib/std/os/plan9.zig b/lib/std/os/plan9.zig index 0c48493b4cd6..90f45ef7fb48 100644 --- a/lib/std/os/plan9.zig +++ b/lib/std/os/plan9.zig @@ -186,8 +186,8 @@ pub const empty_sigset = 0; pub const siginfo_t = c_long; // TODO plan9 doesn't have sigaction_fn. Sigaction is not a union, but we include it here to be compatible. pub const Sigaction = extern struct { - pub const handler_fn = *const fn (i32) callconv(.C) void; - pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.C) void; + pub const handler_fn = *const fn (i32) callconv(.c) void; + pub const sigaction_fn = *const fn (i32, *const siginfo_t, ?*anyopaque) callconv(.c) void; handler: extern union { handler: ?handler_fn, diff --git a/lib/std/os/uefi/tables/boot_services.zig b/lib/std/os/uefi/tables/boot_services.zig index 04d912753b16..4ef346db4100 100644 --- a/lib/std/os/uefi/tables/boot_services.zig +++ b/lib/std/os/uefi/tables/boot_services.zig @@ -149,11 +149,11 @@ pub const BootServices = extern struct { /// Installs one or more protocol interfaces into the boot services environment // TODO: use callconv(cc) instead once that works - installMultipleProtocolInterfaces: *const fn (handle: *Handle, ...) callconv(.C) Status, + installMultipleProtocolInterfaces: *const fn (handle: *Handle, ...) callconv(.c) Status, /// Removes one or more protocol interfaces into the boot services environment // TODO: use callconv(cc) instead once that works - uninstallMultipleProtocolInterfaces: *const fn (handle: *Handle, ...) callconv(.C) Status, + uninstallMultipleProtocolInterfaces: *const fn (handle: *Handle, ...) callconv(.c) Status, /// Computes and returns a 32-bit CRC for a data buffer. calculateCrc32: *const fn (data: [*]const u8, data_size: usize, *u32) callconv(cc) Status, diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 100500bec40c..f07421fdc19b 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -5552,7 +5552,7 @@ pub fn dl_iterate_phdr( if (builtin.link_libc) { switch (system.dl_iterate_phdr(struct { - fn callbackC(info: *dl_phdr_info, size: usize, data: ?*anyopaque) callconv(.C) c_int { + fn callbackC(info: *dl_phdr_info, size: usize, data: ?*anyopaque) callconv(.c) c_int { const context_ptr: *const Context = @ptrCast(@alignCast(data)); callback(info, size, context_ptr.*) catch |err| return @intFromError(err); return 0; diff --git a/lib/std/posix/test.zig b/lib/std/posix/test.zig index dba7dcde6d9c..653637c0a7cc 100644 --- a/lib/std/posix/test.zig +++ b/lib/std/posix/test.zig @@ -849,7 +849,7 @@ test "sigaction" { const S = struct { var handler_called_count: u32 = 0; - fn handler(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.C) void { + fn handler(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.c) void { _ = ctx_ptr; // Check that we received the correct signal. switch (native_os) { diff --git a/lib/std/testing.zig b/lib/std/testing.zig index fb75672fbd4f..4d334b340796 100644 --- a/lib/std/testing.zig +++ b/lib/std/testing.zig @@ -100,13 +100,13 @@ fn expectEqualInner(comptime T: type, expected: T, actual: T) !void { .pointer => |pointer| { switch (pointer.size) { - .One, .Many, .C => { + .one, .many, .c => { if (actual != expected) { print("expected {*}, found {*}\n", .{ expected, actual }); return error.TestExpectedEqual; } }, - .Slice => { + .slice => { if (actual.ptr != expected.ptr) { print("expected slice ptr {*}, found {*}\n", .{ expected.ptr, actual.ptr }); return error.TestExpectedEqual; @@ -726,13 +726,13 @@ fn expectEqualDeepInner(comptime T: type, expected: T, actual: T) error{TestExpe .pointer => |pointer| { switch (pointer.size) { // We have no idea what is behind those pointers, so the best we can do is `==` check. - .C, .Many => { + .c, .many => { if (actual != expected) { print("expected {*}, found {*}\n", .{ expected, actual }); return error.TestExpectedEqual; } }, - .One => { + .one => { // Length of those pointers are runtime value, so the best we can do is `==` check. switch (@typeInfo(pointer.child)) { .@"fn", .@"opaque" => { @@ -744,7 +744,7 @@ fn expectEqualDeepInner(comptime T: type, expected: T, actual: T) error{TestExpe else => try expectEqualDeep(expected.*, actual.*), } }, - .Slice => { + .slice => { if (expected.len != actual.len) { print("Slice len not the same, expected {d}, found {d}\n", .{ expected.len, actual.len }); return error.TestExpectedEqual; diff --git a/lib/std/zig/Ast.zig b/lib/std/zig/Ast.zig index 335168322f55..3f69ce5aeb6b 100644 --- a/lib/std/zig/Ast.zig +++ b/lib/std/zig/Ast.zig @@ -2157,14 +2157,13 @@ fn fullFnProtoComponents(tree: Ast, info: full.FnProto.Components) full.FnProto fn fullPtrTypeComponents(tree: Ast, info: full.PtrType.Components) full.PtrType { const token_tags = tree.tokens.items(.tag); - const Size = std.builtin.Type.Pointer.Size; - const size: Size = switch (token_tags[info.main_token]) { + const size: std.builtin.Type.Pointer.Size = switch (token_tags[info.main_token]) { .asterisk, .asterisk_asterisk, - => .One, + => .one, .l_bracket => switch (token_tags[info.main_token + 1]) { - .asterisk => if (token_tags[info.main_token + 2] == .identifier) Size.C else Size.Many, - else => Size.Slice, + .asterisk => if (token_tags[info.main_token + 2] == .identifier) .c else .many, + else => .slice, }, else => unreachable, }; @@ -2180,7 +2179,7 @@ fn fullPtrTypeComponents(tree: Ast, info: full.PtrType.Components) full.PtrType // positives. Therefore, start after a sentinel if there is one and // skip over any align node and bit range nodes. var i = if (info.sentinel != 0) tree.lastToken(info.sentinel) + 1 else switch (size) { - .Many, .C => info.main_token + 1, + .many, .c => info.main_token + 1, else => info.main_token, }; const end = tree.firstToken(info.child_type); diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index 2936f9bc3de4..aeb4b7a311c7 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -3917,7 +3917,7 @@ fn ptrType( node: Ast.Node.Index, ptr_info: Ast.full.PtrType, ) InnerError!Zir.Inst.Ref { - if (ptr_info.size == .C and ptr_info.allowzero_token != null) { + if (ptr_info.size == .c and ptr_info.allowzero_token != null) { return gz.astgen.failTok(ptr_info.allowzero_token.?, "C pointers always allow address zero", .{}); } @@ -3946,7 +3946,7 @@ fn ptrType( .{ .rl = .{ .ty = elem_type } }, ptr_info.ast.sentinel, switch (ptr_info.size) { - .Slice => .slice_sentinel, + .slice => .slice_sentinel, else => .pointer_sentinel, }, ); diff --git a/lib/std/zig/c_translation.zig b/lib/std/zig/c_translation.zig index 39f7fa9a113f..5d1688284552 100644 --- a/lib/std/zig/c_translation.zig +++ b/lib/std/zig/c_translation.zig @@ -170,7 +170,7 @@ pub fn sizeof(target: anytype) usize { } }, .pointer => |ptr| { - if (ptr.size == .Slice) { + if (ptr.size == .slice) { @compileError("Cannot use C sizeof on slice type " ++ @typeName(T)); } // for strings, sizeof("a") returns 2. @@ -178,7 +178,7 @@ pub fn sizeof(target: anytype) usize { // in the .array case above, but strings remain literals // and are therefore always pointers, so they need to be // specially handled here. - if (ptr.size == .One and ptr.is_const and @typeInfo(ptr.child) == .array) { + if (ptr.size == .one and ptr.is_const and @typeInfo(ptr.child) == .array) { const array_info = @typeInfo(ptr.child).array; if ((array_info.child == u8 or array_info.child == u16) and array_info.sentinel != null and @@ -341,7 +341,7 @@ pub fn FlexibleArrayType(comptime SelfType: type, comptime ElementType: type) ty switch (@typeInfo(SelfType)) { .pointer => |ptr| { return @Type(.{ .pointer = .{ - .size = .C, + .size = .c, .is_const = ptr.is_const, .is_volatile = ptr.is_volatile, .alignment = @alignOf(ElementType), diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index 526181654472..f87d2827396a 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -552,7 +552,7 @@ test "zig fmt: trailing comma in fn parameter list" { \\pub fn f( \\ a: i32, \\ b: i32, - \\) callconv(.C) i32 {} + \\) callconv(.c) i32 {} \\pub fn f( \\ a: i32, \\ b: i32, @@ -560,15 +560,15 @@ test "zig fmt: trailing comma in fn parameter list" { \\pub fn f( \\ a: i32, \\ b: i32, - \\) align(8) callconv(.C) i32 {} + \\) align(8) callconv(.c) i32 {} \\pub fn f( \\ a: i32, \\ b: i32, - \\) align(8) linksection(".text") callconv(.C) i32 {} + \\) align(8) linksection(".text") callconv(.c) i32 {} \\pub fn f( \\ a: i32, \\ b: i32, - \\) linksection(".text") callconv(.C) i32 {} + \\) linksection(".text") callconv(.c) i32 {} \\ ); } diff --git a/lib/std/zig/render.zig b/lib/std/zig/render.zig index b71c94e71fd2..2f0fd57e46f7 100644 --- a/lib/std/zig/render.zig +++ b/lib/std/zig/render.zig @@ -938,7 +938,7 @@ fn renderArrayType( fn renderPtrType(r: *Render, ptr_type: Ast.full.PtrType, space: Space) Error!void { const tree = r.tree; switch (ptr_type.size) { - .One => { + .one => { // Since ** tokens exist and the same token is shared by two // nested pointer types, we check to see if we are the parent // in such a relationship. If so, skip rendering anything for @@ -951,7 +951,7 @@ fn renderPtrType(r: *Render, ptr_type: Ast.full.PtrType, space: Space) Error!voi } try renderToken(r, ptr_type.ast.main_token, .none); // asterisk }, - .Many => { + .many => { if (ptr_type.ast.sentinel == 0) { try renderToken(r, ptr_type.ast.main_token, .none); // lbracket try renderToken(r, ptr_type.ast.main_token + 1, .none); // asterisk @@ -964,13 +964,13 @@ fn renderPtrType(r: *Render, ptr_type: Ast.full.PtrType, space: Space) Error!voi try renderToken(r, tree.lastToken(ptr_type.ast.sentinel) + 1, .none); // rbracket } }, - .C => { + .c => { try renderToken(r, ptr_type.ast.main_token, .none); // lbracket try renderToken(r, ptr_type.ast.main_token + 1, .none); // asterisk try renderToken(r, ptr_type.ast.main_token + 2, .none); // c try renderToken(r, ptr_type.ast.main_token + 3, .none); // rbracket }, - .Slice => { + .slice => { if (ptr_type.ast.sentinel == 0) { try renderToken(r, ptr_type.ast.main_token, .none); // lbracket try renderToken(r, ptr_type.ast.main_token + 1, .none); // rbracket diff --git a/lib/std/zig/system/x86.zig b/lib/std/zig/system/x86.zig index c268c7da6b25..7bd1148e13e9 100644 --- a/lib/std/zig/system/x86.zig +++ b/lib/std/zig/system/x86.zig @@ -475,7 +475,7 @@ const CpuidLeaf = packed struct { /// This is a workaround for the C backend until zig has the ability to put /// C code in inline assembly. -extern fn zig_x86_cpuid(leaf_id: u32, subid: u32, eax: *u32, ebx: *u32, ecx: *u32, edx: *u32) callconv(.C) void; +extern fn zig_x86_cpuid(leaf_id: u32, subid: u32, eax: *u32, ebx: *u32, ecx: *u32, edx: *u32) callconv(.c) void; fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf { // valid for both x86 and x86_64 @@ -502,7 +502,7 @@ fn cpuid(leaf_id: u32, subid: u32) CpuidLeaf { /// This is a workaround for the C backend until zig has the ability to put /// C code in inline assembly. -extern fn zig_x86_get_xcr0() callconv(.C) u32; +extern fn zig_x86_get_xcr0() callconv(.c) u32; // Read control register 0 (XCR0). Used to detect features such as AVX. fn getXCR0() u32 { diff --git a/src/InternPool.zig b/src/InternPool.zig index 30a0dd087c62..4974c54761d3 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -1176,17 +1176,17 @@ const Local = struct { } }); } - pub fn addOne(mutable: Mutable) Allocator.Error!PtrElem(.{ .size = .One }) { + pub fn addOne(mutable: Mutable) Allocator.Error!PtrElem(.{ .size = .one }) { try mutable.ensureUnusedCapacity(1); return mutable.addOneAssumeCapacity(); } - pub fn addOneAssumeCapacity(mutable: Mutable) PtrElem(.{ .size = .One }) { + pub fn addOneAssumeCapacity(mutable: Mutable) PtrElem(.{ .size = .one }) { const index = mutable.mutate.len; assert(index < mutable.list.header().capacity); mutable.mutate.len = index + 1; const mutable_view = mutable.view().slice(); - var ptr: PtrElem(.{ .size = .One }) = undefined; + var ptr: PtrElem(.{ .size = .one }) = undefined; inline for (fields) |field| { @field(ptr, @tagName(field)) = &mutable_view.items(field)[index]; } @@ -1206,7 +1206,7 @@ const Local = struct { pub fn appendSliceAssumeCapacity( mutable: Mutable, - slice: PtrElem(.{ .size = .Slice, .is_const = true }), + slice: PtrElem(.{ .size = .slice, .is_const = true }), ) void { if (fields.len == 0) return; const start = mutable.mutate.len; @@ -1253,17 +1253,17 @@ const Local = struct { return ptr_array; } - pub fn addManyAsSlice(mutable: Mutable, len: usize) Allocator.Error!PtrElem(.{ .size = .Slice }) { + pub fn addManyAsSlice(mutable: Mutable, len: usize) Allocator.Error!PtrElem(.{ .size = .slice }) { try mutable.ensureUnusedCapacity(len); return mutable.addManyAsSliceAssumeCapacity(len); } - pub fn addManyAsSliceAssumeCapacity(mutable: Mutable, len: usize) PtrElem(.{ .size = .Slice }) { + pub fn addManyAsSliceAssumeCapacity(mutable: Mutable, len: usize) PtrElem(.{ .size = .slice }) { const start = mutable.mutate.len; assert(len <= mutable.list.header().capacity - start); mutable.mutate.len = @intCast(start + len); const mutable_view = mutable.view().slice(); - var slice: PtrElem(.{ .size = .Slice }) = undefined; + var slice: PtrElem(.{ .size = .slice }) = undefined; inline for (fields) |field| { @field(slice, @tagName(field)) = mutable_view.items(field)[start..][0..len]; } @@ -2060,7 +2060,7 @@ pub const Key = union(enum) { }; pub const Flags = packed struct(u32) { - size: Size = .One, + size: Size = .one, /// `none` indicates the ABI alignment of the pointee_type. In this /// case, this field *must* be set to `none`, otherwise the /// `InternPool` equality and hashing functions will return incorrect @@ -4891,7 +4891,7 @@ pub const Index = enum(u32) { checkField(name ++ ".?", info.child); }, .pointer => |info| { - assert(info.size == .Slice); + assert(info.size == .slice); checkConfig(name ++ ".len"); checkField(name ++ "[0]", info.child); }, @@ -5016,7 +5016,7 @@ pub const static_keys = [_]Key{ .{ .ptr_type = .{ .child = .u8_type, .flags = .{ - .size = .Many, + .size = .many, }, } }, @@ -5024,7 +5024,7 @@ pub const static_keys = [_]Key{ .{ .ptr_type = .{ .child = .u8_type, .flags = .{ - .size = .Many, + .size = .many, .is_const = true, }, } }, @@ -5034,7 +5034,7 @@ pub const static_keys = [_]Key{ .child = .u8_type, .sentinel = .zero_u8, .flags = .{ - .size = .Many, + .size = .many, .is_const = true, }, } }, @@ -5043,7 +5043,7 @@ pub const static_keys = [_]Key{ .{ .ptr_type = .{ .child = .comptime_int_type, .flags = .{ - .size = .One, + .size = .one, .is_const = true, }, } }, @@ -5052,7 +5052,7 @@ pub const static_keys = [_]Key{ .{ .ptr_type = .{ .child = .u8_type, .flags = .{ - .size = .Slice, + .size = .slice, .is_const = true, }, } }, @@ -5062,7 +5062,7 @@ pub const static_keys = [_]Key{ .child = .u8_type, .sentinel = .zero_u8, .flags = .{ - .size = .Slice, + .size = .slice, .is_const = true, }, } }, @@ -6749,7 +6749,7 @@ pub fn indexToKey(ip: *const InternPool, index: Index) Key { const many_ptr_item = many_ptr_unwrapped.getItem(ip); assert(many_ptr_item.tag == .type_pointer); var ptr_info = extraData(many_ptr_unwrapped.getExtra(ip), Tag.TypePointer, many_ptr_item.data); - ptr_info.flags.size = .Slice; + ptr_info.flags.size = .slice; return .{ .ptr_type = ptr_info }; }, @@ -7572,10 +7572,10 @@ pub fn get(ip: *InternPool, gpa: Allocator, tid: Zcu.PerThread.Id, key: Key) All assert(ptr_type.child != .none); assert(ptr_type.sentinel == .none or ip.typeOf(ptr_type.sentinel) == ptr_type.child); - if (ptr_type.flags.size == .Slice) { + if (ptr_type.flags.size == .slice) { gop.cancel(); var new_key = key; - new_key.ptr_type.flags.size = .Many; + new_key.ptr_type.flags.size = .many; const ptr_type_index = try ip.get(gpa, tid, new_key); gop = try ip.getOrPutKey(gpa, tid, key); @@ -7588,7 +7588,7 @@ pub fn get(ip: *InternPool, gpa: Allocator, tid: Zcu.PerThread.Id, key: Key) All } var ptr_type_adjusted = ptr_type; - if (ptr_type.flags.size == .C) ptr_type_adjusted.flags.is_allowzero = true; + if (ptr_type.flags.size == .c) ptr_type_adjusted.flags.is_allowzero = true; items.appendAssumeCapacity(.{ .tag = .type_pointer, @@ -7731,8 +7731,8 @@ pub fn get(ip: *InternPool, gpa: Allocator, tid: Zcu.PerThread.Id, key: Key) All }, .slice => |slice| { - assert(ip.indexToKey(slice.ty).ptr_type.flags.size == .Slice); - assert(ip.indexToKey(ip.typeOf(slice.ptr)).ptr_type.flags.size == .Many); + assert(ip.indexToKey(slice.ty).ptr_type.flags.size == .slice); + assert(ip.indexToKey(ip.typeOf(slice.ptr)).ptr_type.flags.size == .many); items.appendAssumeCapacity(.{ .tag = .ptr_slice, .data = try addExtra(extra, PtrSlice{ @@ -7745,7 +7745,7 @@ pub fn get(ip: *InternPool, gpa: Allocator, tid: Zcu.PerThread.Id, key: Key) All .ptr => |ptr| { const ptr_type = ip.indexToKey(ptr.ty).ptr_type; - assert(ptr_type.flags.size != .Slice); + assert(ptr_type.flags.size != .slice); items.appendAssumeCapacity(switch (ptr.base_addr) { .nav => |nav| .{ .tag = .ptr_nav, @@ -7804,9 +7804,9 @@ pub fn get(ip: *InternPool, gpa: Allocator, tid: Zcu.PerThread.Id, key: Key) All .arr_elem, .field => |base_index| { const base_ptr_type = ip.indexToKey(ip.typeOf(base_index.base)).ptr_type; switch (ptr.base_addr) { - .arr_elem => assert(base_ptr_type.flags.size == .Many), + .arr_elem => assert(base_ptr_type.flags.size == .many), .field => { - assert(base_ptr_type.flags.size == .One); + assert(base_ptr_type.flags.size == .one); switch (ip.indexToKey(base_ptr_type.child)) { .tuple_type => |tuple_type| { assert(ptr.base_addr == .field); @@ -7823,7 +7823,7 @@ pub fn get(ip: *InternPool, gpa: Allocator, tid: Zcu.PerThread.Id, key: Key) All }, .ptr_type => |slice_type| { assert(ptr.base_addr == .field); - assert(slice_type.flags.size == .Slice); + assert(slice_type.flags.size == .slice); assert(base_index.index < 2); }, else => unreachable, @@ -10314,12 +10314,12 @@ pub fn getCoerced( } }); if (ip.isPointerType(new_ty)) switch (ip.indexToKey(new_ty).ptr_type.flags.size) { - .One, .Many, .C => return ip.get(gpa, tid, .{ .ptr = .{ + .one, .many, .c => return ip.get(gpa, tid, .{ .ptr = .{ .ty = new_ty, .base_addr = .int, .byte_offset = 0, } }), - .Slice => return ip.get(gpa, tid, .{ .slice = .{ + .slice => return ip.get(gpa, tid, .{ .slice = .{ .ty = new_ty, .ptr = try ip.get(gpa, tid, .{ .ptr = .{ .ty = ip.slicePtrType(new_ty), @@ -10408,7 +10408,7 @@ pub fn getCoerced( }, else => {}, }, - .slice => |slice| if (ip.isPointerType(new_ty) and ip.indexToKey(new_ty).ptr_type.flags.size == .Slice) + .slice => |slice| if (ip.isPointerType(new_ty) and ip.indexToKey(new_ty).ptr_type.flags.size == .slice) return ip.get(gpa, tid, .{ .slice = .{ .ty = new_ty, .ptr = try ip.getCoerced(gpa, tid, slice.ptr, ip.slicePtrType(new_ty)), @@ -10416,7 +10416,7 @@ pub fn getCoerced( } }) else if (ip.isIntegerType(new_ty)) return ip.getCoerced(gpa, tid, slice.ptr, new_ty), - .ptr => |ptr| if (ip.isPointerType(new_ty) and ip.indexToKey(new_ty).ptr_type.flags.size != .Slice) + .ptr => |ptr| if (ip.isPointerType(new_ty) and ip.indexToKey(new_ty).ptr_type.flags.size != .slice) return ip.get(gpa, tid, .{ .ptr = .{ .ty = new_ty, .base_addr = ptr.base_addr, @@ -10433,12 +10433,12 @@ pub fn getCoerced( .opt => |opt| switch (ip.indexToKey(new_ty)) { .ptr_type => |ptr_type| return switch (opt.val) { .none => switch (ptr_type.flags.size) { - .One, .Many, .C => try ip.get(gpa, tid, .{ .ptr = .{ + .one, .many, .c => try ip.get(gpa, tid, .{ .ptr = .{ .ty = new_ty, .base_addr = .int, .byte_offset = 0, } }), - .Slice => try ip.get(gpa, tid, .{ .slice = .{ + .slice => try ip.get(gpa, tid, .{ .slice = .{ .ty = new_ty, .ptr = try ip.get(gpa, tid, .{ .ptr = .{ .ty = ip.slicePtrType(new_ty), diff --git a/src/Sema.zig b/src/Sema.zig index 4a62e495c7f7..12c860633ef8 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2479,7 +2479,7 @@ fn typeSupportsFieldAccess(zcu: *const Zcu, ty: Type, field_name: InternPool.Nul .array => return field_name.eqlSlice("len", ip), .pointer => { const ptr_info = ty.ptrInfo(zcu); - if (ptr_info.flags.size == .Slice) { + if (ptr_info.flags.size == .slice) { return field_name.eqlSlice("ptr", ip) or field_name.eqlSlice("len", ip); } else if (Type.fromInterned(ptr_info.child).zigTypeTag(zcu) == .array) { return field_name.eqlSlice("len", ip); @@ -3653,7 +3653,7 @@ fn indexablePtrLenOrNone( const zcu = pt.zcu; const operand_ty = sema.typeOf(operand); try checkMemOperand(sema, block, src, operand_ty); - if (operand_ty.ptrSize(zcu) == .Many) return .none; + if (operand_ty.ptrSize(zcu) == .many) return .none; const field_name = try zcu.intern_pool.getOrPutString(sema.gpa, pt.tid, "len", .no_embedded_nulls); return sema.fieldVal(block, src, operand, field_name, src); } @@ -4544,7 +4544,7 @@ fn zirCoercePtrElemTy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE assert(ptr_ty.zigTypeTag(zcu) == .pointer); // validated by a previous instruction const elem_ty = ptr_ty.childType(zcu); switch (ptr_ty.ptrSize(zcu)) { - .One => { + .one => { const uncoerced_ty = sema.typeOf(uncoerced_val); if (elem_ty.zigTypeTag(zcu) == .array and elem_ty.childType(zcu).toIntern() == uncoerced_ty.toIntern()) { // We're trying to initialize a *[1]T with a reference to a T - don't perform any coercion. @@ -4557,7 +4557,7 @@ fn zirCoercePtrElemTy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE return sema.coerce(block, elem_ty, uncoerced_val, src); } }, - .Slice, .Many => { + .slice, .many => { // Our goal is to coerce `uncoerced_val` to an array of `elem_ty`. const val_ty = sema.typeOf(uncoerced_val); switch (val_ty.zigTypeTag(zcu)) { @@ -4573,7 +4573,7 @@ fn zirCoercePtrElemTy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE }); return sema.coerce(block, want_ty, uncoerced_val, src); }, - .C => { + .c => { // There's nothing meaningful to do here, because we don't know if this is meant to be a // single-pointer or a many-pointer. return uncoerced_val; @@ -4685,7 +4685,7 @@ fn zirValidateArrayInitRefTy( assert(ptr_ty.zigTypeTag(zcu) == .pointer); // validated by a previous instruction switch (zcu.intern_pool.indexToKey(ptr_ty.toIntern())) { .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .Slice, .Many => { + .slice, .many => { // Use array of correct length const arr_ty = try pt.arrayType(.{ .len = extra.elem_count, @@ -5502,9 +5502,9 @@ fn zirValidateDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr if (operand_ty.zigTypeTag(zcu) != .pointer) { return sema.fail(block, src, "cannot dereference non-pointer type '{}'", .{operand_ty.fmt(pt)}); } else switch (operand_ty.ptrSize(zcu)) { - .One, .C => {}, - .Many => return sema.fail(block, src, "index syntax required for unknown-length pointer type '{}'", .{operand_ty.fmt(pt)}), - .Slice => return sema.fail(block, src, "index syntax required for slice type '{}'", .{operand_ty.fmt(pt)}), + .one, .c => {}, + .many => return sema.fail(block, src, "index syntax required for unknown-length pointer type '{}'", .{operand_ty.fmt(pt)}), + .slice => return sema.fail(block, src, "index syntax required for slice type '{}'", .{operand_ty.fmt(pt)}), } if ((try sema.typeHasOnePossibleValue(operand_ty.childType(zcu))) != null) { @@ -6521,7 +6521,7 @@ fn zirExport(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void return sema.fail(block, ptr_src, "expected pointer type, found '{}'", .{ptr_ty.fmt(pt)}); } const ptr_ty_info = ptr_ty.ptrInfo(zcu); - if (ptr_ty_info.flags.size == .Slice) { + if (ptr_ty_info.flags.size == .slice) { return sema.fail(block, ptr_src, "export target cannot be slice", .{}); } if (ptr_ty_info.packed_offset.host_size != 0) { @@ -7271,7 +7271,7 @@ fn checkCallArgumentCount( .@"fn" => break :func_ty callee_ty, .pointer => { const ptr_info = callee_ty.ptrInfo(zcu); - if (ptr_info.flags.size == .One and Type.fromInterned(ptr_info.child).zigTypeTag(zcu) == .@"fn") { + if (ptr_info.flags.size == .one and Type.fromInterned(ptr_info.child).zigTypeTag(zcu) == .@"fn") { break :func_ty Type.fromInterned(ptr_info.child); } }, @@ -7350,7 +7350,7 @@ fn callBuiltin( .@"fn" => break :func_ty callee_ty, .pointer => { const ptr_info = callee_ty.ptrInfo(zcu); - if (ptr_info.flags.size == .One and Type.fromInterned(ptr_info.child).zigTypeTag(zcu) == .@"fn") { + if (ptr_info.flags.size == .one and Type.fromInterned(ptr_info.child).zigTypeTag(zcu) == .@"fn") { break :func_ty Type.fromInterned(ptr_info.child); } }, @@ -8344,8 +8344,8 @@ fn zirIndexablePtrElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com }; try sema.checkMemOperand(block, src, ptr_ty); const elem_ty = switch (ptr_ty.ptrSize(zcu)) { - .Slice, .Many, .C => ptr_ty.childType(zcu), - .One => ptr_ty.childType(zcu).childType(zcu), + .slice, .many, .c => ptr_ty.childType(zcu), + .one => ptr_ty.childType(zcu).childType(zcu), }; return Air.internedToRef(elem_ty.toIntern()); } @@ -8943,7 +8943,7 @@ fn zirOptionalPayload( const result_ty = switch (operand_ty.zigTypeTag(zcu)) { .optional => operand_ty.optionalChild(zcu), .pointer => t: { - if (operand_ty.ptrSize(zcu) != .C) { + if (operand_ty.ptrSize(zcu) != .c) { return sema.failWithExpectedOptionalType(block, src, operand_ty); } // TODO https://github.com/ziglang/zig/issues/6597 @@ -13972,7 +13972,7 @@ fn zirHasField(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const has_field = hf: { switch (ip.indexToKey(ty.toIntern())) { .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .Slice => { + .slice => { if (field_name.eqlSlice("ptr", ip)) break :hf true; if (field_name.eqlSlice("len", ip)) break :hf true; break :hf false; @@ -14797,7 +14797,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const slice_ty = try pt.ptrTypeSema(.{ .child = resolved_elem_ty.toIntern(), .flags = .{ - .size = .Slice, + .size = .slice, .address_space = ptr_as, }, }); @@ -14925,7 +14925,7 @@ fn getArrayCatInfo(sema: *Sema, block: *Block, src: LazySrcLoc, operand: Air.Ins .pointer => { const ptr_info = operand_ty.ptrInfo(zcu); switch (ptr_info.flags.size) { - .Slice => { + .slice => { const val = try sema.resolveConstDefinedValue(block, src, operand, .{ .simple = .slice_cat_operand }); return Type.ArrayInfo{ .elem_type = Type.fromInterned(ptr_info.child), @@ -14936,12 +14936,12 @@ fn getArrayCatInfo(sema: *Sema, block: *Block, src: LazySrcLoc, operand: Air.Ins .len = try val.sliceLen(pt), }; }, - .One => { + .one => { if (Type.fromInterned(ptr_info.child).zigTypeTag(zcu) == .array) { return Type.fromInterned(ptr_info.child).arrayInfo(zcu); } }, - .C, .Many => {}, + .c, .many => {}, } }, .@"struct" => { @@ -16610,7 +16610,7 @@ fn analyzeArithmetic( if (lhs_zig_ty_tag == .pointer) { if (rhs_zig_ty_tag == .pointer) { - if (lhs_ty.ptrSize(zcu) != .Slice and rhs_ty.ptrSize(zcu) != .Slice) { + if (lhs_ty.ptrSize(zcu) != .slice and rhs_ty.ptrSize(zcu) != .slice) { if (zir_tag != .sub) { return sema.failWithInvalidPtrArithmetic(block, src, "pointer-pointer", "subtraction"); } @@ -16662,8 +16662,8 @@ fn analyzeArithmetic( } } else { switch (lhs_ty.ptrSize(zcu)) { - .One, .Slice => {}, - .Many, .C => { + .one, .slice => {}, + .many, .c => { const air_tag: Air.Inst.Tag = switch (zir_tag) { .add => .ptr_add, .sub => .ptr_sub, @@ -17160,7 +17160,7 @@ fn analyzePtrArithmetic( const opt_off_val = try sema.resolveDefinedValue(block, offset_src, offset); const ptr_ty = sema.typeOf(ptr); const ptr_info = ptr_ty.ptrInfo(zcu); - assert(ptr_info.flags.size == .Many or ptr_info.flags.size == .C); + assert(ptr_info.flags.size == .many or ptr_info.flags.size == .c); const new_ptr_ty = t: { // Calculate the new pointer alignment. @@ -18092,7 +18092,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const slice_ty = (try pt.ptrTypeSema(.{ .child = param_info_ty.toIntern(), .flags = .{ - .size = .Slice, + .size = .slice, .is_const = true, }, })).toIntern(); @@ -18335,7 +18335,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const slice_errors_ty = try pt.ptrTypeSema(.{ .child = error_field_ty.toIntern(), .flags = .{ - .size = .Slice, + .size = .slice, .is_const = true, }, }); @@ -18462,7 +18462,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const slice_ty = (try pt.ptrTypeSema(.{ .child = enum_field_ty.toIntern(), .flags = .{ - .size = .Slice, + .size = .slice, .is_const = true, }, })).toIntern(); @@ -18575,7 +18575,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const slice_ty = (try pt.ptrTypeSema(.{ .child = union_field_ty.toIntern(), .flags = .{ - .size = .Slice, + .size = .slice, .is_const = true, }, })).toIntern(); @@ -18770,7 +18770,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const slice_ty = (try pt.ptrTypeSema(.{ .child = struct_field_ty.toIntern(), .flags = .{ - .size = .Slice, + .size = .slice, .is_const = true, }, })).toIntern(); @@ -18879,7 +18879,7 @@ fn typeInfoDecls( const slice_ty = (try pt.ptrTypeSema(.{ .child = declaration_ty.toIntern(), .flags = .{ - .size = .Slice, + .size = .slice, .is_const = true, }, })).toIntern(); @@ -20138,12 +20138,12 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air } if (elem_ty.zigTypeTag(zcu) == .@"fn") { - if (inst_data.size != .One) { + if (inst_data.size != .one) { return sema.fail(block, elem_ty_src, "function pointers must be single pointers", .{}); } - } else if (inst_data.size == .Many and elem_ty.zigTypeTag(zcu) == .@"opaque") { + } else if (inst_data.size == .many and elem_ty.zigTypeTag(zcu) == .@"opaque") { return sema.fail(block, elem_ty_src, "unknown-length pointer to opaque not allowed", .{}); - } else if (inst_data.size == .C) { + } else if (inst_data.size == .c) { if (!try sema.validateExternType(elem_ty, .other)) { const msg = msg: { const msg = try sema.errMsg(elem_ty_src, "C pointers cannot point to non-C-ABI-compatible type '{}'", .{elem_ty.fmt(pt)}); @@ -21645,7 +21645,7 @@ fn zirReify( const actual_sentinel: InternPool.Index = s: { if (!sentinel_val.isNull(zcu)) { - if (ptr_size == .One or ptr_size == .C) { + if (ptr_size == .one or ptr_size == .c) { return sema.fail(block, src, "sentinels are only allowed on slices and unknown-length pointers", .{}); } const sentinel_ptr_val = sentinel_val.optionalValue(zcu).?; @@ -21660,12 +21660,12 @@ fn zirReify( if (elem_ty.zigTypeTag(zcu) == .noreturn) { return sema.fail(block, src, "pointer to noreturn not allowed", .{}); } else if (elem_ty.zigTypeTag(zcu) == .@"fn") { - if (ptr_size != .One) { + if (ptr_size != .one) { return sema.fail(block, src, "function pointers must be single pointers", .{}); } - } else if (ptr_size == .Many and elem_ty.zigTypeTag(zcu) == .@"opaque") { + } else if (ptr_size == .many and elem_ty.zigTypeTag(zcu) == .@"opaque") { return sema.fail(block, src, "unknown-length pointer to opaque not allowed", .{}); - } else if (ptr_size == .C) { + } else if (ptr_size == .c) { if (!try sema.validateExternType(elem_ty, .other)) { const msg = msg: { const msg = try sema.errMsg(src, "C pointers cannot point to non-C-ABI-compatible type '{}'", .{elem_ty.fmt(pt)}); @@ -23321,21 +23321,21 @@ fn ptrCastFull( try Type.fromInterned(src_info.child).resolveLayout(pt); try Type.fromInterned(dest_info.child).resolveLayout(pt); - const src_slice_like = src_info.flags.size == .Slice or - (src_info.flags.size == .One and Type.fromInterned(src_info.child).zigTypeTag(zcu) == .array); + const src_slice_like = src_info.flags.size == .slice or + (src_info.flags.size == .one and Type.fromInterned(src_info.child).zigTypeTag(zcu) == .array); - const dest_slice_like = dest_info.flags.size == .Slice or - (dest_info.flags.size == .One and Type.fromInterned(dest_info.child).zigTypeTag(zcu) == .array); + const dest_slice_like = dest_info.flags.size == .slice or + (dest_info.flags.size == .one and Type.fromInterned(dest_info.child).zigTypeTag(zcu) == .array); - if (dest_info.flags.size == .Slice and !src_slice_like) { + if (dest_info.flags.size == .slice and !src_slice_like) { return sema.fail(block, src, "illegal pointer cast to slice", .{}); } - if (dest_info.flags.size == .Slice) { + if (dest_info.flags.size == .slice) { const src_elem_size = switch (src_info.flags.size) { - .Slice => Type.fromInterned(src_info.child).abiSize(zcu), + .slice => Type.fromInterned(src_info.child).abiSize(zcu), // pointer to array - .One => Type.fromInterned(src_info.child).childType(zcu).abiSize(zcu), + .one => Type.fromInterned(src_info.child).childType(zcu).abiSize(zcu), else => unreachable, }; const dest_elem_size = Type.fromInterned(dest_info.child).abiSize(zcu); @@ -23350,17 +23350,17 @@ fn ptrCastFull( check_size: { if (src_info.flags.size == dest_info.flags.size) break :check_size; if (src_slice_like and dest_slice_like) break :check_size; - if (src_info.flags.size == .C) break :check_size; - if (dest_info.flags.size == .C) break :check_size; + if (src_info.flags.size == .c) break :check_size; + if (dest_info.flags.size == .c) break :check_size; return sema.failWithOwnedErrorMsg(block, msg: { const msg = try sema.errMsg(src, "cannot implicitly convert {s} to {s}", .{ pointerSizeString(src_info.flags.size), pointerSizeString(dest_info.flags.size), }); errdefer msg.destroy(sema.gpa); - if (dest_info.flags.size == .Many and - (src_info.flags.size == .Slice or - (src_info.flags.size == .One and Type.fromInterned(src_info.child).zigTypeTag(zcu) == .array))) + if (dest_info.flags.size == .many and + (src_info.flags.size == .slice or + (src_info.flags.size == .one and Type.fromInterned(src_info.child).zigTypeTag(zcu) == .array))) { try sema.errNote(src, msg, "use 'ptr' field to convert slice to many pointer", .{}); } else { @@ -23371,7 +23371,7 @@ fn ptrCastFull( } check_child: { - const src_child = if (dest_info.flags.size == .Slice and src_info.flags.size == .One) blk: { + const src_child = if (dest_info.flags.size == .slice and src_info.flags.size == .one) blk: { // *[n]T -> []T break :blk Type.fromInterned(src_info.child).childType(zcu); } else Type.fromInterned(src_info.child); @@ -23402,12 +23402,12 @@ fn ptrCastFull( check_sent: { if (dest_info.sentinel == .none) break :check_sent; - if (src_info.flags.size == .C) break :check_sent; + if (src_info.flags.size == .c) break :check_sent; if (src_info.sentinel != .none) { const coerced_sent = try zcu.intern_pool.getCoerced(sema.gpa, pt.tid, src_info.sentinel, dest_info.child); if (dest_info.sentinel == coerced_sent) break :check_sent; } - if (src_slice_like and src_info.flags.size == .One and dest_info.flags.size == .Slice) { + if (src_slice_like and src_info.flags.size == .one and dest_info.flags.size == .slice) { // [*]nT -> []T const arr_ty = Type.fromInterned(src_info.child); if (arr_ty.sentinel(zcu)) |src_sentinel| { @@ -23555,7 +23555,7 @@ fn ptrCastFull( } } - const ptr = if (src_info.flags.size == .Slice and dest_info.flags.size != .Slice) ptr: { + const ptr = if (src_info.flags.size == .slice and dest_info.flags.size != .slice) ptr: { if (operand_ty.zigTypeTag(zcu) == .optional) { break :ptr try sema.analyzeOptionalSlicePtr(block, operand_src, operand, operand_ty); } else { @@ -23563,10 +23563,10 @@ fn ptrCastFull( } } else operand; - const dest_ptr_ty = if (dest_info.flags.size == .Slice and src_info.flags.size != .Slice) blk: { + const dest_ptr_ty = if (dest_info.flags.size == .slice and src_info.flags.size != .slice) blk: { // Only convert to a many-pointer at first var info = dest_info; - info.flags.size = .Many; + info.flags.size = .many; const ty = try pt.ptrTypeSema(info); if (dest_ty.zigTypeTag(zcu) == .optional) { break :blk try pt.optionalType(ty.toIntern()); @@ -23594,7 +23594,7 @@ fn ptrCastFull( } } } - if (dest_info.flags.size == .Slice and src_info.flags.size != .Slice) { + if (dest_info.flags.size == .slice and src_info.flags.size != .slice) { if (ptr_val.isUndef(zcu)) return pt.undefRef(dest_ty); const arr_len = try pt.intValue(Type.usize, Type.fromInterned(src_info.child).arrayLen(zcu)); const ptr_val_key = zcu.intern_pool.indexToKey(ptr_val.toIntern()).ptr; @@ -23622,7 +23622,7 @@ fn ptrCastFull( { const ptr_int = try block.addUnOp(.int_from_ptr, ptr); const is_non_zero = try block.addBinOp(.cmp_neq, ptr_int, .zero_usize); - const ok = if (src_info.flags.size == .Slice and dest_info.flags.size == .Slice) ok: { + const ok = if (src_info.flags.size == .slice and dest_info.flags.size == .slice) ok: { const len = try sema.analyzeSliceLen(block, operand_src, ptr); const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize); break :ok try block.addBinOp(.bool_or, len_zero, is_non_zero); @@ -23639,7 +23639,7 @@ fn ptrCastFull( const ptr_int = try block.addUnOp(.int_from_ptr, ptr); const remainder = try block.addBinOp(.bit_and, ptr_int, align_minus_1); const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); - const ok = if (src_info.flags.size == .Slice and dest_info.flags.size == .Slice) ok: { + const ok = if (src_info.flags.size == .slice and dest_info.flags.size == .slice) ok: { const len = try sema.analyzeSliceLen(block, operand_src, ptr); const len_zero = try block.addBinOp(.cmp_eq, len, .zero_usize); break :ok try block.addBinOp(.bool_or, len_zero, is_aligned); @@ -23672,7 +23672,7 @@ fn ptrCastFull( break :ptr try block.addBitCast(dest_ptr_ty, ptr); }; - if (dest_info.flags.size == .Slice and src_info.flags.size != .Slice) { + if (dest_info.flags.size == .slice and src_info.flags.size != .slice) { // We have to construct a slice using the operand's child's array length // Note that we know from the check at the start of the function that operand_ty is slice-like const arr_len = Air.internedToRef((try pt.intValue(Type.usize, Type.fromInterned(src_info.child).arrayLen(zcu))).toIntern()); @@ -24066,8 +24066,8 @@ fn checkInvalidPtrIntArithmetic( const zcu = pt.zcu; switch (try ty.zigTypeTagOrPoison(zcu)) { .pointer => switch (ty.ptrSize(zcu)) { - .One, .Slice => return, - .Many, .C => return sema.failWithInvalidPtrArithmetic(block, src, "pointer-integer", "addition and subtraction"), + .one, .slice => return, + .many, .c => return sema.failWithInvalidPtrArithmetic(block, src, "pointer-integer", "addition and subtraction"), }, else => return, } @@ -25384,7 +25384,7 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Ins const parent_ptr_ty = try sema.resolveDestType(block, inst_src, extra.parent_ptr_type, .remove_eu, "@fieldParentPtr"); try sema.checkPtrType(block, inst_src, parent_ptr_ty, true); const parent_ptr_info = parent_ptr_ty.ptrInfo(zcu); - if (parent_ptr_info.flags.size != .One) { + if (parent_ptr_info.flags.size != .one) { return sema.fail(block, inst_src, "expected single pointer type, found '{}'", .{parent_ptr_ty.fmt(pt)}); } const parent_ty = Type.fromInterned(parent_ptr_info.child); @@ -25862,7 +25862,7 @@ fn upgradeToArrayPtr(sema: *Sema, block: *Block, ptr: Air.Inst.Ref, len: u64) !A const zcu = pt.zcu; const ptr_ty = sema.typeOf(ptr); const info = ptr_ty.ptrInfo(zcu); - if (info.flags.size == .One) { + if (info.flags.size == .one) { // Already an array pointer. return ptr; } @@ -25880,7 +25880,7 @@ fn upgradeToArrayPtr(sema: *Sema, block: *Block, ptr: Air.Inst.Ref, len: u64) !A .address_space = info.flags.address_space, }, }); - const non_slice_ptr = if (info.flags.size == .Slice) + const non_slice_ptr = if (info.flags.size == .slice) try block.addTyOp(.slice_ptr, ptr_ty.slicePtrFieldType(zcu), ptr) else ptr; @@ -26069,22 +26069,22 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void const new_dest_ptr_ty = sema.typeOf(new_dest_ptr); const raw_dest_ptr = if (new_dest_ptr_ty.isSlice(zcu)) try sema.analyzeSlicePtr(block, dest_src, new_dest_ptr, new_dest_ptr_ty) - else if (new_dest_ptr_ty.ptrSize(zcu) == .One) ptr: { + else if (new_dest_ptr_ty.ptrSize(zcu) == .one) ptr: { var dest_manyptr_ty_key = zcu.intern_pool.indexToKey(new_dest_ptr_ty.toIntern()).ptr_type; - assert(dest_manyptr_ty_key.flags.size == .One); + assert(dest_manyptr_ty_key.flags.size == .one); dest_manyptr_ty_key.child = dest_elem_ty.toIntern(); - dest_manyptr_ty_key.flags.size = .Many; + dest_manyptr_ty_key.flags.size = .many; break :ptr try sema.coerceCompatiblePtrs(block, try pt.ptrTypeSema(dest_manyptr_ty_key), new_dest_ptr, dest_src); } else new_dest_ptr; const new_src_ptr_ty = sema.typeOf(new_src_ptr); const raw_src_ptr = if (new_src_ptr_ty.isSlice(zcu)) try sema.analyzeSlicePtr(block, src_src, new_src_ptr, new_src_ptr_ty) - else if (new_src_ptr_ty.ptrSize(zcu) == .One) ptr: { + else if (new_src_ptr_ty.ptrSize(zcu) == .one) ptr: { var src_manyptr_ty_key = zcu.intern_pool.indexToKey(new_src_ptr_ty.toIntern()).ptr_type; - assert(src_manyptr_ty_key.flags.size == .One); + assert(src_manyptr_ty_key.flags.size == .one); src_manyptr_ty_key.child = src_elem_ty.toIntern(); - src_manyptr_ty_key.flags.size = .Many; + src_manyptr_ty_key.flags.size = .many; break :ptr try sema.coerceCompatiblePtrs(block, try pt.ptrTypeSema(src_manyptr_ty_key), new_src_ptr, src_src); } else new_src_ptr; @@ -26129,13 +26129,13 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void const dest_elem_ty: Type = dest_elem_ty: { const ptr_info = dest_ptr_ty.ptrInfo(zcu); switch (ptr_info.flags.size) { - .Slice => break :dest_elem_ty Type.fromInterned(ptr_info.child), - .One => { + .slice => break :dest_elem_ty Type.fromInterned(ptr_info.child), + .one => { if (Type.fromInterned(ptr_info.child).zigTypeTag(zcu) == .array) { break :dest_elem_ty Type.fromInterned(ptr_info.child).childType(zcu); } }, - .Many, .C => {}, + .many, .c => {}, } return sema.failWithOwnedErrorMsg(block, msg: { const msg = try sema.errMsg(src, "unknown @memset length", .{}); @@ -26172,7 +26172,7 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void } })); const array_ptr_ty = ty: { var info = dest_ptr_ty.ptrInfo(zcu); - info.flags.size = .One; + info.flags.size = .one; info.child = array_ty.toIntern(); break :ty try pt.ptrType(info); }; @@ -26754,15 +26754,15 @@ fn zirInplaceArithResultTy(sema: *Sema, extended: Zir.Inst.Extended.InstData) Co .add_eq => ty: { const ptr_size = lhs_ty.ptrSizeOrNull(zcu) orelse break :ty lhs_ty; switch (ptr_size) { - .One, .Slice => break :ty lhs_ty, // invalid, let it error - .Many, .C => break :ty .usize, // `[*]T + usize` + .one, .slice => break :ty lhs_ty, // invalid, let it error + .many, .c => break :ty .usize, // `[*]T + usize` } }, .sub_eq => ty: { const ptr_size = lhs_ty.ptrSizeOrNull(zcu) orelse break :ty lhs_ty; switch (ptr_size) { - .One, .Slice => break :ty lhs_ty, // invalid, let it error - .Many, .C => break :ty .generic_poison, // could be `[*]T - [*]T` or `[*]T - usize` + .one, .slice => break :ty lhs_ty, // invalid, let it error + .many, .c => break :ty .generic_poison, // could be `[*]T - [*]T` or `[*]T - usize` } }, }; @@ -27556,7 +27556,7 @@ fn fieldVal( .child = Type.fromInterned(ptr_info.child).childType(zcu).toIntern(), .sentinel = if (inner_ty.sentinel(zcu)) |s| s.toIntern() else .none, .flags = .{ - .size = .Many, + .size = .many, .alignment = ptr_info.flags.alignment, .is_const = ptr_info.flags.is_const, .is_volatile = ptr_info.flags.is_volatile, @@ -27578,7 +27578,7 @@ fn fieldVal( }, .pointer => { const ptr_info = inner_ty.ptrInfo(zcu); - if (ptr_info.flags.size == .Slice) { + if (ptr_info.flags.size == .slice) { if (field_name.eqlSlice("ptr", ip)) { const slice = if (is_pointer_to) try sema.analyzeLoad(block, src, object, object_src) @@ -27740,7 +27740,7 @@ fn fieldPtr( .child = Type.fromInterned(ptr_info.child).childType(zcu).toIntern(), .sentinel = if (object_ty.sentinel(zcu)) |s| s.toIntern() else .none, .flags = .{ - .size = .Many, + .size = .many, .alignment = ptr_info.flags.alignment, .is_const = ptr_info.flags.is_const, .is_volatile = ptr_info.flags.is_volatile, @@ -27953,13 +27953,13 @@ fn fieldCallBind( const ip = &zcu.intern_pool; const raw_ptr_src = src; // TODO better source location const raw_ptr_ty = sema.typeOf(raw_ptr); - const inner_ty = if (raw_ptr_ty.zigTypeTag(zcu) == .pointer and (raw_ptr_ty.ptrSize(zcu) == .One or raw_ptr_ty.ptrSize(zcu) == .C)) + const inner_ty = if (raw_ptr_ty.zigTypeTag(zcu) == .pointer and (raw_ptr_ty.ptrSize(zcu) == .one or raw_ptr_ty.ptrSize(zcu) == .c)) raw_ptr_ty.childType(zcu) else return sema.fail(block, raw_ptr_src, "expected single pointer, found '{}'", .{raw_ptr_ty.fmt(pt)}); // Optionally dereference a second pointer to get the concrete type. - const is_double_ptr = inner_ty.zigTypeTag(zcu) == .pointer and inner_ty.ptrSize(zcu) == .One; + const is_double_ptr = inner_ty.zigTypeTag(zcu) == .pointer and inner_ty.ptrSize(zcu) == .one; const concrete_ty = if (is_double_ptr) inner_ty.childType(zcu) else inner_ty; const ptr_ty = if (is_double_ptr) inner_ty else raw_ptr_ty; const object_ptr = if (is_double_ptr) @@ -28025,8 +28025,8 @@ fn fieldCallBind( const first_param_type = Type.fromInterned(func_type.param_types.get(ip)[0]); if (first_param_type.isGenericPoison() or (first_param_type.zigTypeTag(zcu) == .pointer and - (first_param_type.ptrSize(zcu) == .One or - first_param_type.ptrSize(zcu) == .C) and + (first_param_type.ptrSize(zcu) == .one or + first_param_type.ptrSize(zcu) == .c) and first_param_type.childType(zcu).eql(concrete_ty, zcu))) { // Note that if the param type is generic poison, we know that it must @@ -28053,7 +28053,7 @@ fn fieldCallBind( .arg0_inst = deref, } }; } else if (child.zigTypeTag(zcu) == .pointer and - child.ptrSize(zcu) == .One and + child.ptrSize(zcu) == .one and child.childType(zcu).eql(concrete_ty, zcu)) { return .{ .method = .{ @@ -28673,8 +28673,8 @@ fn elemPtrOneLayerOnly( try checkIndexable(sema, block, src, indexable_ty); switch (indexable_ty.ptrSize(zcu)) { - .Slice => return sema.elemPtrSlice(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety), - .Many, .C => { + .slice => return sema.elemPtrSlice(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety), + .many, .c => { const maybe_ptr_val = try sema.resolveDefinedValue(block, indexable_src, indexable); const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index); ct: { @@ -28688,7 +28688,7 @@ fn elemPtrOneLayerOnly( return block.addPtrElemPtr(indexable, elem_index, result_ty); }, - .One => { + .one => { const child_ty = indexable_ty.childType(zcu); const elem_ptr = switch (child_ty.zigTypeTag(zcu)) { .array, .vector => try sema.elemPtrArray(block, src, indexable_src, indexable, elem_index_src, elem_index, init, oob_safety), @@ -28728,8 +28728,8 @@ fn elemVal( switch (indexable_ty.zigTypeTag(zcu)) { .pointer => switch (indexable_ty.ptrSize(zcu)) { - .Slice => return sema.elemValSlice(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety), - .Many, .C => { + .slice => return sema.elemValSlice(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety), + .many, .c => { const maybe_indexable_val = try sema.resolveDefinedValue(block, indexable_src, indexable); const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index); @@ -28748,7 +28748,7 @@ fn elemVal( return block.addBinOp(.ptr_elem_val, indexable, elem_index); }, - .One => { + .one => { arr_sent: { const inner_ty = indexable_ty.childType(zcu); if (inner_ty.zigTypeTag(zcu) != .array) break :arr_sent; @@ -29293,7 +29293,7 @@ fn coerceExtra( // *T to *[1]T single_item: { - if (dest_info.flags.size != .One) break :single_item; + if (dest_info.flags.size != .one) break :single_item; if (!inst_ty.isSinglePointer(zcu)) break :single_item; if (!sema.checkPtrAttributes(dest_ty, inst_ty, &in_memory_result)) break :pointer; const ptr_elem_ty = inst_ty.childType(zcu); @@ -29312,7 +29312,7 @@ fn coerceExtra( // Coercions where the source is a single pointer to an array. src_array_ptr: { if (!inst_ty.isSinglePointer(zcu)) break :src_array_ptr; - if (dest_info.flags.size == .One) break :src_array_ptr; // `*[n]T` -> `*T` isn't valid + if (dest_info.flags.size == .one) break :src_array_ptr; // `*[n]T` -> `*T` isn't valid if (!sema.checkPtrAttributes(dest_ty, inst_ty, &in_memory_result)) break :pointer; const array_ty = inst_ty.childType(zcu); if (array_ty.zigTypeTag(zcu) != .array) break :src_array_ptr; @@ -29356,25 +29356,25 @@ fn coerceExtra( } switch (dest_info.flags.size) { - .Slice => { + .slice => { // *[N]T to []T return sema.coerceArrayPtrToSlice(block, dest_ty, inst, inst_src); }, - .C => { + .c => { // *[N]T to [*c]T return sema.coerceCompatiblePtrs(block, dest_ty, inst, inst_src); }, - .Many => { + .many => { // *[N]T to [*]T return sema.coerceCompatiblePtrs(block, dest_ty, inst, inst_src); }, - .One => unreachable, // early exit at top of block + .one => unreachable, // early exit at top of block } } // coercion from C pointer if (inst_ty.isCPtr(zcu)) src_c_ptr: { - if (dest_info.flags.size == .Slice) break :src_c_ptr; + if (dest_info.flags.size == .slice) break :src_c_ptr; if (!sema.checkPtrAttributes(dest_ty, inst_ty, &in_memory_result)) break :src_c_ptr; // In this case we must add a safety check because the C pointer // could be null. @@ -29413,7 +29413,7 @@ fn coerceExtra( switch (dest_info.flags.size) { // coercion to C pointer - .C => switch (inst_ty.zigTypeTag(zcu)) { + .c => switch (inst_ty.zigTypeTag(zcu)) { .null => return Air.internedToRef(try pt.intern(.{ .ptr = .{ .ty = dest_ty.toIntern(), .base_addr = .int, @@ -29457,7 +29457,7 @@ fn coerceExtra( .ok => {}, else => break :p, } - if (inst_info.flags.size == .Slice) { + if (inst_info.flags.size == .slice) { assert(dest_info.sentinel == .none); if (inst_info.sentinel == .none or inst_info.sentinel != (try pt.intValue(Type.fromInterned(inst_info.child), 0)).toIntern()) @@ -29470,8 +29470,8 @@ fn coerceExtra( }, else => {}, }, - .One => {}, - .Slice => to_slice: { + .one => {}, + .slice => to_slice: { if (inst_ty.zigTypeTag(zcu) == .array) { return sema.fail( block, @@ -29512,7 +29512,7 @@ fn coerceExtra( } return sema.coerceTupleToSlicePtrs(block, dest_ty, dest_ty_src, inst, inst_src); }, - .Many => p: { + .many => p: { if (!inst_ty.isSlice(zcu)) break :p; if (!sema.checkPtrAttributes(dest_ty, inst_ty, &in_memory_result)) break :p; const inst_info = inst_ty.ptrInfo(zcu); @@ -30224,10 +30224,10 @@ const InMemoryCoercionResult = union(enum) { fn pointerSizeString(size: std.builtin.Type.Pointer.Size) []const u8 { return switch (size) { - .One => "single pointer", - .Many => "many pointer", - .C => "C pointer", - .Slice => "slice", + .one => "single pointer", + .many => "many pointer", + .c => "C pointer", + .slice => "slice", }; } @@ -30775,7 +30775,7 @@ fn coerceInMemoryAllowedPtrs( const src_info = src_ptr_ty.ptrInfo(zcu); const ok_ptr_size = src_info.flags.size == dest_info.flags.size or - src_info.flags.size == .C or dest_info.flags.size == .C; + src_info.flags.size == .c or dest_info.flags.size == .c; if (!ok_ptr_size) { return InMemoryCoercionResult{ .ptr_size = .{ .actual = src_info.flags.size, @@ -30874,7 +30874,7 @@ fn coerceInMemoryAllowedPtrs( if (ss != .none and ds != .none) { if (ds == try zcu.intern_pool.getCoerced(sema.gpa, pt.tid, ss, dest_info.child)) break :ok true; } - if (src_info.flags.size == .C) break :ok true; + if (src_info.flags.size == .c) break :ok true; if (!dest_is_mut and dest_info.sentinel == .none) break :ok true; break :ok false; }; @@ -31392,7 +31392,7 @@ fn checkPtrAttributes(sema: *Sema, dest_ty: Type, inst_ty: Type, in_memory_resul const dest_info = dest_ty.ptrInfo(zcu); const inst_info = inst_ty.ptrInfo(zcu); const len0 = (Type.fromInterned(inst_info.child).zigTypeTag(zcu) == .array and (Type.fromInterned(inst_info.child).arrayLenIncludingSentinel(zcu) == 0 or - (Type.fromInterned(inst_info.child).arrayLen(zcu) == 0 and dest_info.sentinel == .none and dest_info.flags.size != .C and dest_info.flags.size != .Many))) or + (Type.fromInterned(inst_info.child).arrayLen(zcu) == 0 and dest_info.sentinel == .none and dest_info.flags.size != .c and dest_info.flags.size != .many))) or (Type.fromInterned(inst_info.child).isTuple(zcu) and Type.fromInterned(inst_info.child).structFieldCount(zcu) == 0); const ok_const = (!inst_info.flags.is_const or dest_info.flags.is_const) or len0; @@ -32631,7 +32631,7 @@ fn analyzeSlice( elem_ty = ptr_ptr_child_ty.childType(zcu); }, .pointer => switch (ptr_ptr_child_ty.ptrSize(zcu)) { - .One => { + .one => { const double_child_ty = ptr_ptr_child_ty.childType(zcu); ptr_or_slice = try sema.analyzeLoad(block, src, ptr_ptr, ptr_src); if (double_child_ty.zigTypeTag(zcu) == .array) { @@ -32721,14 +32721,14 @@ fn analyzeSlice( elem_ty = double_child_ty; } }, - .Many, .C => { + .many, .c => { ptr_sentinel = ptr_ptr_child_ty.sentinel(zcu); ptr_or_slice = try sema.analyzeLoad(block, src, ptr_ptr, ptr_src); slice_ty = ptr_ptr_child_ty; array_ty = ptr_ptr_child_ty; elem_ty = ptr_ptr_child_ty.childType(zcu); - if (ptr_ptr_child_ty.ptrSize(zcu) == .C) { + if (ptr_ptr_child_ty.ptrSize(zcu) == .c) { if (try sema.resolveDefinedValue(block, ptr_src, ptr_or_slice)) |ptr_val| { if (ptr_val.isNull(zcu)) { return sema.fail(block, src, "slice of null pointer", .{}); @@ -32736,7 +32736,7 @@ fn analyzeSlice( } } }, - .Slice => { + .slice => { ptr_sentinel = ptr_ptr_child_ty.sentinel(zcu); ptr_or_slice = try sema.analyzeLoad(block, src, ptr_ptr, ptr_src); slice_ty = ptr_ptr_child_ty; @@ -32752,9 +32752,9 @@ fn analyzeSlice( else if (array_ty.zigTypeTag(zcu) == .array) ptr: { var manyptr_ty_key = zcu.intern_pool.indexToKey(slice_ty.toIntern()).ptr_type; assert(manyptr_ty_key.child == array_ty.toIntern()); - assert(manyptr_ty_key.flags.size == .One); + assert(manyptr_ty_key.flags.size == .one); manyptr_ty_key.child = elem_ty.toIntern(); - manyptr_ty_key.flags.size = .Many; + manyptr_ty_key.flags.size = .many; break :ptr try sema.coerceCompatiblePtrs(block, try pt.ptrTypeSema(manyptr_ty_key), ptr_or_slice, ptr_src); } else ptr_or_slice; @@ -32967,7 +32967,7 @@ fn analyzeSlice( const opt_new_len_val = try sema.resolveDefinedValue(block, src, new_len); const new_ptr_ty_info = new_ptr_ty.ptrInfo(zcu); - const new_allowzero = new_ptr_ty_info.flags.is_allowzero and sema.typeOf(ptr).ptrSize(zcu) != .C; + const new_allowzero = new_ptr_ty_info.flags.is_allowzero and sema.typeOf(ptr).ptrSize(zcu) != .c; if (opt_new_len_val) |new_len_val| { const new_len_int = try new_len_val.toUnsignedIntSema(pt); @@ -33038,7 +33038,7 @@ fn analyzeSlice( .child = elem_ty.toIntern(), .sentinel = if (sentinel) |s| s.toIntern() else .none, .flags = .{ - .size = .Slice, + .size = .slice, .alignment = new_ptr_ty_info.flags.alignment, .is_const = new_ptr_ty_info.flags.is_const, .is_volatile = new_ptr_ty_info.flags.is_volatile, @@ -33739,7 +33739,7 @@ const PeerResolveStrategy = enum { .int => .fixed_int, .comptime_float => .comptime_float, .float => .fixed_float, - .pointer => if (ty.ptrInfo(zcu).flags.size == .C) .c_ptr else .ptr, + .pointer => if (ty.ptrInfo(zcu).flags.size == .c) .c_ptr else .ptr, .array => .array, .vector => .vector, .optional => .optional, @@ -34235,7 +34235,7 @@ fn resolvePeerTypesInner( var ptr_info = opt_ptr_info orelse { opt_ptr_info = peer_info; - opt_ptr_info.?.flags.size = .C; + opt_ptr_info.?.flags.size = .c; first_idx = i; continue; }; @@ -34323,9 +34323,9 @@ fn resolvePeerTypesInner( }; switch (peer_info.flags.size) { - .One, .Many => {}, - .Slice => opt_slice_idx = i, - .C => return .{ .conflict = .{ + .one, .many => {}, + .slice => opt_slice_idx = i, + .c => return .{ .conflict = .{ .peer_idx_a = strat_reason, .peer_idx_b = i, } }, @@ -34370,21 +34370,21 @@ fn resolvePeerTypesInner( ptr_info.flags.is_allowzero = ptr_info.flags.is_allowzero or peer_info.flags.is_allowzero; const peer_sentinel: InternPool.Index = switch (peer_info.flags.size) { - .One => switch (ip.indexToKey(peer_info.child)) { + .one => switch (ip.indexToKey(peer_info.child)) { .array_type => |array_type| array_type.sentinel, else => .none, }, - .Many, .Slice => peer_info.sentinel, - .C => unreachable, + .many, .slice => peer_info.sentinel, + .c => unreachable, }; const cur_sentinel: InternPool.Index = switch (ptr_info.flags.size) { - .One => switch (ip.indexToKey(ptr_info.child)) { + .one => switch (ip.indexToKey(ptr_info.child)) { .array_type => |array_type| array_type.sentinel, else => .none, }, - .Many, .Slice => ptr_info.sentinel, - .C => unreachable, + .many, .slice => ptr_info.sentinel, + .c => unreachable, }; // We abstract array handling slightly so that tuple pointers can work like array pointers @@ -34395,8 +34395,8 @@ fn resolvePeerTypesInner( // single-pointer array sentinel). good: { switch (peer_info.flags.size) { - .One => switch (ptr_info.flags.size) { - .One => { + .one => switch (ptr_info.flags.size) { + .one => { if (try sema.resolvePairInMemoryCoercible(block, src, Type.fromInterned(ptr_info.child), Type.fromInterned(peer_info.child))) |pointee| { ptr_info.child = pointee.toIntern(); break :good; @@ -34415,28 +34415,28 @@ fn resolvePeerTypesInner( break :good; } // *[a]T + *[b]T = []T - ptr_info.flags.size = .Slice; + ptr_info.flags.size = .slice; ptr_info.child = elem_ty.toIntern(); break :good; } if (peer_arr.elem_ty.toIntern() == .noreturn_type) { // *struct{} + *[a]T = []T - ptr_info.flags.size = .Slice; + ptr_info.flags.size = .slice; ptr_info.child = cur_arr.elem_ty.toIntern(); break :good; } if (cur_arr.elem_ty.toIntern() == .noreturn_type) { // *[a]T + *struct{} = []T - ptr_info.flags.size = .Slice; + ptr_info.flags.size = .slice; ptr_info.child = peer_arr.elem_ty.toIntern(); break :good; } return generic_err; }, - .Many => { + .many => { // Only works for *[n]T + [*]T -> [*]T const arr = peer_pointee_array orelse return generic_err; if (try sema.resolvePairInMemoryCoercible(block, src, Type.fromInterned(ptr_info.child), arr.elem_ty)) |pointee| { @@ -34449,7 +34449,7 @@ fn resolvePeerTypesInner( } return generic_err; }, - .Slice => { + .slice => { // Only works for *[n]T + []T -> []T const arr = peer_pointee_array orelse return generic_err; if (try sema.resolvePairInMemoryCoercible(block, src, Type.fromInterned(ptr_info.child), arr.elem_ty)) |pointee| { @@ -34462,33 +34462,33 @@ fn resolvePeerTypesInner( } return generic_err; }, - .C => unreachable, + .c => unreachable, }, - .Many => switch (ptr_info.flags.size) { - .One => { + .many => switch (ptr_info.flags.size) { + .one => { // Only works for [*]T + *[n]T -> [*]T const arr = cur_pointee_array orelse return generic_err; if (try sema.resolvePairInMemoryCoercible(block, src, arr.elem_ty, Type.fromInterned(peer_info.child))) |pointee| { - ptr_info.flags.size = .Many; + ptr_info.flags.size = .many; ptr_info.child = pointee.toIntern(); break :good; } if (arr.elem_ty.toIntern() == .noreturn_type) { // [*]T + *struct{} -> [*]T - ptr_info.flags.size = .Many; + ptr_info.flags.size = .many; ptr_info.child = peer_info.child; break :good; } return generic_err; }, - .Many => { + .many => { if (try sema.resolvePairInMemoryCoercible(block, src, Type.fromInterned(ptr_info.child), Type.fromInterned(peer_info.child))) |pointee| { ptr_info.child = pointee.toIntern(); break :good; } return generic_err; }, - .Slice => { + .slice => { // Only works if no peers are actually slices if (opt_slice_idx) |slice_idx| { return .{ .conflict = .{ @@ -34498,54 +34498,54 @@ fn resolvePeerTypesInner( } // Okay, then works for [*]T + "[]T" -> [*]T if (try sema.resolvePairInMemoryCoercible(block, src, Type.fromInterned(ptr_info.child), Type.fromInterned(peer_info.child))) |pointee| { - ptr_info.flags.size = .Many; + ptr_info.flags.size = .many; ptr_info.child = pointee.toIntern(); break :good; } return generic_err; }, - .C => unreachable, + .c => unreachable, }, - .Slice => switch (ptr_info.flags.size) { - .One => { + .slice => switch (ptr_info.flags.size) { + .one => { // Only works for []T + *[n]T -> []T const arr = cur_pointee_array orelse return generic_err; if (try sema.resolvePairInMemoryCoercible(block, src, arr.elem_ty, Type.fromInterned(peer_info.child))) |pointee| { - ptr_info.flags.size = .Slice; + ptr_info.flags.size = .slice; ptr_info.child = pointee.toIntern(); break :good; } if (arr.elem_ty.toIntern() == .noreturn_type) { // []T + *struct{} -> []T - ptr_info.flags.size = .Slice; + ptr_info.flags.size = .slice; ptr_info.child = peer_info.child; break :good; } return generic_err; }, - .Many => { + .many => { // Impossible! (current peer is an actual slice) return generic_err; }, - .Slice => { + .slice => { if (try sema.resolvePairInMemoryCoercible(block, src, Type.fromInterned(ptr_info.child), Type.fromInterned(peer_info.child))) |pointee| { ptr_info.child = pointee.toIntern(); break :good; } return generic_err; }, - .C => unreachable, + .c => unreachable, }, - .C => unreachable, + .c => unreachable, } } const sentinel_ty = switch (ptr_info.flags.size) { - .One => switch (ip.indexToKey(ptr_info.child)) { + .one => switch (ip.indexToKey(ptr_info.child)) { .array_type => |array_type| array_type.child, else => ptr_info.child, }, - .Many, .Slice, .C => ptr_info.child, + .many, .slice, .c => ptr_info.child, }; sentinel: { @@ -34556,7 +34556,7 @@ fn resolvePeerTypesInner( const cur_sent_coerced = try ip.getCoerced(sema.gpa, pt.tid, cur_sentinel, sentinel_ty); if (peer_sent_coerced != cur_sent_coerced) break :no_sentinel; // Sentinels match - if (ptr_info.flags.size == .One) switch (ip.indexToKey(ptr_info.child)) { + if (ptr_info.flags.size == .one) switch (ip.indexToKey(ptr_info.child)) { .array_type => |array_type| ptr_info.child = (try pt.arrayType(.{ .len = array_type.len, .child = array_type.child, @@ -35416,8 +35416,8 @@ fn checkMemOperand(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) !void const zcu = pt.zcu; if (ty.zigTypeTag(zcu) == .pointer) { switch (ty.ptrSize(zcu)) { - .Slice, .Many, .C => return, - .One => { + .slice, .many, .c => return, + .one => { const elem_ty = ty.childType(zcu); if (elem_ty.zigTypeTag(zcu) == .array) return; // TODO https://github.com/ziglang/zig/issues/15479 @@ -37248,13 +37248,13 @@ fn typePtrOrOptionalPtrTy(sema: *Sema, ty: Type) !?Type { const zcu = pt.zcu; return switch (zcu.intern_pool.indexToKey(ty.toIntern())) { .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .One, .Many, .C => ty, - .Slice => null, + .one, .many, .c => ty, + .slice => null, }, .opt_type => |opt_child| switch (zcu.intern_pool.indexToKey(opt_child)) { .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .Slice, .C => null, - .Many, .One => { + .slice, .c => null, + .many, .one => { if (ptr_type.flags.is_allowzero) return null; // optionals of zero sized types behave like bools, not pointers @@ -38260,7 +38260,7 @@ fn maybeDerefSliceAsArray( }); const ptr_ty = try pt.ptrTypeSema(p: { var p = Type.fromInterned(slice.ty).ptrInfo(zcu); - p.flags.size = .One; + p.flags.size = .one; p.child = array_ty.toIntern(); p.sentinel = .none; break :p p; diff --git a/src/Type.zig b/src/Type.zig index 023b763bf922..350e3f10ec2b 100644 --- a/src/Type.zig +++ b/src/Type.zig @@ -192,16 +192,16 @@ pub fn print(ty: Type, writer: anytype, pt: Zcu.PerThread) @TypeOf(writer).Error const info = ty.ptrInfo(zcu); if (info.sentinel != .none) switch (info.flags.size) { - .One, .C => unreachable, - .Many => try writer.print("[*:{}]", .{Value.fromInterned(info.sentinel).fmtValue(pt)}), - .Slice => try writer.print("[:{}]", .{Value.fromInterned(info.sentinel).fmtValue(pt)}), + .one, .c => unreachable, + .many => try writer.print("[*:{}]", .{Value.fromInterned(info.sentinel).fmtValue(pt)}), + .slice => try writer.print("[:{}]", .{Value.fromInterned(info.sentinel).fmtValue(pt)}), } else switch (info.flags.size) { - .One => try writer.writeAll("*"), - .Many => try writer.writeAll("[*]"), - .C => try writer.writeAll("[*c]"), - .Slice => try writer.writeAll("[]"), + .one => try writer.writeAll("*"), + .many => try writer.writeAll("[*]"), + .c => try writer.writeAll("[*c]"), + .slice => try writer.writeAll("[]"), } - if (info.flags.is_allowzero and info.flags.size != .C) try writer.writeAll("allowzero "); + if (info.flags.is_allowzero and info.flags.size != .c) try writer.writeAll("allowzero "); if (info.flags.alignment != .none or info.packed_offset.host_size != 0 or info.flags.vector_index != .none) @@ -686,7 +686,7 @@ pub fn hasWellDefinedLayout(ty: Type, zcu: *const Zcu) bool { .array_type => |array_type| Type.fromInterned(array_type.child).hasWellDefinedLayout(zcu), .opt_type => ty.isPtrLikeOptional(zcu), - .ptr_type => |ptr_type| ptr_type.flags.size != .Slice, + .ptr_type => |ptr_type| ptr_type.flags.size != .slice, .simple_type => |t| switch (t) { .f16, @@ -1303,7 +1303,7 @@ pub fn abiSizeInner( return .{ .scalar = intAbiSize(int_type.bits, target, use_llvm) }; }, .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .Slice => return .{ .scalar = @divExact(target.ptrBitWidth(), 8) * 2 }, + .slice => return .{ .scalar = @divExact(target.ptrBitWidth(), 8) * 2 }, else => return .{ .scalar = @divExact(target.ptrBitWidth(), 8) }, }, .anyframe_type => return .{ .scalar = @divExact(target.ptrBitWidth(), 8) }, @@ -1741,7 +1741,7 @@ pub fn bitSizeInner( switch (ip.indexToKey(ty.toIntern())) { .int_type => |int_type| return int_type.bits, .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .Slice => return target.ptrBitWidth() * 2, + .slice => return target.ptrBitWidth() * 2, else => return target.ptrBitWidth(), }, .anyframe_type => return target.ptrBitWidth(), @@ -1903,7 +1903,7 @@ pub fn layoutIsResolved(ty: Type, zcu: *const Zcu) bool { pub fn isSinglePointer(ty: Type, zcu: *const Zcu) bool { return switch (zcu.intern_pool.indexToKey(ty.toIntern())) { - .ptr_type => |ptr_info| ptr_info.flags.size == .One, + .ptr_type => |ptr_info| ptr_info.flags.size == .one, else => false, }; } @@ -1923,7 +1923,7 @@ pub fn ptrSizeOrNull(ty: Type, zcu: *const Zcu) ?std.builtin.Type.Pointer.Size { pub fn isSlice(ty: Type, zcu: *const Zcu) bool { return switch (zcu.intern_pool.indexToKey(ty.toIntern())) { - .ptr_type => |ptr_type| ptr_type.flags.size == .Slice, + .ptr_type => |ptr_type| ptr_type.flags.size == .slice, else => false, }; } @@ -1960,7 +1960,7 @@ pub fn isAllowzeroPtr(ty: Type, zcu: *const Zcu) bool { pub fn isCPtr(ty: Type, zcu: *const Zcu) bool { return switch (zcu.intern_pool.indexToKey(ty.toIntern())) { - .ptr_type => |ptr_type| ptr_type.flags.size == .C, + .ptr_type => |ptr_type| ptr_type.flags.size == .c, else => false, }; } @@ -1968,13 +1968,13 @@ pub fn isCPtr(ty: Type, zcu: *const Zcu) bool { pub fn isPtrAtRuntime(ty: Type, zcu: *const Zcu) bool { return switch (zcu.intern_pool.indexToKey(ty.toIntern())) { .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .Slice => false, - .One, .Many, .C => true, + .slice => false, + .one, .many, .c => true, }, .opt_type => |child| switch (zcu.intern_pool.indexToKey(child)) { .ptr_type => |p| switch (p.flags.size) { - .Slice, .C => false, - .Many, .One => !p.flags.is_allowzero, + .slice, .c => false, + .many, .one => !p.flags.is_allowzero, }, else => false, }, @@ -1995,11 +1995,11 @@ pub fn ptrAllowsZero(ty: Type, zcu: *const Zcu) bool { pub fn optionalReprIsPayload(ty: Type, zcu: *const Zcu) bool { return switch (zcu.intern_pool.indexToKey(ty.toIntern())) { .opt_type => |child_type| child_type == .anyerror_type or switch (zcu.intern_pool.indexToKey(child_type)) { - .ptr_type => |ptr_type| ptr_type.flags.size != .C and !ptr_type.flags.is_allowzero, + .ptr_type => |ptr_type| ptr_type.flags.size != .c and !ptr_type.flags.is_allowzero, .error_set_type, .inferred_error_set_type => true, else => false, }, - .ptr_type => |ptr_type| ptr_type.flags.size == .C, + .ptr_type => |ptr_type| ptr_type.flags.size == .c, else => false, }; } @@ -2009,11 +2009,11 @@ pub fn optionalReprIsPayload(ty: Type, zcu: *const Zcu) bool { /// This function must be kept in sync with `Sema.typePtrOrOptionalPtrTy`. pub fn isPtrLikeOptional(ty: Type, zcu: *const Zcu) bool { return switch (zcu.intern_pool.indexToKey(ty.toIntern())) { - .ptr_type => |ptr_type| ptr_type.flags.size == .C, + .ptr_type => |ptr_type| ptr_type.flags.size == .c, .opt_type => |child| switch (zcu.intern_pool.indexToKey(child)) { .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .Slice, .C => false, - .Many, .One => !ptr_type.flags.is_allowzero, + .slice, .c => false, + .many, .one => !ptr_type.flags.is_allowzero, }, else => false, }, @@ -2044,8 +2044,8 @@ pub fn childTypeIp(ty: Type, ip: *const InternPool) Type { pub fn elemType2(ty: Type, zcu: *const Zcu) Type { return switch (zcu.intern_pool.indexToKey(ty.toIntern())) { .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .One => Type.fromInterned(ptr_type.child).shallowElemType(zcu), - .Many, .C, .Slice => Type.fromInterned(ptr_type.child), + .one => Type.fromInterned(ptr_type.child).shallowElemType(zcu), + .many, .c, .slice => Type.fromInterned(ptr_type.child), }, .anyframe_type => |child| { assert(child != .none); @@ -2079,7 +2079,7 @@ pub fn optionalChild(ty: Type, zcu: *const Zcu) Type { return switch (zcu.intern_pool.indexToKey(ty.toIntern())) { .opt_type => |child| Type.fromInterned(child), .ptr_type => |ptr_type| b: { - assert(ptr_type.flags.size == .C); + assert(ptr_type.flags.size == .c); break :b ty; }, else => unreachable, @@ -2991,8 +2991,8 @@ pub fn isIndexable(ty: Type, zcu: *const Zcu) bool { return switch (ty.zigTypeTag(zcu)) { .array, .vector => true, .pointer => switch (ty.ptrSize(zcu)) { - .Slice, .Many, .C => true, - .One => switch (ty.childType(zcu).zigTypeTag(zcu)) { + .slice, .many, .c => true, + .one => switch (ty.childType(zcu).zigTypeTag(zcu)) { .array, .vector => true, .@"struct" => ty.childType(zcu).isTuple(zcu), else => false, @@ -3007,9 +3007,9 @@ pub fn indexableHasLen(ty: Type, zcu: *const Zcu) bool { return switch (ty.zigTypeTag(zcu)) { .array, .vector => true, .pointer => switch (ty.ptrSize(zcu)) { - .Many, .C => false, - .Slice => true, - .One => switch (ty.childType(zcu).zigTypeTag(zcu)) { + .many, .c => false, + .slice => true, + .one => switch (ty.childType(zcu).zigTypeTag(zcu)) { .array, .vector => true, .@"struct" => ty.childType(zcu).isTuple(zcu), else => false, @@ -4049,7 +4049,7 @@ pub fn elemPtrType(ptr_ty: Type, offset: ?usize, pt: Zcu.PerThread) !Type { host_size: u16 = 0, alignment: Alignment = .none, vector_index: VI = .none, - } = if (parent_ty.isVector(zcu) and ptr_info.flags.size == .One) blk: { + } = if (parent_ty.isVector(zcu) and ptr_info.flags.size == .one) blk: { const elem_bits = elem_ty.bitSize(zcu); if (elem_bits == 0) break :blk .{}; const is_packed = elem_bits < 8 or !std.math.isPowerOfTwo(elem_bits); diff --git a/src/Value.zig b/src/Value.zig index 3081a28b9b88..5c0cc2de04a2 100644 --- a/src/Value.zig +++ b/src/Value.zig @@ -3724,7 +3724,7 @@ pub fn ptrOptPayload(parent_ptr: Value, pt: Zcu.PerThread) !Value { const parent_ptr_ty = parent_ptr.typeOf(zcu); const opt_ty = parent_ptr_ty.childType(zcu); - assert(parent_ptr_ty.ptrSize(zcu) == .One); + assert(parent_ptr_ty.ptrSize(zcu) == .one); assert(opt_ty.zigTypeTag(zcu) == .optional); const result_ty = try pt.ptrTypeSema(info: { @@ -3742,7 +3742,7 @@ pub fn ptrOptPayload(parent_ptr: Value, pt: Zcu.PerThread) !Value { return pt.getCoerced(parent_ptr, result_ty); } - const base_ptr = try parent_ptr.canonicalizeBasePtr(.One, opt_ty, pt); + const base_ptr = try parent_ptr.canonicalizeBasePtr(.one, opt_ty, pt); return Value.fromInterned(try pt.intern(.{ .ptr = .{ .ty = result_ty.toIntern(), .base_addr = .{ .opt_payload = base_ptr.toIntern() }, @@ -3758,7 +3758,7 @@ pub fn ptrEuPayload(parent_ptr: Value, pt: Zcu.PerThread) !Value { const parent_ptr_ty = parent_ptr.typeOf(zcu); const eu_ty = parent_ptr_ty.childType(zcu); - assert(parent_ptr_ty.ptrSize(zcu) == .One); + assert(parent_ptr_ty.ptrSize(zcu) == .one); assert(eu_ty.zigTypeTag(zcu) == .error_union); const result_ty = try pt.ptrTypeSema(info: { @@ -3771,7 +3771,7 @@ pub fn ptrEuPayload(parent_ptr: Value, pt: Zcu.PerThread) !Value { if (parent_ptr.isUndef(zcu)) return pt.undefValue(result_ty); - const base_ptr = try parent_ptr.canonicalizeBasePtr(.One, eu_ty, pt); + const base_ptr = try parent_ptr.canonicalizeBasePtr(.one, eu_ty, pt); return Value.fromInterned(try pt.intern(.{ .ptr = .{ .ty = result_ty.toIntern(), .base_addr = .{ .eu_payload = base_ptr.toIntern() }, @@ -3789,7 +3789,7 @@ pub fn ptrField(parent_ptr: Value, field_idx: u32, pt: Zcu.PerThread) !Value { const aggregate_ty = parent_ptr_ty.childType(zcu); const parent_ptr_info = parent_ptr_ty.ptrInfo(zcu); - assert(parent_ptr_info.flags.size == .One); + assert(parent_ptr_info.flags.size == .one); // Exiting this `switch` indicates that the `field` pointer representation should be used. // `field_align` may be `.none` to represent the natural alignment of `field_ty`, but is not necessarily. @@ -3920,7 +3920,7 @@ pub fn ptrField(parent_ptr: Value, field_idx: u32, pt: Zcu.PerThread) !Value { if (parent_ptr.isUndef(zcu)) return pt.undefValue(result_ty); - const base_ptr = try parent_ptr.canonicalizeBasePtr(.One, aggregate_ty, pt); + const base_ptr = try parent_ptr.canonicalizeBasePtr(.one, aggregate_ty, pt); return Value.fromInterned(try pt.intern(.{ .ptr = .{ .ty = result_ty.toIntern(), .base_addr = .{ .field = .{ @@ -3937,8 +3937,8 @@ pub fn ptrField(parent_ptr: Value, field_idx: u32, pt: Zcu.PerThread) !Value { pub fn ptrElem(orig_parent_ptr: Value, field_idx: u64, pt: Zcu.PerThread) !Value { const zcu = pt.zcu; const parent_ptr = switch (orig_parent_ptr.typeOf(zcu).ptrSize(zcu)) { - .One, .Many, .C => orig_parent_ptr, - .Slice => orig_parent_ptr.slicePtr(zcu), + .one, .many, .c => orig_parent_ptr, + .slice => orig_parent_ptr.slicePtr(zcu), }; const parent_ptr_ty = parent_ptr.typeOf(zcu); @@ -3959,7 +3959,7 @@ pub fn ptrElem(orig_parent_ptr: Value, field_idx: u64, pt: Zcu.PerThread) !Value }; const strat: PtrStrat = switch (parent_ptr_ty.ptrSize(zcu)) { - .One => switch (elem_ty.zigTypeTag(zcu)) { + .one => switch (elem_ty.zigTypeTag(zcu)) { .vector => .{ .offset = field_idx * @divExact(try elem_ty.childType(zcu).bitSizeSema(pt), 8) }, .array => strat: { const arr_elem_ty = elem_ty.childType(zcu); @@ -3971,12 +3971,12 @@ pub fn ptrElem(orig_parent_ptr: Value, field_idx: u64, pt: Zcu.PerThread) !Value else => unreachable, }, - .Many, .C => if (try elem_ty.comptimeOnlySema(pt)) + .many, .c => if (try elem_ty.comptimeOnlySema(pt)) .{ .elem_ptr = elem_ty } else .{ .offset = field_idx * (try elem_ty.abiSizeInner(.sema, zcu, pt.tid)).scalar }, - .Slice => unreachable, + .slice => unreachable, }; switch (strat) { @@ -4004,7 +4004,7 @@ pub fn ptrElem(orig_parent_ptr: Value, field_idx: u64, pt: Zcu.PerThread) !Value }, else => {}, } - const base_ptr = try parent_ptr.canonicalizeBasePtr(.Many, arr_base_ty, pt); + const base_ptr = try parent_ptr.canonicalizeBasePtr(.many, arr_base_ty, pt); return Value.fromInterned(try pt.intern(.{ .ptr = .{ .ty = result_ty.toIntern(), .base_addr = .{ .arr_elem = .{ @@ -4234,7 +4234,7 @@ pub fn pointerDerivationAdvanced(ptr_val: Value, arena: Allocator, pt: Zcu.PerTh .child = parent_ptr_info.child, .flags = flags: { var flags = parent_ptr_info.flags; - flags.size = .One; + flags.size = .one; break :flags flags; }, }); @@ -4304,8 +4304,8 @@ pub fn pointerDerivationAdvanced(ptr_val: Value, arena: Allocator, pt: Zcu.PerTh if (!cur_ty.isPtrLikeOptional(zcu)) break :ptr_opt; if (need_child.zigTypeTag(zcu) != .pointer) break :ptr_opt; switch (need_child.ptrSize(zcu)) { - .One, .Many => {}, - .Slice, .C => break :ptr_opt, + .one, .many => {}, + .slice, .c => break :ptr_opt, } const parent = try arena.create(PointerDeriveStep); parent.* = cur_derive; @@ -4323,7 +4323,7 @@ pub fn pointerDerivationAdvanced(ptr_val: Value, arena: Allocator, pt: Zcu.PerTh const elem_size = elem_ty.abiSize(zcu); const start_idx = cur_offset / elem_size; const end_idx = (cur_offset + need_bytes + elem_size - 1) / elem_size; - if (end_idx == start_idx + 1 and ptr_ty_info.flags.size == .One) { + if (end_idx == start_idx + 1 and ptr_ty_info.flags.size == .one) { const parent = try arena.create(PointerDeriveStep); parent.* = cur_derive; cur_derive = .{ .elem_ptr = .{ diff --git a/src/Zcu/PerThread.zig b/src/Zcu/PerThread.zig index ab5f2b2994d0..85231fa1ceb1 100644 --- a/src/Zcu/PerThread.zig +++ b/src/Zcu/PerThread.zig @@ -3068,7 +3068,7 @@ pub fn populateTestFunctions( .child = test_fn_ty.toIntern(), .flags = .{ .is_const = true, - .size = .Slice, + .size = .slice, }, }); const new_init = try pt.intern(.{ .slice = .{ @@ -3303,7 +3303,7 @@ pub fn optionalType(pt: Zcu.PerThread, child_type: InternPool.Index) Allocator.E pub fn ptrType(pt: Zcu.PerThread, info: InternPool.Key.PtrType) Allocator.Error!Type { var canon_info = info; - if (info.flags.size == .C) canon_info.flags.is_allowzero = true; + if (info.flags.size == .c) canon_info.flags.is_allowzero = true; // Canonicalize non-zero alignment. If it matches the ABI alignment of the pointee // type, we change it to 0 here. If this causes an assertion trip because the @@ -3360,7 +3360,7 @@ pub fn manyConstPtrType(pt: Zcu.PerThread, child_type: Type) Allocator.Error!Typ return pt.ptrType(.{ .child = child_type.toIntern(), .flags = .{ - .size = .Many, + .size = .many, .is_const = true, }, }); diff --git a/src/arch/aarch64/CodeGen.zig b/src/arch/aarch64/CodeGen.zig index 33f691959219..c1657396ad33 100644 --- a/src/arch/aarch64/CodeGen.zig +++ b/src/arch/aarch64/CodeGen.zig @@ -2398,7 +2398,7 @@ fn ptrArithmetic( const ptr_ty = lhs_ty; const elem_ty = switch (ptr_ty.ptrSize(zcu)) { - .One => ptr_ty.childType(zcu).childType(zcu), // ptr to array, so get array element type + .one => ptr_ty.childType(zcu).childType(zcu), // ptr to array, so get array element type else => ptr_ty.childType(zcu), }; const elem_size = elem_ty.abiSize(zcu); diff --git a/src/arch/arm/CodeGen.zig b/src/arch/arm/CodeGen.zig index 65a202803dfe..10b0473ecfe3 100644 --- a/src/arch/arm/CodeGen.zig +++ b/src/arch/arm/CodeGen.zig @@ -3919,7 +3919,7 @@ fn ptrArithmetic( const ptr_ty = lhs_ty; const elem_ty = switch (ptr_ty.ptrSize(zcu)) { - .One => ptr_ty.childType(zcu).childType(zcu), // ptr to array, so get array element type + .one => ptr_ty.childType(zcu).childType(zcu), // ptr to array, so get array element type else => ptr_ty.childType(zcu), }; const elem_size: u32 = @intCast(elem_ty.abiSize(zcu)); diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig index 820188e188df..c180b3aac922 100644 --- a/src/arch/riscv64/CodeGen.zig +++ b/src/arch/riscv64/CodeGen.zig @@ -7843,15 +7843,15 @@ fn airMemset(func: *Func, inst: Air.Inst.Index, safety: bool) !void { if (elem_abi_size == 1) { const ptr: MCValue = switch (dst_ptr_ty.ptrSize(zcu)) { // TODO: this only handles slices stored in the stack - .Slice => dst_ptr, - .One => dst_ptr, - .C, .Many => unreachable, + .slice => dst_ptr, + .one => dst_ptr, + .c, .many => unreachable, }; const len: MCValue = switch (dst_ptr_ty.ptrSize(zcu)) { // TODO: this only handles slices stored in the stack - .Slice => dst_ptr.address().offset(8).deref(), - .One => .{ .immediate = dst_ptr_ty.childType(zcu).arrayLen(zcu) }, - .C, .Many => unreachable, + .slice => dst_ptr.address().offset(8).deref(), + .one => .{ .immediate = dst_ptr_ty.childType(zcu).arrayLen(zcu) }, + .c, .many => unreachable, }; const len_lock: ?RegisterLock = switch (len) { .register => |reg| func.register_manager.lockRegAssumeUnused(reg), @@ -7867,8 +7867,8 @@ fn airMemset(func: *Func, inst: Air.Inst.Index, safety: bool) !void { // Length zero requires a runtime check - so we handle arrays specially // here to elide it. switch (dst_ptr_ty.ptrSize(zcu)) { - .Slice => return func.fail("TODO: airMemset Slices", .{}), - .One => { + .slice => return func.fail("TODO: airMemset Slices", .{}), + .one => { const elem_ptr_ty = try pt.singleMutPtrType(elem_ty); const len = dst_ptr_ty.childType(zcu).arrayLen(zcu); @@ -7889,7 +7889,7 @@ fn airMemset(func: *Func, inst: Air.Inst.Index, safety: bool) !void { const bytes_to_copy: MCValue = .{ .immediate = elem_abi_size * (len - 1) }; try func.genInlineMemcpy(second_elem_ptr_mcv, dst_ptr, bytes_to_copy); }, - .C, .Many => unreachable, + .c, .many => unreachable, } } return func.finishAir(inst, .unreach, .{ bin_op.lhs, bin_op.rhs, .none }); @@ -7906,7 +7906,7 @@ fn airMemcpy(func: *Func, inst: Air.Inst.Index) !void { const dst_ty = func.typeOf(bin_op.lhs); const len_mcv: MCValue = switch (dst_ty.ptrSize(zcu)) { - .Slice => len: { + .slice => len: { const len_reg, const len_lock = try func.allocReg(.int); defer func.register_manager.unlockReg(len_lock); @@ -7921,7 +7921,7 @@ fn airMemcpy(func: *Func, inst: Air.Inst.Index) !void { ); break :len .{ .register = len_reg }; }, - .One => len: { + .one => len: { const array_ty = dst_ty.childType(zcu); break :len .{ .immediate = array_ty.arrayLen(zcu) * array_ty.childType(zcu).abiSize(zcu) }; }, diff --git a/src/arch/riscv64/abi.zig b/src/arch/riscv64/abi.zig index 3ce63130834d..84788075895e 100644 --- a/src/arch/riscv64/abi.zig +++ b/src/arch/riscv64/abi.zig @@ -109,7 +109,7 @@ pub fn classifySystem(ty: Type, zcu: *Zcu) [8]SystemClass { return result; }, .pointer => switch (ty.ptrSize(zcu)) { - .Slice => { + .slice => { result[0] = .integer; result[1] = .integer; return result; diff --git a/src/arch/sparc64/CodeGen.zig b/src/arch/sparc64/CodeGen.zig index 32bca3bc9004..0957789325e8 100644 --- a/src/arch/sparc64/CodeGen.zig +++ b/src/arch/sparc64/CodeGen.zig @@ -2953,7 +2953,7 @@ fn binOp( .pointer => { const ptr_ty = lhs_ty; const elem_ty = switch (ptr_ty.ptrSize(zcu)) { - .One => ptr_ty.childType(zcu).childType(zcu), // ptr to array, so get array element type + .one => ptr_ty.childType(zcu).childType(zcu), // ptr to array, so get array element type else => ptr_ty.childType(zcu), }; const elem_size = elem_ty.abiSize(zcu); diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig index eeaf9988cbd1..8b32fe1d7ab3 100644 --- a/src/arch/wasm/CodeGen.zig +++ b/src/arch/wasm/CodeGen.zig @@ -4726,7 +4726,7 @@ fn airPtrBinOp(cg: *CodeGen, inst: Air.Inst.Index, op: Op) InnerError!void { const offset = try cg.resolveInst(bin_op.rhs); const ptr_ty = cg.typeOf(bin_op.lhs); const pointee_ty = switch (ptr_ty.ptrSize(zcu)) { - .One => ptr_ty.childType(zcu).childType(zcu), // ptr to array, so get array element type + .one => ptr_ty.childType(zcu).childType(zcu), // ptr to array, so get array element type else => ptr_ty.childType(zcu), }; @@ -4756,12 +4756,12 @@ fn airMemset(cg: *CodeGen, inst: Air.Inst.Index, safety: bool) InnerError!void { const ptr_ty = cg.typeOf(bin_op.lhs); const value = try cg.resolveInst(bin_op.rhs); const len = switch (ptr_ty.ptrSize(zcu)) { - .Slice => try cg.sliceLen(ptr), - .One => @as(WValue, .{ .imm32 = @as(u32, @intCast(ptr_ty.childType(zcu).arrayLen(zcu))) }), - .C, .Many => unreachable, + .slice => try cg.sliceLen(ptr), + .one => @as(WValue, .{ .imm32 = @as(u32, @intCast(ptr_ty.childType(zcu).arrayLen(zcu))) }), + .c, .many => unreachable, }; - const elem_ty = if (ptr_ty.ptrSize(zcu) == .One) + const elem_ty = if (ptr_ty.ptrSize(zcu) == .one) ptr_ty.childType(zcu).childType(zcu) else ptr_ty.childType(zcu); @@ -5688,7 +5688,7 @@ fn airMemcpy(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void { const src = try cg.resolveInst(bin_op.rhs); const src_ty = cg.typeOf(bin_op.rhs); const len = switch (dst_ty.ptrSize(zcu)) { - .Slice => blk: { + .slice => blk: { const slice_len = try cg.sliceLen(dst); if (ptr_elem_ty.abiSize(zcu) != 1) { try cg.emitWValue(slice_len); @@ -5698,10 +5698,10 @@ fn airMemcpy(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void { } break :blk slice_len; }, - .One => @as(WValue, .{ + .one => @as(WValue, .{ .imm32 = @as(u32, @intCast(ptr_elem_ty.arrayLen(zcu) * ptr_elem_ty.childType(zcu).abiSize(zcu))), }), - .C, .Many => unreachable, + .c, .many => unreachable, }; const dst_ptr = try cg.sliceOrArrayPtr(dst, dst_ty); const src_ptr = try cg.sliceOrArrayPtr(src, src_ty); diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 940cd001958d..dbb0179ebbb3 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -9607,13 +9607,13 @@ fn genMulDivBinOp( const manyptr_u32_ty = try pt.ptrType(.{ .child = .u32_type, .flags = .{ - .size = .Many, + .size = .many, }, }); const manyptr_const_u32_ty = try pt.ptrType(.{ .child = .u32_type, .flags = .{ - .size = .Many, + .size = .many, .is_const = true, }, }); @@ -16614,15 +16614,15 @@ fn airMemset(self: *Self, inst: Air.Inst.Index, safety: bool) !void { if (elem_abi_size == 1) { const ptr: MCValue = switch (dst_ptr_ty.ptrSize(zcu)) { // TODO: this only handles slices stored in the stack - .Slice => dst_ptr, - .One => dst_ptr, - .C, .Many => unreachable, + .slice => dst_ptr, + .one => dst_ptr, + .c, .many => unreachable, }; const len: MCValue = switch (dst_ptr_ty.ptrSize(zcu)) { // TODO: this only handles slices stored in the stack - .Slice => dst_ptr.address().offset(8).deref(), - .One => .{ .immediate = dst_ptr_ty.childType(zcu).arrayLen(zcu) }, - .C, .Many => unreachable, + .slice => dst_ptr.address().offset(8).deref(), + .one => .{ .immediate = dst_ptr_ty.childType(zcu).arrayLen(zcu) }, + .c, .many => unreachable, }; const len_lock: ?RegisterLock = switch (len) { .register => |reg| self.register_manager.lockRegAssumeUnused(reg), @@ -16638,7 +16638,7 @@ fn airMemset(self: *Self, inst: Air.Inst.Index, safety: bool) !void { // Length zero requires a runtime check - so we handle arrays specially // here to elide it. switch (dst_ptr_ty.ptrSize(zcu)) { - .Slice => { + .slice => { const slice_ptr_ty = dst_ptr_ty.slicePtrFieldType(zcu); // TODO: this only handles slices stored in the stack @@ -16681,7 +16681,7 @@ fn airMemset(self: *Self, inst: Air.Inst.Index, safety: bool) !void { self.performReloc(skip_reloc); }, - .One => { + .one => { const elem_ptr_ty = try pt.singleMutPtrType(elem_ty); const len = dst_ptr_ty.childType(zcu).arrayLen(zcu); @@ -16704,7 +16704,7 @@ fn airMemset(self: *Self, inst: Air.Inst.Index, safety: bool) !void { const bytes_to_copy: MCValue = .{ .immediate = elem_abi_size * (len - 1) }; try self.genInlineMemcpy(second_elem_ptr_mcv, dst_ptr, bytes_to_copy); }, - .C, .Many => unreachable, + .c, .many => unreachable, } } return self.finishAir(inst, .unreach, .{ bin_op.lhs, bin_op.rhs, .none }); @@ -16735,7 +16735,7 @@ fn airMemcpy(self: *Self, inst: Air.Inst.Index) !void { defer if (src_ptr_lock) |lock| self.register_manager.unlockReg(lock); const len: MCValue = switch (dst_ptr_ty.ptrSize(zcu)) { - .Slice => len: { + .slice => len: { const len_reg = try self.register_manager.allocReg(null, abi.RegisterClass.gp); const len_lock = self.register_manager.lockRegAssumeUnused(len_reg); defer self.register_manager.unlockReg(len_lock); @@ -16748,11 +16748,11 @@ fn airMemcpy(self: *Self, inst: Air.Inst.Index) !void { ); break :len .{ .register = len_reg }; }, - .One => len: { + .one => len: { const array_ty = dst_ptr_ty.childType(zcu); break :len .{ .immediate = array_ty.arrayLen(zcu) * array_ty.childType(zcu).abiSize(zcu) }; }, - .C, .Many => unreachable, + .c, .many => unreachable, }; const len_lock: ?RegisterLock = switch (len) { .register => |reg| self.register_manager.lockRegAssumeUnused(reg), diff --git a/src/arch/x86_64/abi.zig b/src/arch/x86_64/abi.zig index fac6b6ce6ddd..d825b70cf66a 100644 --- a/src/arch/x86_64/abi.zig +++ b/src/arch/x86_64/abi.zig @@ -108,7 +108,7 @@ pub fn classifySystemV(ty: Type, zcu: *Zcu, target: std.Target, ctx: Context) [8 var result = [1]Class{.none} ** 8; switch (ty.zigTypeTag(zcu)) { .pointer => switch (ty.ptrSize(zcu)) { - .Slice => { + .slice => { result[0] = .integer; result[1] = .integer; return result; diff --git a/src/clang.zig b/src/clang.zig index 8b909cd077a0..c12daca2bce5 100644 --- a/src/clang.zig +++ b/src/clang.zig @@ -177,7 +177,7 @@ pub const ASTUnit = opaque { extern fn ZigClangASTUnit_visitLocalTopLevelDecls( *ASTUnit, context: ?*anyopaque, - Fn: ?*const fn (?*anyopaque, *const Decl) callconv(.C) bool, + Fn: ?*const fn (?*anyopaque, *const Decl) callconv(.c) bool, ) bool; pub const getLocalPreprocessingEntities_begin = ZigClangASTUnit_getLocalPreprocessingEntities_begin; diff --git a/src/codegen.zig b/src/codegen.zig index acd7a4965d06..dd3b874bc0d9 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -945,7 +945,7 @@ pub fn genTypedValue( switch (ty.zigTypeTag(zcu)) { .void => return .{ .mcv = .none }, .pointer => switch (ty.ptrSize(zcu)) { - .Slice => {}, + .slice => {}, else => switch (val.toIntern()) { .null_value => { return .{ .mcv = .{ .immediate = 0 } }; diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 6fee1beb89b6..bbb06ae06fb4 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -1589,14 +1589,14 @@ pub const DeclGen = struct { try dg.fmtIntLiteral(try pt.undefValue(ty), location), }), .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .One, .Many, .C => { + .one, .many, .c => { try writer.writeAll("(("); try dg.renderCType(writer, ctype); return writer.print("){x})", .{ try dg.fmtIntLiteral(try pt.undefValue(Type.usize), .Other), }); }, - .Slice => { + .slice => { if (!location.isInitializer()) { try writer.writeByte('('); try dg.renderCType(writer, ctype); @@ -3570,7 +3570,7 @@ fn airPtrElemPtr(f: *Function, inst: Air.Inst.Index) !CValue { try f.renderType(writer, inst_ty); try writer.writeByte(')'); if (elem_has_bits) try writer.writeByte('&'); - if (elem_has_bits and ptr_ty.ptrSize(zcu) == .One) { + if (elem_has_bits and ptr_ty.ptrSize(zcu) == .one) { // It's a pointer to an array, so we need to de-reference. try f.writeCValueDeref(writer, ptr); } else try f.writeCValue(writer, ptr, .Other); @@ -5798,8 +5798,8 @@ fn fieldLocation( } }, .ptr_type => |ptr_info| switch (ptr_info.flags.size) { - .One, .Many, .C => unreachable, - .Slice => switch (field_index) { + .one, .many, .c => unreachable, + .slice => switch (field_index) { 0 => return .{ .field = .{ .identifier = "ptr" } }, 1 => return .{ .field = .{ .identifier = "len" } }, else => unreachable, @@ -6902,7 +6902,7 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue { try writer.writeAll("memset("); switch (dest_ty.ptrSize(zcu)) { - .Slice => { + .slice => { try f.writeCValueMember(writer, dest_slice, .{ .identifier = "ptr" }); try writer.writeAll(", 0xaa, "); try f.writeCValueMember(writer, dest_slice, .{ .identifier = "len" }); @@ -6912,14 +6912,14 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue { try writer.writeAll(");\n"); } }, - .One => { + .one => { const array_ty = dest_ty.childType(zcu); const len = array_ty.arrayLen(zcu) * elem_abi_size; try f.writeCValue(writer, dest_slice, .FunctionArgument); try writer.print(", 0xaa, {d});\n", .{len}); }, - .Many, .C => unreachable, + .many, .c => unreachable, } try reap(f, inst, &.{ bin_op.lhs, bin_op.rhs }); return .none; @@ -6932,7 +6932,7 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue { const elem_ptr_ty = try pt.ptrType(.{ .child = elem_ty.toIntern(), .flags = .{ - .size = .C, + .size = .c, }, }); @@ -6946,14 +6946,14 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue { try f.writeCValue(writer, index, .Other); try writer.writeAll(" != "); switch (dest_ty.ptrSize(zcu)) { - .Slice => { + .slice => { try f.writeCValueMember(writer, dest_slice, .{ .identifier = "len" }); }, - .One => { + .one => { const array_ty = dest_ty.childType(zcu); try writer.print("{d}", .{array_ty.arrayLen(zcu)}); }, - .Many, .C => unreachable, + .many, .c => unreachable, } try writer.writeAll("; ++"); try f.writeCValue(writer, index, .Other); @@ -6981,7 +6981,7 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue { try writer.writeAll("memset("); switch (dest_ty.ptrSize(zcu)) { - .Slice => { + .slice => { try f.writeCValueMember(writer, dest_slice, .{ .identifier = "ptr" }); try writer.writeAll(", "); try f.writeCValue(writer, bitcasted, .FunctionArgument); @@ -6989,7 +6989,7 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue { try f.writeCValueMember(writer, dest_slice, .{ .identifier = "len" }); try writer.writeAll(");\n"); }, - .One => { + .one => { const array_ty = dest_ty.childType(zcu); const len = array_ty.arrayLen(zcu) * elem_abi_size; @@ -6998,7 +6998,7 @@ fn airMemset(f: *Function, inst: Air.Inst.Index, safety: bool) !CValue { try f.writeCValue(writer, bitcasted, .FunctionArgument); try writer.print(", {d});\n", .{len}); }, - .Many, .C => unreachable, + .many, .c => unreachable, } try f.freeCValue(inst, bitcasted); try reap(f, inst, &.{ bin_op.lhs, bin_op.rhs }); @@ -7015,7 +7015,7 @@ fn airMemcpy(f: *Function, inst: Air.Inst.Index) !CValue { const src_ty = f.typeOf(bin_op.rhs); const writer = f.object.writer(); - if (dest_ty.ptrSize(zcu) != .One) { + if (dest_ty.ptrSize(zcu) != .one) { try writer.writeAll("if ("); try writeArrayLen(f, writer, dest_ptr, dest_ty); try writer.writeAll(" != 0) "); @@ -7038,11 +7038,11 @@ fn writeArrayLen(f: *Function, writer: ArrayListWriter, dest_ptr: CValue, dest_t const pt = f.object.dg.pt; const zcu = pt.zcu; switch (dest_ty.ptrSize(zcu)) { - .One => try writer.print("{}", .{ + .one => try writer.print("{}", .{ try f.fmtIntLiteral(try pt.intValue(Type.usize, dest_ty.childType(zcu).arrayLen(zcu))), }), - .Many, .C => unreachable, - .Slice => try f.writeCValueMember(writer, dest_ptr, .{ .identifier = "len" }), + .many, .c => unreachable, + .slice => try f.writeCValueMember(writer, dest_ptr, .{ .identifier = "len" }), } } diff --git a/src/codegen/c/Type.zig b/src/codegen/c/Type.zig index 31daa75a1354..2c2db8b50668 100644 --- a/src/codegen/c/Type.zig +++ b/src/codegen/c/Type.zig @@ -1458,7 +1458,7 @@ pub const Pool = struct { _ => |ip_index| switch (ip.indexToKey(ip_index)) { .int_type => |int_info| return pool.fromIntInfo(allocator, int_info, mod, kind), .ptr_type => |ptr_info| switch (ptr_info.flags.size) { - .One, .Many, .C => { + .one, .many, .c => { const elem_ctype = elem_ctype: { if (ptr_info.packed_offset.host_size > 0 and ptr_info.flags.vector_index == .none) @@ -1505,7 +1505,7 @@ pub const Pool = struct { .@"volatile" = ptr_info.flags.is_volatile, }); }, - .Slice => { + .slice => { const target = &mod.resolved_target.result; var fields = [_]Info.Field{ .{ @@ -1598,7 +1598,7 @@ pub const Pool = struct { switch (payload_type) { .anyerror_type => return payload_ctype, else => switch (ip.indexToKey(payload_type)) { - .ptr_type => |payload_ptr_info| if (payload_ptr_info.flags.size != .C and + .ptr_type => |payload_ptr_info| if (payload_ptr_info.flags.size != .c and !payload_ptr_info.flags.is_allowzero) return payload_ctype, .error_set_type, .inferred_error_set_type => return payload_ctype, else => {}, diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index c23cc4354c69..99403db78cb2 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -2109,7 +2109,7 @@ pub const Object = struct { ptr_info.flags.is_allowzero or ptr_info.flags.is_const or ptr_info.flags.is_volatile or - ptr_info.flags.size == .Many or ptr_info.flags.size == .C or + ptr_info.flags.size == .many or ptr_info.flags.size == .c or !Type.fromInterned(ptr_info.child).hasRuntimeBitsIgnoreComptime(zcu)) { const bland_ptr_ty = try pt.ptrType(.{ @@ -2120,8 +2120,8 @@ pub const Object = struct { .flags = .{ .alignment = ptr_info.flags.alignment, .size = switch (ptr_info.flags.size) { - .Many, .C, .One => .One, - .Slice => .Slice, + .many, .c, .one => .one, + .slice => .slice, }, }, }); @@ -3382,8 +3382,8 @@ pub const Object = struct { toLlvmAddressSpace(ptr_type.flags.address_space, target), ); break :type switch (ptr_type.flags.size) { - .One, .Many, .C => ptr_ty, - .Slice => try o.builder.structType(.normal, &.{ + .one, .many, .c => ptr_ty, + .slice => try o.builder.structType(.normal, &.{ ptr_ty, try o.lowerType(Type.usize), }), @@ -6988,7 +6988,7 @@ pub const FuncGen = struct { const zcu = pt.zcu; const llvm_usize = try o.lowerType(Type.usize); switch (ty.ptrSize(zcu)) { - .Slice => { + .slice => { const len = try fg.wip.extractValue(ptr, &.{1}, ""); const elem_ty = ty.childType(zcu); const abi_size = elem_ty.abiSize(zcu); @@ -6996,13 +6996,13 @@ pub const FuncGen = struct { const abi_size_llvm_val = try o.builder.intValue(llvm_usize, abi_size); return fg.wip.bin(.@"mul nuw", len, abi_size_llvm_val, ""); }, - .One => { + .one => { const array_ty = ty.childType(zcu); const elem_ty = array_ty.childType(zcu); const abi_size = elem_ty.abiSize(zcu); return o.builder.intValue(llvm_usize, array_ty.arrayLen(zcu) * abi_size); }, - .Many, .C => unreachable, + .many, .c => unreachable, } } @@ -8670,11 +8670,11 @@ pub const FuncGen = struct { const llvm_elem_ty = try o.lowerPtrElemTy(ptr_ty.childType(zcu)); switch (ptr_ty.ptrSize(zcu)) { // It's a pointer to an array, so according to LLVM we need an extra GEP index. - .One => return self.wip.gep(.inbounds, llvm_elem_ty, ptr, &.{ + .one => return self.wip.gep(.inbounds, llvm_elem_ty, ptr, &.{ try o.builder.intValue(try o.lowerType(Type.usize), 0), offset, }, ""), - .C, .Many => return self.wip.gep(.inbounds, llvm_elem_ty, ptr, &.{offset}, ""), - .Slice => { + .c, .many => return self.wip.gep(.inbounds, llvm_elem_ty, ptr, &.{offset}, ""), + .slice => { const base = try self.wip.extractValue(ptr, &.{0}, ""); return self.wip.gep(.inbounds, llvm_elem_ty, base, &.{offset}, ""); }, @@ -8693,11 +8693,11 @@ pub const FuncGen = struct { const llvm_elem_ty = try o.lowerPtrElemTy(ptr_ty.childType(zcu)); switch (ptr_ty.ptrSize(zcu)) { // It's a pointer to an array, so according to LLVM we need an extra GEP index. - .One => return self.wip.gep(.inbounds, llvm_elem_ty, ptr, &.{ + .one => return self.wip.gep(.inbounds, llvm_elem_ty, ptr, &.{ try o.builder.intValue(try o.lowerType(Type.usize), 0), negative_offset, }, ""), - .C, .Many => return self.wip.gep(.inbounds, llvm_elem_ty, ptr, &.{negative_offset}, ""), - .Slice => { + .c, .many => return self.wip.gep(.inbounds, llvm_elem_ty, ptr, &.{negative_offset}, ""), + .slice => { const base = try self.wip.extractValue(ptr, &.{0}, ""); return self.wip.gep(.inbounds, llvm_elem_ty, base, &.{negative_offset}, ""); }, @@ -10034,9 +10034,9 @@ pub const FuncGen = struct { const llvm_usize_ty = try o.lowerType(Type.usize); const len = switch (ptr_ty.ptrSize(zcu)) { - .Slice => try self.wip.extractValue(dest_slice, &.{1}, ""), - .One => try o.builder.intValue(llvm_usize_ty, ptr_ty.childType(zcu).arrayLen(zcu)), - .Many, .C => unreachable, + .slice => try self.wip.extractValue(dest_slice, &.{1}, ""), + .one => try o.builder.intValue(llvm_usize_ty, ptr_ty.childType(zcu).arrayLen(zcu)), + .many, .c => unreachable, }; const elem_llvm_ty = try o.lowerType(elem_ty); const end_ptr = try self.wip.gep(.inbounds, elem_llvm_ty, dest_ptr, &.{len}, ""); diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index 91e2c4f7e7ca..ceb9c46b1ba3 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -1705,13 +1705,13 @@ const NavGen = struct { const storage_class = self.spvStorageClass(ptr_info.flags.address_space); const ptr_ty_id = try self.ptrType(child_ty, storage_class); - if (target.os.tag == .vulkan and ptr_info.flags.size == .Many) { + if (target.os.tag == .vulkan and ptr_info.flags.size == .many) { try self.spv.decorate(ptr_ty_id, .{ .ArrayStride = .{ .array_stride = @intCast(child_ty.abiSize(zcu)), } }); } - if (ptr_info.flags.size != .Slice) { + if (ptr_info.flags.size != .slice) { return ptr_ty_id; } @@ -4399,15 +4399,15 @@ const NavGen = struct { const result_ty_id = try self.resolveType(result_ty, .direct); switch (ptr_ty.ptrSize(zcu)) { - .One => { + .one => { // Pointer to array // TODO: Is this correct? return try self.accessChainId(result_ty_id, ptr_id, &.{offset_id}); }, - .C, .Many => { + .c, .many => { return try self.ptrAccessChain(result_ty_id, ptr_id, offset_id, &.{}); }, - .Slice => { + .slice => { // TODO: This is probably incorrect. A slice should be returned here, though this is what llvm does. const slice_ptr_id = try self.extractField(result_ty, ptr_id, 0); return try self.ptrAccessChain(result_ty_id, slice_ptr_id, offset_id, &.{}); @@ -4989,15 +4989,15 @@ const NavGen = struct { const pt = self.pt; const zcu = pt.zcu; switch (ty.ptrSize(zcu)) { - .Slice => return self.extractField(Type.usize, operand_id, 1), - .One => { + .slice => return self.extractField(Type.usize, operand_id, 1), + .one => { const array_ty = ty.childType(zcu); const elem_ty = array_ty.childType(zcu); const abi_size = elem_ty.abiSize(zcu); const size = array_ty.arrayLenIncludingSentinel(zcu) * abi_size; return try self.constInt(Type.usize, size, .direct); }, - .Many, .C => unreachable, + .many, .c => unreachable, } } diff --git a/src/codegen/spirv/Section.zig b/src/codegen/spirv/Section.zig index 1fdf884bdbed..4fe12f999f82 100644 --- a/src/codegen/spirv/Section.zig +++ b/src/codegen/spirv/Section.zig @@ -159,7 +159,7 @@ pub fn writeOperand(section: *Section, comptime Operand: type, operand: Operand) section.writeOperand(info.child, child); }, .pointer => |info| { - std.debug.assert(info.size == .Slice); // Should be no other pointer types in the spec. + std.debug.assert(info.size == .slice); // Should be no other pointer types in the spec. for (operand) |item| { section.writeOperand(info.child, item); } @@ -292,7 +292,7 @@ fn operandSize(comptime Operand: type, operand: Operand) usize { .@"enum" => 1, .optional => |info| if (operand) |child| operandSize(info.child, child) else 0, .pointer => |info| blk: { - std.debug.assert(info.size == .Slice); // Should be no other pointer types in the spec. + std.debug.assert(info.size == .slice); // Should be no other pointer types in the spec. var total: usize = 0; for (operand) |item| { total += operandSize(info.child, item); diff --git a/src/crash_report.zig b/src/crash_report.zig index 45410890a5fc..48a7fd5c39ec 100644 --- a/src/crash_report.zig +++ b/src/crash_report.zig @@ -190,7 +190,7 @@ pub fn attachSegfaultHandler() void { debug.updateSegfaultHandler(&act); } -fn handleSegfaultPosix(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.C) noreturn { +fn handleSegfaultPosix(sig: i32, info: *const posix.siginfo_t, ctx_ptr: ?*anyopaque) callconv(.c) noreturn { // TODO: use alarm() here to prevent infinite loops PanicSwitch.preDispatch(); diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index f76c4838539e..392d9dd181bf 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -3182,7 +3182,7 @@ fn updateLazyType( try uleb128(diw, ty.abiAlignment(zcu).toByteUnits().?); }, .ptr_type => |ptr_type| switch (ptr_type.flags.size) { - .One, .Many, .C => { + .one, .many, .c => { const ptr_child_type: Type = .fromInterned(ptr_type.child); try wip_nav.abbrevCode(if (ptr_type.sentinel == .none) .ptr_type else .ptr_sentinel_type); try wip_nav.strp(name); @@ -3210,7 +3210,7 @@ fn updateLazyType( try wip_nav.refType(ptr_child_type); } }, - .Slice => { + .slice => { try wip_nav.abbrevCode(.generated_struct_type); try wip_nav.strp(name); try uleb128(diw, ty.abiSize(zcu)); diff --git a/src/link/tapi/yaml.zig b/src/link/tapi/yaml.zig index 557ba8a91c23..dd392bc3b2a6 100644 --- a/src/link/tapi/yaml.zig +++ b/src/link/tapi/yaml.zig @@ -248,7 +248,7 @@ pub const Value = union(enum) { .array => return encode(arena, &input), .pointer => |info| switch (info.size) { - .One => switch (@typeInfo(info.child)) { + .one => switch (@typeInfo(info.child)) { .array => |child_info| { const Slice = []const child_info.child; return encode(arena, @as(Slice, input)); @@ -257,7 +257,7 @@ pub const Value = union(enum) { @compileError("Unhandled type: {s}" ++ @typeName(info.child)); }, }, - .Slice => { + .slice => { if (info.child == u8) { return Value{ .string = try arena.dupe(u8, input) }; } @@ -357,7 +357,7 @@ pub const Yaml = struct { }, .pointer => |info| { switch (info.size) { - .Slice => { + .slice => { var parsed = try self.arena.allocator().alloc(info.child, self.docs.items.len); for (self.docs.items, 0..) |doc, i| { parsed[i] = try self.parseValue(info.child, doc); @@ -446,7 +446,7 @@ pub const Yaml = struct { const arena = self.arena.allocator(); switch (ptr_info.size) { - .Slice => { + .slice => { if (ptr_info.child == u8) { return value.asString(); } diff --git a/src/mutable_value.zig b/src/mutable_value.zig index 9e63494d12ff..d894adfa331f 100644 --- a/src/mutable_value.zig +++ b/src/mutable_value.zig @@ -256,7 +256,7 @@ pub const MutableValue = union(enum) { }, .pointer => { const ptr_ty = ip.indexToKey(ty_ip).ptr_type; - if (ptr_ty.flags.size != .Slice) return; + if (ptr_ty.flags.size != .slice) return; const ptr = try arena.create(MutableValue); const len = try arena.create(MutableValue); ptr.* = .{ .interned = try pt.intern(.{ .undef = ip.slicePtrType(ty_ip) }) }; diff --git a/src/translate_c.zig b/src/translate_c.zig index c28d2c46b299..410791d3dc23 100644 --- a/src/translate_c.zig +++ b/src/translate_c.zig @@ -231,13 +231,13 @@ fn prepopulateGlobalNameTable(ast_unit: *clang.ASTUnit, c: *Context) !void { } } -fn declVisitorNamesOnlyC(context: ?*anyopaque, decl: *const clang.Decl) callconv(.C) bool { +fn declVisitorNamesOnlyC(context: ?*anyopaque, decl: *const clang.Decl) callconv(.c) bool { const c: *Context = @ptrCast(@alignCast(context)); declVisitorNamesOnly(c, decl) catch return false; return true; } -fn declVisitorC(context: ?*anyopaque, decl: *const clang.Decl) callconv(.C) bool { +fn declVisitorC(context: ?*anyopaque, decl: *const clang.Decl) callconv(.c) bool { const c: *Context = @ptrCast(@alignCast(context)); declVisitor(c, decl) catch return false; return true; diff --git a/test/behavior/align.zig b/test/behavior/align.zig index 9974715e3b70..d360a99aa333 100644 --- a/test/behavior/align.zig +++ b/test/behavior/align.zig @@ -410,11 +410,11 @@ test "alignment of function with c calling convention" { var runtime_nothing = ¬hing; _ = &runtime_nothing; const casted1: *align(a) const u8 = @ptrCast(runtime_nothing); - const casted2: *const fn () callconv(.C) void = @ptrCast(casted1); + const casted2: *const fn () callconv(.c) void = @ptrCast(casted1); casted2(); } -fn nothing() callconv(.C) void {} +fn nothing() callconv(.c) void {} const DefaultAligned = struct { nevermind: u32, diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index 50e13a355b47..37db3ba941d0 100644 --- a/test/behavior/cast.zig +++ b/test/behavior/cast.zig @@ -1118,7 +1118,7 @@ test "compile time int to ptr of function" { // On some architectures function pointers must be aligned. const hardcoded_fn_addr = maxInt(usize) & ~@as(usize, 0xf); pub const FUNCTION_CONSTANT = @as(PFN_void, @ptrFromInt(hardcoded_fn_addr)); -pub const PFN_void = *const fn (*anyopaque) callconv(.C) void; +pub const PFN_void = *const fn (*anyopaque) callconv(.c) void; fn foobar(func: PFN_void) !void { try std.testing.expect(@intFromPtr(func) == hardcoded_fn_addr); @@ -1281,11 +1281,11 @@ test "implicit cast *[0]T to E![]const u8" { var global_array: [4]u8 = undefined; test "cast from array reference to fn: comptime fn ptr" { - const f = @as(*align(1) const fn () callconv(.C) void, @ptrCast(&global_array)); + const f = @as(*align(1) const fn () callconv(.c) void, @ptrCast(&global_array)); try expect(@intFromPtr(f) == @intFromPtr(&global_array)); } test "cast from array reference to fn: runtime fn ptr" { - var f = @as(*align(1) const fn () callconv(.C) void, @ptrCast(&global_array)); + var f = @as(*align(1) const fn () callconv(.c) void, @ptrCast(&global_array)); _ = &f; try expect(@intFromPtr(f) == @intFromPtr(&global_array)); } @@ -1309,12 +1309,12 @@ test "*const [N]null u8 to ?[]const u8" { test "cast between [*c]T and ?[*:0]T on fn parameter" { const S = struct { - const Handler = ?fn ([*c]const u8) callconv(.C) void; + const Handler = ?fn ([*c]const u8) callconv(.c) void; fn addCallback(comptime handler: Handler) void { _ = handler; } - fn myCallback(cstr: ?[*:0]const u8) callconv(.C) void { + fn myCallback(cstr: ?[*:0]const u8) callconv(.c) void { _ = cstr; } diff --git a/test/behavior/export_builtin.zig b/test/behavior/export_builtin.zig index bd53a1df9314..2b9a64b2abcb 100644 --- a/test/behavior/export_builtin.zig +++ b/test/behavior/export_builtin.zig @@ -26,7 +26,7 @@ test "exporting with internal linkage" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; const S = struct { - fn foo() callconv(.C) void {} + fn foo() callconv(.c) void {} comptime { @export(&foo, .{ .name = "exporting_with_internal_linkage_foo", .linkage = .internal }); } diff --git a/test/behavior/export_keyword.zig b/test/behavior/export_keyword.zig index 7e8638111714..2b49017be607 100644 --- a/test/behavior/export_keyword.zig +++ b/test/behavior/export_keyword.zig @@ -44,7 +44,7 @@ test "export function alias" { if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; _ = struct { - fn foo_internal() callconv(.C) u32 { + fn foo_internal() callconv(.c) u32 { return 123; } export const foo_exported = foo_internal; diff --git a/test/behavior/extern.zig b/test/behavior/extern.zig index 0ef3e4935337..48b82fdf58c8 100644 --- a/test/behavior/extern.zig +++ b/test/behavior/extern.zig @@ -20,7 +20,7 @@ test "function extern symbol" { if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest; if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - const a = @extern(*const fn () callconv(.C) i32, .{ .name = "a_mystery_function" }); + const a = @extern(*const fn () callconv(.c) i32, .{ .name = "a_mystery_function" }); try expect(a() == 4567); } @@ -35,7 +35,7 @@ test "function extern symbol matches extern decl" { const S = struct { extern fn another_mystery_function() u32; - const same_thing = @extern(*const fn () callconv(.C) u32, .{ .name = "another_mystery_function" }); + const same_thing = @extern(*const fn () callconv(.c) u32, .{ .name = "another_mystery_function" }); }; try expect(S.another_mystery_function() == 12345); try expect(S.same_thing() == 12345); @@ -55,5 +55,5 @@ test "coerce extern function types" { }; _ = S; - _ = @as(fn () callconv(.C) ?*u32, c_extern_function); + _ = @as(fn () callconv(.c) ?*u32, c_extern_function); } diff --git a/test/behavior/fn.zig b/test/behavior/fn.zig index b041be93d900..975b0e9baa3e 100644 --- a/test/behavior/fn.zig +++ b/test/behavior/fn.zig @@ -153,9 +153,9 @@ test "extern struct with stdcallcc fn pointer" { if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; const S = extern struct { - ptr: *const fn () callconv(if (builtin.target.cpu.arch == .x86) .Stdcall else .C) i32, + ptr: *const fn () callconv(if (builtin.target.cpu.arch == .x86) .Stdcall else .c) i32, - fn foo() callconv(if (builtin.target.cpu.arch == .x86) .Stdcall else .C) i32 { + fn foo() callconv(if (builtin.target.cpu.arch == .x86) .Stdcall else .c) i32 { return 1234; } }; @@ -169,7 +169,7 @@ const nComplexCallconv = 100; fn fComplexCallconvRet(x: u32) callconv(blk: { const s: struct { n: u32 } = .{ .n = nComplexCallconv }; break :blk switch (s.n) { - 0 => .C, + 0 => .c, 1 => .Inline, else => .Unspecified, }; @@ -435,13 +435,13 @@ test "implicit cast function to function ptr" { return 123; } }; - var fnPtr1: *const fn () callconv(.C) c_int = S1.someFunctionThatReturnsAValue; + var fnPtr1: *const fn () callconv(.c) c_int = S1.someFunctionThatReturnsAValue; _ = &fnPtr1; try expect(fnPtr1() == 123); const S2 = struct { extern fn someFunctionThatReturnsAValue() c_int; }; - var fnPtr2: *const fn () callconv(.C) c_int = S2.someFunctionThatReturnsAValue; + var fnPtr2: *const fn () callconv(.c) c_int = S2.someFunctionThatReturnsAValue; _ = &fnPtr2; try expect(fnPtr2() == 123); } diff --git a/test/behavior/generics.zig b/test/behavior/generics.zig index 70d07da5f4bd..4e86419258ab 100644 --- a/test/behavior/generics.zig +++ b/test/behavior/generics.zig @@ -324,7 +324,7 @@ test "generic function instantiation non-duplicates" { for (source, 0..) |s, i| dest[i] = s; } - fn foo() callconv(.C) void {} + fn foo() callconv(.c) void {} }; var buffer: [100]u8 = undefined; S.copy(u8, &buffer, "hello"); @@ -471,13 +471,13 @@ test "coerced function body has inequal value with its uncoerced body" { try expect(S.A.do() == 1234); } -test "generic function returns value from callconv(.C) function" { +test "generic function returns value from callconv(.c) function" { const S = struct { - fn getU8() callconv(.C) u8 { + fn getU8() callconv(.c) u8 { return 123; } - fn getGeneric(comptime T: type, supplier: fn () callconv(.C) T) T { + fn getGeneric(comptime T: type, supplier: fn () callconv(.c) T) T { return supplier(); } }; @@ -521,11 +521,11 @@ test "function argument tuple used as struct field" { try expect(c.t[0] == null); } -test "comptime callconv(.C) function ptr uses comptime type argument" { +test "comptime callconv(.c) function ptr uses comptime type argument" { const S = struct { fn A( comptime T: type, - comptime destroycb: ?*const fn (?*T) callconv(.C) void, + comptime destroycb: ?*const fn (?*T) callconv(.c) void, ) !void { try expect(destroycb == null); } diff --git a/test/behavior/import_c_keywords.zig b/test/behavior/import_c_keywords.zig index 9029dca31d49..b4a48e260fdc 100644 --- a/test/behavior/import_c_keywords.zig +++ b/test/behavior/import_c_keywords.zig @@ -80,7 +80,7 @@ test "import c keywords" { try std.testing.expect(ptr_id == &some_non_c_keyword_constant); if (builtin.target.ofmt != .coff and builtin.target.os.tag != .windows) { - var ptr_fn: *const fn () callconv(.C) Id = &double; + var ptr_fn: *const fn () callconv(.c) Id = &double; try std.testing.expect(ptr_fn == &float); ptr_fn = &an_alias_of_float; try std.testing.expect(ptr_fn == &float); diff --git a/test/behavior/packed-struct.zig b/test/behavior/packed-struct.zig index 112488096118..a122a19c58e1 100644 --- a/test/behavior/packed-struct.zig +++ b/test/behavior/packed-struct.zig @@ -891,7 +891,7 @@ test "runtime init of unnamed packed struct type" { }{ .x = z }).m(); } -test "packed struct passed to callconv(.C) function" { +test "packed struct passed to callconv(.c) function" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO @@ -906,7 +906,7 @@ test "packed struct passed to callconv(.C) function" { d: u46 = 0, }; - fn foo(p: Packed, a1: u64, a2: u64, a3: u64, a4: u64, a5: u64) callconv(.C) bool { + fn foo(p: Packed, a1: u64, a2: u64, a3: u64, a4: u64, a5: u64) callconv(.c) bool { return p.a == 12345 and p.b == true and p.c == true and p.d == 0 and a1 == 5 and a2 == 4 and a3 == 3 and a4 == 2 and a5 == 1; } }; @@ -1270,7 +1270,7 @@ test "2-byte packed struct argument in C calling convention" { x: u15 = 0, y: u1 = 0, - fn foo(s: @This()) callconv(.C) i32 { + fn foo(s: @This()) callconv(.c) i32 { return s.x; } fn bar(s: @This()) !void { diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig index 1ba81695b8d6..74a77f3e21c0 100644 --- a/test/behavior/struct.zig +++ b/test/behavior/struct.zig @@ -803,7 +803,7 @@ test "fn with C calling convention returns struct by value" { handle: i32, }; - fn makeBar(t: i32) callconv(.C) ExternBar { + fn makeBar(t: i32) callconv(.c) ExternBar { return ExternBar{ .handle = t, }; diff --git a/test/behavior/type.zig b/test/behavior/type.zig index 19feb2d5fff3..b9f7889e0e5d 100644 --- a/test/behavior/type.zig +++ b/test/behavior/type.zig @@ -141,7 +141,7 @@ test "Type.Array" { test "@Type create slice with null sentinel" { const Slice = @Type(.{ .pointer = .{ - .size = .Slice, + .size = .slice, .is_const = true, .is_volatile = false, .is_allowzero = false, @@ -548,11 +548,11 @@ test "Type.Fn" { const some_opaque = opaque {}; const some_ptr = *some_opaque; - const T = fn (c_int, some_ptr) callconv(.C) void; + const T = fn (c_int, some_ptr) callconv(.c) void; { const fn_info = std.builtin.Type{ .@"fn" = .{ - .calling_convention = .C, + .calling_convention = .c, .is_generic = false, .is_var_args = false, .return_type = void, diff --git a/test/behavior/type_info.zig b/test/behavior/type_info.zig index 051aba15c36c..abd7e69160f6 100644 --- a/test/behavior/type_info.zig +++ b/test/behavior/type_info.zig @@ -44,7 +44,7 @@ test "type info: C pointer type info" { fn testCPtr() !void { const ptr_info = @typeInfo([*c]align(4) const i8); try expect(ptr_info == .pointer); - try expect(ptr_info.pointer.size == .C); + try expect(ptr_info.pointer.size == .c); try expect(ptr_info.pointer.is_const); try expect(!ptr_info.pointer.is_volatile); try expect(ptr_info.pointer.alignment == 4); @@ -54,8 +54,8 @@ fn testCPtr() !void { test "type info: value is correctly copied" { comptime { var ptrInfo = @typeInfo([]u32); - ptrInfo.pointer.size = .One; - try expect(@typeInfo([]u32).pointer.size == .Slice); + ptrInfo.pointer.size = .one; + try expect(@typeInfo([]u32).pointer.size == .slice); } } @@ -79,7 +79,7 @@ test "type info: pointer type info" { fn testPointer() !void { const u32_ptr_info = @typeInfo(*u32); try expect(u32_ptr_info == .pointer); - try expect(u32_ptr_info.pointer.size == .One); + try expect(u32_ptr_info.pointer.size == .one); try expect(u32_ptr_info.pointer.is_const == false); try expect(u32_ptr_info.pointer.is_volatile == false); try expect(u32_ptr_info.pointer.alignment == @alignOf(u32)); @@ -95,7 +95,7 @@ test "type info: unknown length pointer type info" { fn testUnknownLenPtr() !void { const u32_ptr_info = @typeInfo([*]const volatile f64); try expect(u32_ptr_info == .pointer); - try expect(u32_ptr_info.pointer.size == .Many); + try expect(u32_ptr_info.pointer.size == .many); try expect(u32_ptr_info.pointer.is_const == true); try expect(u32_ptr_info.pointer.is_volatile == true); try expect(u32_ptr_info.pointer.sentinel == null); @@ -111,7 +111,7 @@ test "type info: null terminated pointer type info" { fn testNullTerminatedPtr() !void { const ptr_info = @typeInfo([*:0]u8); try expect(ptr_info == .pointer); - try expect(ptr_info.pointer.size == .Many); + try expect(ptr_info.pointer.size == .many); try expect(ptr_info.pointer.is_const == false); try expect(ptr_info.pointer.is_volatile == false); try expect(@as(*const u8, @ptrCast(ptr_info.pointer.sentinel.?)).* == 0); @@ -127,7 +127,7 @@ test "type info: slice type info" { fn testSlice() !void { const u32_slice_info = @typeInfo([]u32); try expect(u32_slice_info == .pointer); - try expect(u32_slice_info.pointer.size == .Slice); + try expect(u32_slice_info.pointer.size == .slice); try expect(u32_slice_info.pointer.is_const == false); try expect(u32_slice_info.pointer.is_volatile == false); try expect(u32_slice_info.pointer.alignment == 4); @@ -374,7 +374,7 @@ fn testFunction() !void { try expect(foo_fn_info.@"fn".is_var_args); try expect(foo_fn_info.@"fn".return_type.? == usize); const foo_ptr_fn_info = @typeInfo(@TypeOf(&typeInfoFoo)); - try expect(foo_ptr_fn_info.pointer.size == .One); + try expect(foo_ptr_fn_info.pointer.size == .one); try expect(foo_ptr_fn_info.pointer.is_const); try expect(!foo_ptr_fn_info.pointer.is_volatile); try expect(foo_ptr_fn_info.pointer.address_space == .generic); @@ -401,7 +401,7 @@ fn testFunction() !void { try expect(aligned_foo_fn_info.@"fn".is_var_args); try expect(aligned_foo_fn_info.@"fn".return_type.? == usize); const aligned_foo_ptr_fn_info = @typeInfo(@TypeOf(&typeInfoFooAligned)); - try expect(aligned_foo_ptr_fn_info.pointer.size == .One); + try expect(aligned_foo_ptr_fn_info.pointer.size == .one); try expect(aligned_foo_ptr_fn_info.pointer.is_const); try expect(!aligned_foo_ptr_fn_info.pointer.is_volatile); try expect(aligned_foo_ptr_fn_info.pointer.alignment == 4); diff --git a/test/behavior/union.zig b/test/behavior/union.zig index a3ce6169a565..6e8c895b1a1e 100644 --- a/test/behavior/union.zig +++ b/test/behavior/union.zig @@ -1229,7 +1229,7 @@ test "return an extern union from C calling convention" { s: S, }; - fn bar(arg_u: U) callconv(.C) U { + fn bar(arg_u: U) callconv(.c) U { var u = arg_u; _ = &u; return u; diff --git a/test/behavior/var_args.zig b/test/behavior/var_args.zig index 350379bdfeb2..b5370b781361 100644 --- a/test/behavior/var_args.zig +++ b/test/behavior/var_args.zig @@ -108,19 +108,19 @@ test "simple variadic function" { if (builtin.cpu.arch == .s390x and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21350 const S = struct { - fn simple(...) callconv(.C) c_int { + fn simple(...) callconv(.c) c_int { var ap = @cVaStart(); defer @cVaEnd(&ap); return @cVaArg(&ap, c_int); } - fn compatible(_: c_int, ...) callconv(.C) c_int { + fn compatible(_: c_int, ...) callconv(.c) c_int { var ap = @cVaStart(); defer @cVaEnd(&ap); return @cVaArg(&ap, c_int); } - fn add(count: c_int, ...) callconv(.C) c_int { + fn add(count: c_int, ...) callconv(.c) c_int { var ap = @cVaStart(); defer @cVaEnd(&ap); var i: usize = 0; @@ -169,7 +169,7 @@ test "coerce reference to var arg" { if (builtin.cpu.arch == .s390x and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21350 const S = struct { - fn addPtr(count: c_int, ...) callconv(.C) c_int { + fn addPtr(count: c_int, ...) callconv(.c) c_int { var ap = @cVaStart(); defer @cVaEnd(&ap); var i: usize = 0; @@ -202,7 +202,7 @@ test "variadic functions" { if (builtin.cpu.arch == .s390x and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21350 const S = struct { - fn printf(list_ptr: *std.ArrayList(u8), format: [*:0]const u8, ...) callconv(.C) void { + fn printf(list_ptr: *std.ArrayList(u8), format: [*:0]const u8, ...) callconv(.c) void { var ap = @cVaStart(); defer @cVaEnd(&ap); vprintf(list_ptr, format, &ap); @@ -212,7 +212,7 @@ test "variadic functions" { list: *std.ArrayList(u8), format: [*:0]const u8, ap: *std.builtin.VaList, - ) callconv(.C) void { + ) callconv(.c) void { for (std.mem.span(format)) |c| switch (c) { 's' => { const arg = @cVaArg(ap, [*:0]const u8); @@ -247,7 +247,7 @@ test "copy VaList" { if (builtin.cpu.arch == .s390x and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21350 const S = struct { - fn add(count: c_int, ...) callconv(.C) c_int { + fn add(count: c_int, ...) callconv(.c) c_int { var ap = @cVaStart(); defer @cVaEnd(&ap); var copy = @cVaCopy(&ap); @@ -284,7 +284,7 @@ test "unused VaList arg" { if (builtin.cpu.arch == .s390x and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/21350 const S = struct { - fn thirdArg(dummy: c_int, ...) callconv(.C) c_int { + fn thirdArg(dummy: c_int, ...) callconv(.c) c_int { _ = dummy; var ap = @cVaStart(); diff --git a/test/cases/compile_errors/generic_instantiation_failure_in_generic_function_return_type.zig b/test/cases/compile_errors/generic_instantiation_failure_in_generic_function_return_type.zig index 1be4360317b6..ee1dd783433e 100644 --- a/test/cases/compile_errors/generic_instantiation_failure_in_generic_function_return_type.zig +++ b/test/cases/compile_errors/generic_instantiation_failure_in_generic_function_return_type.zig @@ -21,7 +21,7 @@ pub fn isPtrTo(comptime id: std.builtin.TypeId) TraitFn { pub fn isSingleItemPtr(comptime T: type) bool { if (comptime is(.pointer)(T)) { - return @typeInfo(T).pointer.size == .One; + return @typeInfo(T).pointer.size == .one; } return false; } diff --git a/test/cases/compile_errors/invalid_pointer_with_reify_type.zig b/test/cases/compile_errors/invalid_pointer_with_reify_type.zig index 16b96d5327b2..3238633b7e9f 100644 --- a/test/cases/compile_errors/invalid_pointer_with_reify_type.zig +++ b/test/cases/compile_errors/invalid_pointer_with_reify_type.zig @@ -1,6 +1,6 @@ export fn entry() void { _ = @Type(.{ .pointer = .{ - .size = .One, + .size = .one, .is_const = false, .is_volatile = false, .alignment = 1, @@ -12,7 +12,5 @@ export fn entry() void { } // error -// backend=stage2 -// target=native // // :2:9: error: sentinels are only allowed on slices and unknown-length pointers diff --git a/test/cases/compile_errors/non_scalar_sentinel.zig b/test/cases/compile_errors/non_scalar_sentinel.zig index 3684ac50b2b2..8eb4c4232a2c 100644 --- a/test/cases/compile_errors/non_scalar_sentinel.zig +++ b/test/cases/compile_errors/non_scalar_sentinel.zig @@ -16,7 +16,7 @@ comptime { } comptime { _ = @Type(.{ .pointer = .{ - .size = .Many, + .size = .slice, .is_const = false, .is_volatile = false, .alignment = @alignOf(S), @@ -28,7 +28,7 @@ comptime { } comptime { _ = @Type(.{ .pointer = .{ - .size = .Many, + .size = .many, .is_const = false, .is_volatile = false, .alignment = @alignOf(S), diff --git a/test/cases/compile_errors/reify_type_with_invalid_field_alignment.zig b/test/cases/compile_errors/reify_type_with_invalid_field_alignment.zig index 3dfb2ae1ff5d..84e5cc5c276f 100644 --- a/test/cases/compile_errors/reify_type_with_invalid_field_alignment.zig +++ b/test/cases/compile_errors/reify_type_with_invalid_field_alignment.zig @@ -29,7 +29,7 @@ comptime { comptime { _ = @Type(.{ .pointer = .{ - .size = .Many, + .size = .many, .is_const = true, .is_volatile = false, .alignment = 7, @@ -42,8 +42,6 @@ comptime { } // error -// backend=stage2 -// target=native // // :2:9: error: alignment value '3' is not a power of two or zero // :14:9: error: alignment value '5' is not a power of two or zero From b6abe1dbf7b5ad14ad1b0a011f109694fd5f36a8 Mon Sep 17 00:00:00 2001 From: mlugg Date: Thu, 16 Jan 2025 10:09:41 +0000 Subject: [PATCH 3/7] compiler: make it easier to apply breaking changes to `std.builtin` Documentation for this will be on the wiki shortly. Resolves: #21842 --- bootstrap.c | 1 + build.zig | 20 +++++++ src/Sema.zig | 69 ++++++++++-------------- src/Value.zig | 123 +++++++++++++++++++++++++++++++++++-------- src/Zcu.zig | 4 -- stage1/config.zig.in | 1 + 6 files changed, 151 insertions(+), 67 deletions(-) diff --git a/bootstrap.c b/bootstrap.c index e1684df19a13..a37834f46373 100644 --- a/bootstrap.c +++ b/bootstrap.c @@ -141,6 +141,7 @@ int main(int argc, char **argv) { "pub const skip_non_native = false;\n" "pub const force_gpa = false;\n" "pub const dev = .core;\n" + "pub const value_interpret_mode = .direct;\n" , zig_version); if (written < 100) panic("unable to write to config.zig file"); diff --git a/build.zig b/build.zig index dcc84509f9a8..a513a993998f 100644 --- a/build.zig +++ b/build.zig @@ -9,6 +9,7 @@ const fs = std.fs; const InstallDirectoryOptions = std.Build.InstallDirectoryOptions; const assert = std.debug.assert; const DevEnv = @import("src/dev.zig").Env; +const ValueInterpretMode = enum { direct, by_name }; const zig_version: std.SemanticVersion = .{ .major = 0, .minor = 14, .patch = 0 }; const stack_size = 46 * 1024 * 1024; @@ -177,6 +178,7 @@ pub fn build(b: *std.Build) !void { const strip = b.option(bool, "strip", "Omit debug information"); const valgrind = b.option(bool, "valgrind", "Enable valgrind integration"); const pie = b.option(bool, "pie", "Produce a Position Independent Executable"); + const value_interpret_mode = b.option(ValueInterpretMode, "value-interpret-mode", "How the compiler translates between 'std.builtin' types and its internal datastructures") orelse .direct; const value_tracing = b.option(bool, "value-tracing", "Enable extra state tracking to help troubleshoot bugs in the compiler (using the std.debug.Trace API)") orelse false; const mem_leak_frames: u32 = b.option(u32, "mem-leak-frames", "How many stack frames to print when a memory leak occurs. Tests get 2x this amount.") orelse blk: { @@ -234,6 +236,7 @@ pub fn build(b: *std.Build) !void { exe_options.addOption(bool, "llvm_has_xtensa", llvm_has_xtensa); exe_options.addOption(bool, "force_gpa", force_gpa); exe_options.addOption(DevEnv, "dev", b.option(DevEnv, "dev", "Build a compiler with a reduced feature set for development of specific features") orelse if (only_c) .bootstrap else .full); + exe_options.addOption(ValueInterpretMode, "value_interpret_mode", value_interpret_mode); if (link_libc) { exe.root_module.link_libc = true; @@ -620,6 +623,23 @@ fn addWasiUpdateStep(b: *std.Build, version: [:0]const u8) !void { exe_options.addOption(bool, "value_tracing", false); exe_options.addOption(DevEnv, "dev", .bootstrap); + // zig1 chooses to interpret values by name. The tradeoff is as follows: + // + // * We lose a small amount of performance. This is essentially irrelevant for zig1. + // + // * We lose the ability to perform trivial renames on certain `std.builtin` types without + // zig1.wasm updates. For instance, we cannot rename an enum from PascalCase fields to + // snake_case fields without an update. + // + // * We gain the ability to add and remove fields to and from `std.builtin` types without + // zig1.wasm updates. For instance, we can add a new tag to `CallingConvention` without + // an update. + // + // Because field renames only happen when we apply a breaking change to the language (which + // is becoming progressively rarer), but tags may be added to or removed from target-dependent + // types over time in response to new targets coming into use, we gain more than we lose here. + exe_options.addOption(ValueInterpretMode, "value_interpret_mode", .by_name); + const run_opt = b.addSystemCommand(&.{ "wasm-opt", "-Oz", diff --git a/src/Sema.zig b/src/Sema.zig index 12c860633ef8..42c8d329814a 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2713,8 +2713,18 @@ fn analyzeValueAsCallconv( src: LazySrcLoc, unresolved_val: Value, ) !std.builtin.CallingConvention { + return interpretBuiltinType(sema, block, src, unresolved_val, std.builtin.CallingConvention); +} + +fn interpretBuiltinType( + sema: *Sema, + block: *Block, + src: LazySrcLoc, + unresolved_val: Value, + comptime T: type, +) !T { const resolved_val = try sema.resolveLazyValue(unresolved_val); - return resolved_val.interpret(std.builtin.CallingConvention, sema.pt) catch |err| switch (err) { + return resolved_val.interpret(T, sema.pt) catch |err| switch (err) { error.OutOfMemory => |e| return e, error.UndefinedValue => return sema.failWithUseOfUndef(block, src), error.TypeMismatch => @panic("std.builtin is corrupt"), @@ -21536,19 +21546,8 @@ fn zirReify( .@"anyframe" => return sema.failWithUseOfAsync(block, src), .enum_literal => return .enum_literal_type, .int => { - const struct_type = ip.loadStructType(ip.typeOf(union_val.val)); - const signedness_val = try Value.fromInterned(union_val.val).fieldValue( - pt, - struct_type.nameIndex(ip, try ip.getOrPutString(gpa, pt.tid, "signedness", .no_embedded_nulls)).?, - ); - const bits_val = try Value.fromInterned(union_val.val).fieldValue( - pt, - struct_type.nameIndex(ip, try ip.getOrPutString(gpa, pt.tid, "bits", .no_embedded_nulls)).?, - ); - - const signedness = zcu.toEnum(std.builtin.Signedness, signedness_val); - const bits: u16 = @intCast(try bits_val.toUnsignedIntSema(pt)); - const ty = try pt.intType(signedness, bits); + const int = try sema.interpretBuiltinType(block, operand_src, .fromInterned(union_val.val), std.builtin.Type.Int); + const ty = try pt.intType(int.signedness, int.bits); return Air.internedToRef(ty.toIntern()); }, .vector => { @@ -21574,20 +21573,15 @@ fn zirReify( return Air.internedToRef(ty.toIntern()); }, .float => { - const struct_type = ip.loadStructType(ip.typeOf(union_val.val)); - const bits_val = try Value.fromInterned(union_val.val).fieldValue(pt, struct_type.nameIndex( - ip, - try ip.getOrPutString(gpa, pt.tid, "bits", .no_embedded_nulls), - ).?); + const float = try sema.interpretBuiltinType(block, operand_src, .fromInterned(union_val.val), std.builtin.Type.Float); - const bits: u16 = @intCast(try bits_val.toUnsignedIntSema(pt)); - const ty = switch (bits) { + const ty = switch (float.bits) { 16 => Type.f16, 32 => Type.f32, 64 => Type.f64, 80 => Type.f80, 128 => Type.f128, - else => return sema.fail(block, src, "{}-bit float unsupported", .{bits}), + else => return sema.fail(block, src, "{}-bit float unsupported", .{float.bits}), }; return Air.internedToRef(ty.toIntern()); }, @@ -21641,7 +21635,7 @@ fn zirReify( try elem_ty.resolveLayout(pt); } - const ptr_size = zcu.toEnum(std.builtin.Type.Pointer.Size, size_val); + const ptr_size = try sema.interpretBuiltinType(block, operand_src, size_val, std.builtin.Type.Pointer.Size); const actual_sentinel: InternPool.Index = s: { if (!sentinel_val.isNull(zcu)) { @@ -21691,7 +21685,7 @@ fn zirReify( .is_const = is_const_val.toBool(), .is_volatile = is_volatile_val.toBool(), .alignment = abi_align, - .address_space = zcu.toEnum(std.builtin.AddressSpace, address_space_val), + .address_space = try sema.interpretBuiltinType(block, operand_src, address_space_val, std.builtin.AddressSpace), .is_allowzero = is_allowzero_val.toBool(), }, }); @@ -21813,7 +21807,7 @@ fn zirReify( try ip.getOrPutString(gpa, pt.tid, "is_tuple", .no_embedded_nulls), ).?); - const layout = zcu.toEnum(std.builtin.Type.ContainerLayout, layout_val); + const layout = try sema.interpretBuiltinType(block, operand_src, layout_val, std.builtin.Type.ContainerLayout); // Decls if (try decls_val.sliceLen(pt) > 0) { @@ -21929,7 +21923,7 @@ fn zirReify( if (try decls_val.sliceLen(pt) > 0) { return sema.fail(block, src, "reified unions must have no decls", .{}); } - const layout = zcu.toEnum(std.builtin.Type.ContainerLayout, layout_val); + const layout = try sema.interpretBuiltinType(block, operand_src, layout_val, std.builtin.Type.ContainerLayout); const fields_arr = try sema.derefSliceAsArray(block, operand_src, fields_val, .{ .simple = .union_fields }); @@ -24456,7 +24450,7 @@ fn resolveExportOptions( const linkage_operand = try sema.fieldVal(block, src, options, try ip.getOrPutString(gpa, pt.tid, "linkage", .no_embedded_nulls), linkage_src); const linkage_val = try sema.resolveConstDefinedValue(block, linkage_src, linkage_operand, .{ .simple = .export_options }); - const linkage = zcu.toEnum(std.builtin.GlobalLinkage, linkage_val); + const linkage = try sema.interpretBuiltinType(block, linkage_src, linkage_val, std.builtin.GlobalLinkage); const section_operand = try sema.fieldVal(block, src, options, try ip.getOrPutString(gpa, pt.tid, "section", .no_embedded_nulls), section_src); const section_opt_val = try sema.resolveConstDefinedValue(block, section_src, section_operand, .{ .simple = .export_options }); @@ -24467,7 +24461,7 @@ fn resolveExportOptions( const visibility_operand = try sema.fieldVal(block, src, options, try ip.getOrPutString(gpa, pt.tid, "visibility", .no_embedded_nulls), visibility_src); const visibility_val = try sema.resolveConstDefinedValue(block, visibility_src, visibility_operand, .{ .simple = .export_options }); - const visibility = zcu.toEnum(std.builtin.SymbolVisibility, visibility_val); + const visibility = try sema.interpretBuiltinType(block, visibility_src, visibility_val, std.builtin.SymbolVisibility); if (name.len < 1) { return sema.fail(block, name_src, "exported symbol name cannot be empty", .{}); @@ -24495,12 +24489,11 @@ fn resolveBuiltinEnum( comptime name: Zcu.BuiltinDecl, reason: ComptimeReason, ) CompileError!@field(std.builtin, @tagName(name)) { - const pt = sema.pt; const ty = try sema.getBuiltinType(src, name); const air_ref = try sema.resolveInst(zir_ref); const coerced = try sema.coerce(block, ty, air_ref, src); const val = try sema.resolveConstDefinedValue(block, src, coerced, reason); - return pt.zcu.toEnum(@field(std.builtin, @tagName(name)), val); + return sema.interpretBuiltinType(block, src, val, @field(std.builtin, @tagName(name))); } fn resolveAtomicOrder( @@ -25293,7 +25286,7 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError const air_ref = try sema.resolveInst(extra.modifier); const modifier_ref = try sema.coerce(block, modifier_ty, air_ref, modifier_src); const modifier_val = try sema.resolveConstDefinedValue(block, modifier_src, modifier_ref, .{ .simple = .call_modifier }); - var modifier = zcu.toEnum(std.builtin.CallModifier, modifier_val); + var modifier = try sema.interpretBuiltinType(block, modifier_src, modifier_val, std.builtin.CallModifier); switch (modifier) { // These can be upgraded to comptime or nosuspend calls. .auto, .never_tail, .no_async => { @@ -26468,9 +26461,9 @@ fn resolvePrefetchOptions( const cache_val = try sema.resolveConstDefinedValue(block, cache_src, cache, .{ .simple = .prefetch_options }); return std.builtin.PrefetchOptions{ - .rw = zcu.toEnum(std.builtin.PrefetchOptions.Rw, rw_val), + .rw = try sema.interpretBuiltinType(block, rw_src, rw_val, std.builtin.PrefetchOptions.Rw), .locality = @intCast(try locality_val.toUnsignedIntSema(pt)), - .cache = zcu.toEnum(std.builtin.PrefetchOptions.Cache, cache_val), + .cache = try sema.interpretBuiltinType(block, cache_src, cache_val, std.builtin.PrefetchOptions.Cache), }; } @@ -26536,7 +26529,7 @@ fn resolveExternOptions( const linkage_ref = try sema.fieldVal(block, src, options, try ip.getOrPutString(gpa, pt.tid, "linkage", .no_embedded_nulls), linkage_src); const linkage_val = try sema.resolveConstDefinedValue(block, linkage_src, linkage_ref, .{ .simple = .extern_options }); - const linkage = zcu.toEnum(std.builtin.GlobalLinkage, linkage_val); + const linkage = try sema.interpretBuiltinType(block, linkage_src, linkage_val, std.builtin.GlobalLinkage); const is_thread_local = try sema.fieldVal(block, src, options, try ip.getOrPutString(gpa, pt.tid, "is_thread_local", .no_embedded_nulls), thread_local_src); const is_thread_local_val = try sema.resolveConstDefinedValue(block, thread_local_src, is_thread_local, .{ .simple = .extern_options }); @@ -26770,9 +26763,6 @@ fn zirInplaceArithResultTy(sema: *Sema, extended: Zir.Inst.Extended.InstData) Co } fn zirBranchHint(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!void { - const pt = sema.pt; - const zcu = pt.zcu; - const extra = sema.code.extraData(Zir.Inst.UnNode, extended.operand).data; const uncoerced_hint = try sema.resolveInst(extra.operand); const operand_src = block.builtinCallArgSrc(extra.node, 0); @@ -26784,7 +26774,7 @@ fn zirBranchHint(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstDat // We only apply the first hint in a branch. // This allows user-provided hints to override implicit cold hints. if (sema.branch_hint == null) { - sema.branch_hint = zcu.toEnum(std.builtin.BranchHint, hint_val); + sema.branch_hint = try sema.interpretBuiltinType(block, operand_src, hint_val, std.builtin.BranchHint); } } @@ -37136,11 +37126,10 @@ pub fn analyzeAsAddressSpace( ctx: AddressSpaceContext, ) !std.builtin.AddressSpace { const pt = sema.pt; - const zcu = pt.zcu; const addrspace_ty = try sema.getBuiltinType(src, .AddressSpace); const coerced = try sema.coerce(block, addrspace_ty, air_ref, src); const addrspace_val = try sema.resolveConstDefinedValue(block, src, coerced, .{ .simple = .@"addrspace" }); - const address_space = zcu.toEnum(std.builtin.AddressSpace, addrspace_val); + const address_space = try sema.interpretBuiltinType(block, src, addrspace_val, std.builtin.AddressSpace); const target = pt.zcu.getTarget(); const arch = target.cpu.arch; diff --git a/src/Value.zig b/src/Value.zig index 5c0cc2de04a2..004d50fc93da 100644 --- a/src/Value.zig +++ b/src/Value.zig @@ -1,5 +1,6 @@ const std = @import("std"); const builtin = @import("builtin"); +const build_options = @import("build_options"); const Type = @import("Type.zig"); const assert = std.debug.assert; const BigIntConst = std.math.big.int.Const; @@ -4531,6 +4532,20 @@ pub fn resolveLazy( } } +const InterpretMode = enum { + /// In this mode, types are assumed to match what the compiler was built with in terms of field + /// order, field types, etc. This improves compiler performance. However, it means that certain + /// modifications to `std.builtin` will result in compiler crashes. + direct, + /// In this mode, various details of the type are allowed to differ from what the compiler was built + /// with. Fields are matched by name rather than index; added struct fields are ignored, and removed + /// struct fields use their default value if one exists. This is slower than `.direct`, but permits + /// making certain changes to `std.builtin` (in particular reordering/adding/removing fields), so it + /// is useful when applying breaking changes. + by_name, +}; +const interpret_mode: InterpretMode = @field(InterpretMode, @tagName(build_options.value_interpret_mode)); + /// Given a `Value` representing a comptime-known value of type `T`, unwrap it into an actual `T` known to the compiler. /// This is useful for accessing `std.builtin` structures received from comptime logic. /// `val` must be fully resolved. @@ -4583,11 +4598,20 @@ pub fn interpret(val: Value, comptime T: type, pt: Zcu.PerThread) error{ OutOfMe else null, - .@"enum" => zcu.toEnum(T, val), + .@"enum" => switch (interpret_mode) { + .direct => { + const int = val.getUnsignedInt(zcu) orelse return error.TypeMismatch; + return std.meta.intToEnum(T, int) catch error.TypeMismatch; + }, + .by_name => { + const field_index = ty.enumTagFieldIndex(val, zcu) orelse return error.TypeMismatch; + const field_name = ty.enumFieldName(field_index, zcu); + return std.meta.stringToEnum(T, field_name.toSlice(ip)) orelse error.TypeMismatch; + }, + }, .@"union" => |@"union"| { - const union_obj = zcu.typeToUnion(ty) orelse return error.TypeMismatch; - if (union_obj.field_types.len != @"union".fields.len) return error.TypeMismatch; + // No need to handle `interpret_mode`, because the `.@"enum"` handling already deals with it. const tag_val = val.unionTag(zcu) orelse return error.TypeMismatch; const tag = try tag_val.interpret(@"union".tag_type.?, pt); return switch (tag) { @@ -4599,14 +4623,31 @@ pub fn interpret(val: Value, comptime T: type, pt: Zcu.PerThread) error{ OutOfMe }; }, - .@"struct" => |@"struct"| { - if (ty.structFieldCount(zcu) != @"struct".fields.len) return error.TypeMismatch; - var result: T = undefined; - inline for (@"struct".fields, 0..) |field, field_idx| { - const field_val = try val.fieldValue(pt, field_idx); - @field(result, field.name) = try field_val.interpret(field.type, pt); - } - return result; + .@"struct" => |@"struct"| switch (interpret_mode) { + .direct => { + if (ty.structFieldCount(zcu) != @"struct".fields.len) return error.TypeMismatch; + var result: T = undefined; + inline for (@"struct".fields, 0..) |field, field_idx| { + const field_val = try val.fieldValue(pt, field_idx); + @field(result, field.name) = try field_val.interpret(field.type, pt); + } + return result; + }, + .by_name => { + const struct_obj = zcu.typeToStruct(ty) orelse return error.TypeMismatch; + var result: T = undefined; + inline for (@"struct".fields) |field| { + const field_name_ip = try ip.getOrPutString(zcu.gpa, pt.tid, field.name, .no_embedded_nulls); + @field(result, field.name) = if (struct_obj.nameIndex(ip, field_name_ip)) |field_idx| f: { + const field_val = try val.fieldValue(pt, field_idx); + break :f try field_val.interpret(field.type, pt); + } else if (field.default_value) |ptr| f: { + const typed_ptr: *const field.type = @ptrCast(@alignCast(ptr)); + break :f typed_ptr.*; + } else return error.TypeMismatch; + } + return result; + }, }, }; } @@ -4618,6 +4659,7 @@ pub fn uninterpret(val: anytype, ty: Type, pt: Zcu.PerThread) error{ OutOfMemory const T = @TypeOf(val); const zcu = pt.zcu; + const ip = &zcu.intern_pool; if (ty.zigTypeTag(zcu) != @typeInfo(T)) return error.TypeMismatch; return switch (@typeInfo(T)) { @@ -4657,9 +4699,17 @@ pub fn uninterpret(val: anytype, ty: Type, pt: Zcu.PerThread) error{ OutOfMemory else try pt.nullValue(ty), - .@"enum" => try pt.enumValue(ty, (try uninterpret(@intFromEnum(val), ty.intTagType(zcu), pt)).toIntern()), + .@"enum" => switch (interpret_mode) { + .direct => try pt.enumValue(ty, (try uninterpret(@intFromEnum(val), ty.intTagType(zcu), pt)).toIntern()), + .by_name => { + const field_name_ip = try ip.getOrPutString(zcu.gpa, pt.tid, @tagName(val), .no_embedded_nulls); + const field_idx = ty.enumFieldIndex(field_name_ip, zcu) orelse return error.TypeMismatch; + return pt.enumValueFieldIndex(ty, field_idx); + }, + }, .@"union" => |@"union"| { + // No need to handle `interpret_mode`, because the `.@"enum"` handling already deals with it. const tag: @"union".tag_type.? = val; const tag_val = try uninterpret(tag, ty.unionTagType(zcu).?, pt); const field_ty = ty.unionFieldType(tag_val, zcu) orelse return error.TypeMismatch; @@ -4672,17 +4722,44 @@ pub fn uninterpret(val: anytype, ty: Type, pt: Zcu.PerThread) error{ OutOfMemory }; }, - .@"struct" => |@"struct"| { - if (ty.structFieldCount(zcu) != @"struct".fields.len) return error.TypeMismatch; - var field_vals: [@"struct".fields.len]InternPool.Index = undefined; - inline for (&field_vals, @"struct".fields, 0..) |*field_val, field, field_idx| { - const field_ty = ty.fieldType(field_idx, zcu); - field_val.* = (try uninterpret(@field(val, field.name), field_ty, pt)).toIntern(); - } - return .fromInterned(try pt.intern(.{ .aggregate = .{ - .ty = ty.toIntern(), - .storage = .{ .elems = &field_vals }, - } })); + .@"struct" => |@"struct"| switch (interpret_mode) { + .direct => { + if (ty.structFieldCount(zcu) != @"struct".fields.len) return error.TypeMismatch; + var field_vals: [@"struct".fields.len]InternPool.Index = undefined; + inline for (&field_vals, @"struct".fields, 0..) |*field_val, field, field_idx| { + const field_ty = ty.fieldType(field_idx, zcu); + field_val.* = (try uninterpret(@field(val, field.name), field_ty, pt)).toIntern(); + } + return .fromInterned(try pt.intern(.{ .aggregate = .{ + .ty = ty.toIntern(), + .storage = .{ .elems = &field_vals }, + } })); + }, + .by_name => { + const struct_obj = zcu.typeToStruct(ty) orelse return error.TypeMismatch; + const want_fields_len = struct_obj.field_types.len; + const field_vals = try zcu.gpa.alloc(InternPool.Index, want_fields_len); + defer zcu.gpa.free(field_vals); + @memset(field_vals, .none); + inline for (@"struct".fields) |field| { + const field_name_ip = try ip.getOrPutString(zcu.gpa, pt.tid, field.name, .no_embedded_nulls); + if (struct_obj.nameIndex(ip, field_name_ip)) |field_idx| { + const field_ty = ty.fieldType(field_idx, zcu); + field_vals[field_idx] = (try uninterpret(@field(val, field.name), field_ty, pt)).toIntern(); + } + } + for (field_vals, 0..) |*field_val, field_idx| { + if (field_val.* == .none) { + const default_init = struct_obj.field_inits.get(ip)[field_idx]; + if (default_init == .none) return error.TypeMismatch; + field_val.* = default_init; + } + } + return .fromInterned(try pt.intern(.{ .aggregate = .{ + .ty = ty.toIntern(), + .storage = .{ .elems = field_vals }, + } })); + }, }, }; } diff --git a/src/Zcu.zig b/src/Zcu.zig index 1defb8c2d727..54f4349a6eaa 100644 --- a/src/Zcu.zig +++ b/src/Zcu.zig @@ -3486,10 +3486,6 @@ pub fn funcInfo(zcu: *const Zcu, func_index: InternPool.Index) InternPool.Key.Fu return zcu.intern_pool.toFunc(func_index); } -pub fn toEnum(zcu: *const Zcu, comptime E: type, val: Value) E { - return zcu.intern_pool.toEnum(E, val.toIntern()); -} - pub const UnionLayout = struct { abi_size: u64, abi_align: Alignment, diff --git a/stage1/config.zig.in b/stage1/config.zig.in index 500e089fa8e4..47d4b4e85feb 100644 --- a/stage1/config.zig.in +++ b/stage1/config.zig.in @@ -13,3 +13,4 @@ pub const value_tracing = false; pub const skip_non_native = false; pub const force_gpa = false; pub const dev = .core; +pub const value_interpret_mode = .direct; From 726c94d5f169d1d9f769f970aa3e53ef03342dc4 Mon Sep 17 00:00:00 2001 From: mlugg Date: Wed, 15 Jan 2025 16:57:43 +0000 Subject: [PATCH 4/7] Sema: prepare for `sentinel` -> `sentinel_ptr` field rename The commit 2 after this will explain this diff. --- src/Sema.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 42c8d329814a..8d8f4590959a 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -21617,7 +21617,7 @@ fn zirReify( ).?); const sentinel_val = try Value.fromInterned(union_val.val).fieldValue(pt, struct_type.nameIndex( ip, - try ip.getOrPutString(gpa, pt.tid, "sentinel", .no_embedded_nulls), + try ip.getOrPutString(gpa, pt.tid, "sentinel_ptr", .no_embedded_nulls), ).?); if (!try sema.intFitsInType(alignment_val, Type.u32, null)) { @@ -21703,7 +21703,7 @@ fn zirReify( ).?); const sentinel_val = try Value.fromInterned(union_val.val).fieldValue(pt, struct_type.nameIndex( ip, - try ip.getOrPutString(gpa, pt.tid, "sentinel", .no_embedded_nulls), + try ip.getOrPutString(gpa, pt.tid, "sentinel_ptr", .no_embedded_nulls), ).?); const len = try len_val.toUnsignedIntSema(pt); From 0cc9d68b77b31c6502da80ce7e6dabaf9316ca48 Mon Sep 17 00:00:00 2001 From: mlugg Date: Wed, 15 Jan 2025 17:01:22 +0000 Subject: [PATCH 5/7] stage1: update zig1.wasm Implementing the changes from the prior commit, to prepare for the following commit. This also means that zig1 now uses the new value interpret mode, so that adding and removing fields from `std.builtin` types is easier. Signed-off-by: mlugg --- stage1/zig.h | 447 ++++++++++++++++++++++++++++++++--------------- stage1/zig1.wasm | Bin 2812688 -> 2917800 bytes 2 files changed, 304 insertions(+), 143 deletions(-) diff --git a/stage1/zig.h b/stage1/zig.h index 248bb8641cc7..e636785f1e0a 100644 --- a/stage1/zig.h +++ b/stage1/zig.h @@ -1,33 +1,143 @@ #undef linux -#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ -#define __STDC_WANT_IEC_60559_TYPES_EXT__ -#endif -#include -#include #include #include -#include - -#if _MSC_VER -#include -#elif defined(__i386__) || defined(__x86_64__) -#include -#endif -#if !defined(__cplusplus) && __STDC_VERSION__ <= 201710L -#if __STDC_VERSION__ >= 199901L -#include +#if defined(_MSC_VER) +#define zig_msvc +#elif defined(__clang__) +#define zig_clang +#define zig_gnuc +#elif defined(__GNUC__) +#define zig_gnuc +#elif defined(__IBMC__) +#define zig_xlc +#elif defined(__TINYC__) +#define zig_tinyc +#elif defined(__slimcc__) +#define zig_slimcc +#endif + +#if defined(__aarch64__) || (defined(zig_msvc) && defined(_M_ARM64)) +#define zig_aarch64 +#elif defined(__thumb__) || (defined(zig_msvc) && defined(_M_ARM)) +#define zig_thumb +#define zig_arm +#elif defined(__arm__) +#define zig_arm +#elif defined(__hexagon__) +#define zig_hexagon +#elif defined(__loongarch32) +#define zig_loongarch32 +#define zig_loongarch +#elif defined(__loongarch64) +#define zig_loongarch64 +#define zig_loongarch +#elif defined(__mips64) +#define zig_mips64 +#define zig_mips +#elif defined(__mips__) +#define zig_mips32 +#define zig_mips +#elif defined(__powerpc64__) +#define zig_powerpc64 +#define zig_powerpc +#elif defined(__powerpc__) +#define zig_powerpc32 +#define zig_powerpc +#elif defined(__riscv) && __riscv_xlen == 32 +#define zig_riscv32 +#define zig_riscv +#elif defined(__riscv) && __riscv_xlen == 64 +#define zig_riscv64 +#define zig_riscv +#elif defined(__s390x__) +#define zig_s390x +#elif defined(__sparc__) && defined(__arch64__) +#define zig_sparc64 +#define zig_sparc +#elif defined(__sparc__) +#define zig_sparc32 +#define zig_sparc +#elif defined(__wasm32__) +#define zig_wasm32 +#define zig_wasm +#elif defined(__wasm64__) +#define zig_wasm64 +#define zig_wasm +#elif defined(__i386__) || (defined(zig_msvc) && defined(_M_IX86)) +#define zig_x86_32 +#define zig_x86 +#elif defined (__x86_64__) || (defined(zig_msvc) && defined(_M_X64)) +#define zig_x86_64 +#define zig_x86 +#endif + +#if defined(zig_msvc) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define zig_little_endian 1 +#define zig_big_endian 0 #else -typedef char bool; -#define false 0 -#define true 1 +#define zig_little_endian 0 +#define zig_big_endian 1 #endif + +#if defined(_AIX) +#define zig_aix +#elif defined(__MACH__) +#define zig_darwin +#elif defined(__DragonFly__) +#define zig_dragonfly +#define zig_bsd +#elif defined(__EMSCRIPTEN__) +#define zig_emscripten +#elif defined(__FreeBSD__) +#define zig_freebsd +#define zig_bsd +#elif defined(__Fuchsia__) +#define zig_fuchsia +#elif defined(__HAIKU__) +#define zig_haiku +#elif defined(__gnu_hurd__) +#define zig_hurd +#elif defined(__linux__) +#define zig_linux +#elif defined(__NetBSD__) +#define zig_netbsd +#define zig_bsd +#elif defined(__OpenBSD__) +#define zig_openbsd +#define zig_bsd +#elif defined(__SVR4) +#define zig_solaris +#elif defined(__wasi__) +#define zig_wasi +#elif defined(_WIN32) +#define zig_windows +#elif defined(__MVS__) +#define zig_zos +#endif + +#if defined(zig_windows) +#define zig_coff +#elif defined(__ELF__) +#define zig_elf +#elif defined(zig_zos) +#define zig_goff +#elif defined(zig_darwin) +#define zig_macho +#elif defined(zig_aix) +#define zig_xcoff #endif #define zig_concat(lhs, rhs) lhs##rhs #define zig_expand_concat(lhs, rhs) zig_concat(lhs, rhs) +#if defined(__has_include) +#define zig_has_include(include) __has_include(include) +#else +#define zig_has_include(include) 0 +#endif + #if defined(__has_builtin) #define zig_has_builtin(builtin) __has_builtin(__builtin_##builtin) #else @@ -41,37 +151,19 @@ typedef char bool; #define zig_has_attribute(attribute) 0 #endif -#if __LITTLE_ENDIAN__ || _MSC_VER -#define zig_little_endian 1 -#define zig_big_endian 0 -#else -#define zig_little_endian 0 -#define zig_big_endian 1 -#endif - -#if __STDC_VERSION__ >= 201112L +#if __STDC_VERSION__ >= 202311L +#define zig_threadlocal thread_local +#elif __STDC_VERSION__ >= 201112L #define zig_threadlocal _Thread_local -#elif defined(__GNUC__) +#elif defined(zig_gnuc) || defined(zig_slimcc) #define zig_threadlocal __thread -#elif _MSC_VER +#elif defined(zig_msvc) #define zig_threadlocal __declspec(thread) #else #define zig_threadlocal zig_threadlocal_unavailable #endif -#if defined(__clang__) -#define zig_clang -#elif defined(__GNUC__) -#define zig_gnuc -#endif - -#if defined(zig_gnuc) && (defined(__i386__) || defined(__x86_64__)) -#define zig_f128_has_miscompilations 1 -#else -#define zig_f128_has_miscompilations 0 -#endif - -#if _MSC_VER +#if defined(zig_msvc) #define zig_const_arr #define zig_callconv(c) __##c #else @@ -82,7 +174,7 @@ typedef char bool; #if zig_has_attribute(naked) || defined(zig_gnuc) #define zig_naked_decl __attribute__((naked)) #define zig_naked __attribute__((naked)) -#elif defined(_MSC_VER) +#elif defined(zig_msvc) #define zig_naked_decl #define zig_naked __declspec(naked) #else @@ -104,7 +196,7 @@ typedef char bool; #if zig_has_attribute(noinline) #define zig_never_inline __attribute__((noinline)) zig_maybe_flatten -#elif defined(_MSC_VER) +#elif defined(zig_msvc) #define zig_never_inline __declspec(noinline) zig_maybe_flatten #else #define zig_never_inline zig_never_inline_unavailable @@ -124,46 +216,48 @@ typedef char bool; #if __STDC_VERSION__ >= 199901L #define zig_restrict restrict -#elif defined(__GNUC__) +#elif defined(zig_gnuc) || defined(zig_tinyc) #define zig_restrict __restrict #else #define zig_restrict #endif -#if zig_has_attribute(aligned) +#if zig_has_attribute(aligned) || defined(zig_tinyc) #define zig_under_align(alignment) __attribute__((aligned(alignment))) -#elif _MSC_VER +#elif defined(zig_msvc) #define zig_under_align(alignment) __declspec(align(alignment)) #else #define zig_under_align zig_align_unavailable #endif -#if __STDC_VERSION__ >= 201112L +#if __STDC_VERSION__ >= 202311L +#define zig_align(alignment) alignas(alignment) +#elif __STDC_VERSION__ >= 201112L #define zig_align(alignment) _Alignas(alignment) #else #define zig_align(alignment) zig_under_align(alignment) #endif -#if zig_has_attribute(aligned) +#if zig_has_attribute(aligned) || defined(zig_tinyc) #define zig_align_fn(alignment) __attribute__((aligned(alignment))) -#elif _MSC_VER +#elif defined(zig_msvc) #define zig_align_fn(alignment) #else #define zig_align_fn zig_align_fn_unavailable #endif -#if zig_has_attribute(packed) +#if zig_has_attribute(packed) || defined(zig_tinyc) #define zig_packed(definition) __attribute__((packed)) definition -#elif _MSC_VER +#elif defined(zig_msvc) #define zig_packed(definition) __pragma(pack(1)) definition __pragma(pack()) #else #define zig_packed(definition) zig_packed_unavailable #endif -#if zig_has_attribute(section) +#if zig_has_attribute(section) || defined(zig_tinyc) #define zig_linksection(name) __attribute__((section(name))) #define zig_linksection_fn zig_linksection -#elif _MSC_VER +#elif defined(zig_msvc) #define zig_linksection(name) __pragma(section(name, read, write)) __declspec(allocate(name)) #define zig_linksection_fn(name) __pragma(section(name, read, execute)) __declspec(code_seg(name)) #else @@ -171,8 +265,10 @@ typedef char bool; #define zig_linksection_fn zig_linksection #endif -#if zig_has_builtin(unreachable) || defined(zig_gnuc) +#if zig_has_builtin(unreachable) || defined(zig_gnuc) || defined(zig_tinyc) #define zig_unreachable() __builtin_unreachable() +#elif defined(zig_msvc) +#define zig_unreachable() __assume(0) #else #define zig_unreachable() #endif @@ -183,23 +279,23 @@ typedef char bool; #define zig_extern extern #endif -#if _MSC_VER -#if _M_X64 +#if defined(zig_msvc) +#if defined(zig_x86_64) #define zig_mangle_c(symbol) symbol -#else /*_M_X64 */ +#else /* zig_x86_64 */ #define zig_mangle_c(symbol) "_" symbol -#endif /*_M_X64 */ -#else /* _MSC_VER */ -#if __APPLE__ +#endif /* zig_x86_64 */ +#else /* zig_msvc */ +#if defined(zig_macho) #define zig_mangle_c(symbol) "_" symbol -#else /* __APPLE__ */ +#else /* zig_macho */ #define zig_mangle_c(symbol) symbol -#endif /* __APPLE__ */ -#endif /* _MSC_VER */ +#endif /* zig_macho */ +#endif /* zig_msvc */ -#if zig_has_attribute(alias) && !__APPLE__ +#if (zig_has_attribute(alias) || defined(zig_tinyc)) && !defined(zig_macho) #define zig_export(symbol, name) __attribute__((alias(symbol))) -#elif _MSC_VER +#elif defined(zig_msvc) #define zig_export(symbol, name) ; \ __pragma(comment(linker, "/alternatename:" zig_mangle_c(name) "=" zig_mangle_c(symbol))) #else @@ -209,24 +305,24 @@ typedef char bool; #define zig_mangled_tentative zig_mangled #define zig_mangled_final zig_mangled -#if _MSC_VER +#if defined(zig_msvc) #define zig_mangled(mangled, unmangled) ; \ zig_export(#mangled, unmangled) #define zig_mangled_export(mangled, unmangled, symbol) \ zig_export(unmangled, #mangled) \ zig_export(symbol, unmangled) -#else /* _MSC_VER */ +#else /* zig_msvc */ #define zig_mangled(mangled, unmangled) __asm(zig_mangle_c(unmangled)) #define zig_mangled_export(mangled, unmangled, symbol) \ zig_mangled_final(mangled, unmangled) \ zig_export(symbol, unmangled) -#endif /* _MSC_VER */ +#endif /* zig_msvc */ -#if _MSC_VER +#if defined(zig_msvc) #define zig_import(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type fn_name sig_args;\ __pragma(comment(linker, "/alternatename:" zig_mangle_c(#fn_name) "=" zig_mangle_c(#libc_name))); #define zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args) zig_import(Type, fn_name, sig_args, call_args) -#else /* _MSC_VER */ +#else /* zig_msvc */ #define zig_import(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type fn_name sig_args __asm(zig_mangle_c(#libc_name)); #define zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args) zig_extern Type libc_name sig_args; \ static inline Type fn_name sig_args { return libc_name call_args; } @@ -235,10 +331,10 @@ typedef char bool; #define zig_expand_import_0(Type, fn_name, libc_name, sig_args, call_args) zig_import(Type, fn_name, libc_name, sig_args, call_args) #define zig_expand_import_1(Type, fn_name, libc_name, sig_args, call_args) zig_import_builtin(Type, fn_name, libc_name, sig_args, call_args) -#if zig_has_attribute(weak) || defined(zig_gnuc) +#if zig_has_attribute(weak) || defined(zig_gnuc) || defined(zig_tinyc) #define zig_weak_linkage __attribute__((weak)) #define zig_weak_linkage_fn __attribute__((weak)) -#elif _MSC_VER +#elif defined(zig_msvc) #define zig_weak_linkage __declspec(selectany) #define zig_weak_linkage_fn #else @@ -246,68 +342,94 @@ typedef char bool; #define zig_weak_linkage_fn zig_weak_linkage_unavailable #endif +#if defined(zig_gnuc) || defined(zig_tinyc) || defined(zig_slimcc) +#define zig_gnuc_asm +#endif + #if zig_has_builtin(trap) #define zig_trap() __builtin_trap() -#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) +#elif defined(zig_msvc) + +#if defined(zig_x86) #define zig_trap() __ud2() -#elif defined(_MSC_VER) +#else #define zig_trap() __fastfail(7) -#elif defined(__thumb__) +#endif + +#elif defined(zig_gnuc_asm) + +#if defined(zig_thumb) #define zig_trap() __asm__ volatile("udf #0xfe") -#elif defined(__arm__) || defined(__aarch64__) +#elif defined(zig_arm) || defined(zig_aarch64) #define zig_trap() __asm__ volatile("udf #0xfdee") -#elif defined(__loongarch__) || defined(__powerpc__) +#elif defined(zig_hexagon) +#define zig_trap() __asm__ volatile("r27:26 = memd(#0xbadc0fee)") +#elif defined(zig_loongarch) || defined(zig_powerpc) #define zig_trap() __asm__ volatile(".word 0x0") -#elif defined(__mips__) +#elif defined(zig_mips) #define zig_trap() __asm__ volatile(".word 0x3d") -#elif defined(__riscv) +#elif defined(zig_riscv) #define zig_trap() __asm__ volatile("unimp") -#elif defined(__s390__) +#elif defined(zig_s390x) #define zig_trap() __asm__ volatile("j 0x2") -#elif defined(__sparc__) +#elif defined(zig_sparc) #define zig_trap() __asm__ volatile("illtrap") -#elif defined(__i386__) || defined(__x86_64__) +#elif defined(zig_x86) #define zig_trap() __asm__ volatile("ud2") #else #define zig_trap() zig_trap_unavailable #endif +#else +#define zig_trap() zig_trap_unavailable +#endif + #if zig_has_builtin(debugtrap) #define zig_breakpoint() __builtin_debugtrap() -#elif defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) +#elif defined(zig_msvc) #define zig_breakpoint() __debugbreak() -#elif defined(__arm__) +#elif defined(zig_gnuc_asm) + +#if defined(zig_arm) #define zig_breakpoint() __asm__ volatile("bkpt #0x0") -#elif defined(__aarch64__) +#elif defined(zig_aarch64) #define zig_breakpoint() __asm__ volatile("brk #0xf000") -#elif defined(__loongarch__) +#elif defined(zig_hexagon) +#define zig_breakpoint() __asm__ volatile("brkpt") +#elif defined(zig_loongarch) #define zig_breakpoint() __asm__ volatile("break 0x0") -#elif defined(__mips__) +#elif defined(zig_mips) #define zig_breakpoint() __asm__ volatile("break") -#elif defined(__powerpc__) +#elif defined(zig_powerpc) #define zig_breakpoint() __asm__ volatile("trap") -#elif defined(__riscv) +#elif defined(zig_riscv) #define zig_breakpoint() __asm__ volatile("ebreak") -#elif defined(__s390__) +#elif defined(zig_s390x) #define zig_breakpoint() __asm__ volatile("j 0x6") -#elif defined(__sparc__) +#elif defined(zig_sparc) #define zig_breakpoint() __asm__ volatile("ta 0x1") -#elif defined(__i386__) || defined(__x86_64__) +#elif defined(zig_x86) #define zig_breakpoint() __asm__ volatile("int $0x3") #else #define zig_breakpoint() zig_breakpoint_unavailable #endif -#if zig_has_builtin(return_address) || defined(zig_gnuc) +#else +#define zig_breakpoint() zig_breakpoint_unavailable +#endif + +#if zig_has_builtin(return_address) || defined(zig_gnuc) || defined(zig_tinyc) #define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0)) -#elif defined(_MSC_VER) +#elif defined(zig_msvc) #define zig_return_address() _ReturnAddress() #else #define zig_return_address() 0 #endif -#if zig_has_builtin(frame_address) || defined(zig_gnuc) +#if zig_has_builtin(frame_address) || defined(zig_gnuc) || defined(zig_tinyc) #define zig_frame_address() __builtin_frame_address(0) +#elif defined(zig_msvc) +#define zig_frame_address() _AddressOfReturnAddress() #else #define zig_frame_address() 0 #endif @@ -326,18 +448,18 @@ typedef char bool; #define zig_wasm_memory_grow(index, delta) zig_unimplemented() #endif -#if __STDC_VERSION__ >= 201112L +#if __STDC_VERSION__ >= 202311L +#define zig_noreturn [[noreturn]] +#elif __STDC_VERSION__ >= 201112L #define zig_noreturn _Noreturn -#elif zig_has_attribute(noreturn) || defined(zig_gnuc) +#elif zig_has_attribute(noreturn) || defined(zig_gnuc) || defined(zig_tinyc) #define zig_noreturn __attribute__((noreturn)) -#elif _MSC_VER +#elif defined(zig_msvc) #define zig_noreturn __declspec(noreturn) #else #define zig_noreturn #endif -#define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T)) - #define zig_compiler_rt_abbrev_uint32_t si #define zig_compiler_rt_abbrev_int32_t si #define zig_compiler_rt_abbrev_uint64_t di @@ -353,12 +475,25 @@ typedef char bool; zig_extern void *memcpy (void *zig_restrict, void const *zig_restrict, size_t); zig_extern void *memset (void *, int, size_t); -/* ===================== 8/16/32/64-bit Integer Support ===================== */ +/* ================ Bool and 8/16/32/64-bit Integer Support ================= */ -#if __STDC_VERSION__ >= 199901L || _MSC_VER -#include +#include + +#define zig_bitSizeOf(T) (CHAR_BIT * sizeof(T)) + +#if __STDC_VERSION__ >= 202311L +/* bool, true, and false are provided by the language. */ +#elif __STDC_VERSION__ >= 199901L || zig_has_include() +#include #else +typedef char bool; +#define false 0 +#define true 1 +#endif +#if __STDC_VERSION__ >= 199901L || defined(zig_msvc) || zig_has_include() +#include +#else #if SCHAR_MIN == ~0x7F && SCHAR_MAX == 0x7F && UCHAR_MAX == 0xFF typedef unsigned char uint8_t; typedef signed char int8_t; @@ -1132,7 +1267,7 @@ static inline int64_t zig_bit_reverse_i64(int64_t val, uint8_t bits) { static inline uint8_t zig_popcount_i##w(int##w##_t val, uint8_t bits) { \ return zig_popcount_u##w((uint##w##_t)val, bits); \ } -#if zig_has_builtin(popcount) || defined(zig_gnuc) +#if zig_has_builtin(popcount) || defined(zig_gnuc) || defined(zig_tinyc) #define zig_builtin_popcount(w) \ static inline uint8_t zig_popcount_u##w(uint##w##_t val, uint8_t bits) { \ (void)bits; \ @@ -1161,7 +1296,7 @@ zig_builtin_popcount(64) static inline uint8_t zig_ctz_i##w(int##w##_t val, uint8_t bits) { \ return zig_ctz_u##w((uint##w##_t)val, bits); \ } -#if zig_has_builtin(ctz) || defined(zig_gnuc) +#if zig_has_builtin(ctz) || defined(zig_gnuc) || defined(zig_tinyc) #define zig_builtin_ctz(w) \ static inline uint8_t zig_ctz_u##w(uint##w##_t val, uint8_t bits) { \ if (val == 0) return bits; \ @@ -1186,7 +1321,7 @@ zig_builtin_ctz(64) static inline uint8_t zig_clz_i##w(int##w##_t val, uint8_t bits) { \ return zig_clz_u##w((uint##w##_t)val, bits); \ } -#if zig_has_builtin(clz) || defined(zig_gnuc) +#if zig_has_builtin(clz) || defined(zig_gnuc) || defined(zig_tinyc) #define zig_builtin_clz(w) \ static inline uint8_t zig_clz_u##w(uint##w##_t val, uint8_t bits) { \ if (val == 0) return bits; \ @@ -1254,7 +1389,7 @@ typedef struct { zig_align(16) int64_t hi; uint64_t lo; } zig_i128; #define zig_make_u128(hi, lo) ((zig_u128){ .h##i = (hi), .l##o = (lo) }) #define zig_make_i128(hi, lo) ((zig_i128){ .h##i = (hi), .l##o = (lo) }) -#if _MSC_VER /* MSVC doesn't allow struct literals in constant expressions */ +#if defined(zig_msvc) /* MSVC doesn't allow struct literals in constant expressions */ #define zig_init_u128(hi, lo) { .h##i = (hi), .l##o = (lo) } #define zig_init_i128(hi, lo) { .h##i = (hi), .l##o = (lo) } #else /* But non-MSVC doesn't like the unprotected commas */ @@ -3016,7 +3151,13 @@ static inline uint16_t zig_popcount_big(const void *val, bool is_signed, uint16_ /* ========================= Floating Point Support ========================= */ -#if _MSC_VER +#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ +#define __STDC_WANT_IEC_60559_TYPES_EXT__ +#endif + +#include + +#if defined(zig_msvc) float __cdecl nanf(char const* input); double __cdecl nan(char const* input); long double __cdecl nanl(char const* input); @@ -3078,7 +3219,7 @@ typedef uint16_t zig_f16; #undef zig_init_special_f16 #define zig_init_special_f16(sign, name, arg, repr) repr #endif -#if __APPLE__ && (defined(__i386__) || defined(__x86_64__)) +#if defined(zig_darwin) && defined(zig_x86) typedef uint16_t zig_compiler_rt_f16; #else typedef zig_f16 zig_compiler_rt_f16; @@ -3086,7 +3227,7 @@ typedef zig_f16 zig_compiler_rt_f16; #define zig_has_f32 1 #define zig_libc_name_f32(name) name##f -#if _MSC_VER +#if defined(zig_msvc) #define zig_init_special_f32(sign, name, arg, repr) sign zig_make_f32(zig_msvc_flt_##name, ) #else #define zig_init_special_f32(sign, name, arg, repr) zig_make_special_f32(sign, name, arg, repr) @@ -3118,7 +3259,7 @@ typedef uint32_t zig_f32; #define zig_has_f64 1 #define zig_libc_name_f64(name) name -#if _MSC_VER +#if defined(zig_msvc) #define zig_init_special_f64(sign, name, arg, repr) sign zig_make_f64(zig_msvc_flt_##name, ) #else #define zig_init_special_f64(sign, name, arg, repr) zig_make_special_f64(sign, name, arg, repr) @@ -3183,6 +3324,12 @@ typedef zig_u128 zig_f80; #define zig_init_special_f80(sign, name, arg, repr) repr #endif +#if !defined(zig_clang) && defined(zig_gnuc) && defined(zig_x86) +#define zig_f128_has_miscompilations 1 +#else +#define zig_f128_has_miscompilations 0 +#endif + #define zig_has_f128 1 #define zig_libc_name_f128(name) name##q #define zig_init_special_f128(sign, name, arg, repr) zig_make_special_f128(sign, name, arg, repr) @@ -3211,7 +3358,7 @@ typedef __float128 zig_f128; #define zig_has_f128 0 #undef zig_make_special_f128 #undef zig_init_special_f128 -#if __APPLE__ || defined(__aarch64__) +#if defined(zig_darwin) || defined(zig_aarch64) typedef __attribute__((__vector_size__(2 * sizeof(uint64_t)))) uint64_t zig_v2u64; zig_basic_operator(zig_v2u64, xor_v2u64, ^) #define zig_repr_f128 v2u64 @@ -3230,10 +3377,10 @@ typedef zig_u128 zig_f128; #endif #endif -#if !_MSC_VER && defined(ZIG_TARGET_ABI_MSVC) +#if !defined(zig_msvc) && defined(ZIG_TARGET_ABI_MSVC) /* Emulate msvc abi on a gnu compiler */ typedef zig_f64 zig_c_longdouble; -#elif _MSC_VER && !defined(ZIG_TARGET_ABI_MSVC) +#elif defined(zig_msvc) && !defined(ZIG_TARGET_ABI_MSVC) /* Emulate gnu abi on an msvc compiler */ typedef zig_f128 zig_c_longdouble; #else @@ -3582,7 +3729,7 @@ zig_float_builtins(64) res = zig_atomicrmw_expected; \ } while (0) -#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) +#if (__STDC_VERSION__ >= 201112L || (zig_has_include() && !defined(zig_msvc))) && !defined(__STDC_NO_ATOMICS__) #include typedef enum memory_order zig_memory_order; #define zig_memory_order_relaxed memory_order_relaxed @@ -3610,7 +3757,7 @@ typedef enum memory_order zig_memory_order; #define zig_atomicrmw_add_float zig_atomicrmw_add #undef zig_atomicrmw_sub_float #define zig_atomicrmw_sub_float zig_atomicrmw_sub -#elif defined(__GNUC__) +#elif defined(zig_gnuc) typedef int zig_memory_order; #define zig_memory_order_relaxed __ATOMIC_RELAXED #define zig_memory_order_acquire __ATOMIC_ACQUIRE @@ -3633,7 +3780,7 @@ typedef int zig_memory_order; #define zig_atomic_load(res, obj, order, Type, ReprType) __atomic_load (obj, &(res), order) #undef zig_atomicrmw_xchg_float #define zig_atomicrmw_xchg_float zig_atomicrmw_xchg -#elif _MSC_VER && (_M_IX86 || _M_X64) +#elif defined(zig_msvc) && defined(zig_x86) #define zig_memory_order_relaxed 0 #define zig_memory_order_acquire 2 #define zig_memory_order_release 3 @@ -3653,7 +3800,7 @@ typedef int zig_memory_order; #define zig_atomicrmw_max(res, obj, arg, order, Type, ReprType) res = zig_msvc_atomicrmw_max_ ##Type(obj, arg) #define zig_atomic_store( obj, arg, order, Type, ReprType) zig_msvc_atomic_store_ ##Type(obj, arg) #define zig_atomic_load(res, obj, order, Type, ReprType) res = zig_msvc_atomic_load_ ##order##_##Type(obj) -/* TODO: _MSC_VER && (_M_ARM || _M_ARM64) */ +/* TODO: zig_msvc && (zig_thumb || zig_aarch64) */ #else #define zig_memory_order_relaxed 0 #define zig_memory_order_acquire 2 @@ -3676,7 +3823,7 @@ typedef int zig_memory_order; #define zig_atomic_load(res, obj, order, Type, ReprType) zig_atomics_unavailable #endif -#if _MSC_VER && (_M_IX86 || _M_X64) +#if defined(zig_msvc) && defined(zig_x86) /* TODO: zig_msvc_atomic_load should load 32 bit without interlocked on x86, and load 64 bit without interlocked on x64 */ @@ -3773,7 +3920,7 @@ zig_msvc_atomics(i16, int16_t, short, 16, 16) zig_msvc_atomics(u32, uint32_t, long, , 32) zig_msvc_atomics(i32, int32_t, long, , 32) -#if _M_X64 +#if defined(zig_x86_64) zig_msvc_atomics(u64, uint64_t, __int64, 64, 64) zig_msvc_atomics(i64, int64_t, __int64, 64, 64) #endif @@ -3818,11 +3965,11 @@ zig_msvc_atomics(i64, int64_t, __int64, 64, 64) } zig_msvc_flt_atomics(f32, long, , 32) -#if _M_X64 +#if defined(zig_x86_64) zig_msvc_flt_atomics(f64, int64_t, 64, 64) #endif -#if _M_IX86 +#if defined(zig_x86_32) static inline void zig_msvc_atomic_barrier() { int32_t barrier; __asm { @@ -3859,7 +4006,7 @@ static inline bool zig_msvc_cmpxchg_p32(void volatile* obj, void* expected, void if (!success) *(void**)expected = initial; return success; } -#else /* _M_IX86 */ +#else /* zig_x86_32 */ static inline void* zig_msvc_atomicrmw_xchg_p64(void volatile* obj, void* arg) { return _InterlockedExchangePointer(obj, arg); } @@ -3920,55 +4067,59 @@ static inline void zig_msvc_atomic_store_i128(zig_i128 volatile* obj, zig_i128 a while (!zig_cmpxchg_weak(obj, expected, arg, zig_memory_order_seq_cst, zig_memory_order_seq_cst, i128, zig_i128)); } -#endif /* _M_IX86 */ +#endif /* zig_x86_32 */ -#endif /* _MSC_VER && (_M_IX86 || _M_X64) */ +#endif /* zig_msvc && zig_x86 */ /* ======================== Special Case Intrinsics ========================= */ -#if defined(_M_ARM) || defined(__thumb__) +#if defined(zig_msvc) +#include +#endif + +#if defined(zig_thumb) static inline void* zig_thumb_windows_teb(void) { void* teb = 0; -#if defined(_MSC_VER) +#if defined(zig_msvc) teb = (void*)_MoveFromCoprocessor(15, 0, 13, 0, 2); -#elif defined(__GNUC__) +#elif defined(zig_gnuc_asm) __asm__ ("mrc p15, 0, %[ptr], c13, c0, 2" : [ptr] "=r" (teb)); #endif return teb; } -#elif defined(_M_ARM64) || defined(__arch64__) +#elif defined(zig_aarch64) static inline void* zig_aarch64_windows_teb(void) { void* teb = 0; -#if defined(_MSC_VER) +#if defined(zig_msvc) teb = (void*)__readx18qword(0x0); -#elif defined(__GNUC__) +#elif defined(zig_gnuc_asm) __asm__ ("mov %[ptr], x18" : [ptr] "=r" (teb)); #endif return teb; } -#elif defined(_M_IX86) || defined(__i386__) +#elif defined(zig_x86_32) static inline void* zig_x86_windows_teb(void) { void* teb = 0; -#if defined(_MSC_VER) +#if defined(zig_msvc) teb = (void*)__readfsdword(0x18); -#elif defined(__GNUC__) +#elif defined(zig_gnuc_asm) __asm__ ("movl %%fs:0x18, %[ptr]" : [ptr] "=r" (teb)); #endif return teb; } -#elif defined(_M_X64) || defined(__x86_64__) +#elif defined(zig_x86_64) static inline void* zig_x86_64_windows_teb(void) { void* teb = 0; -#if defined(_MSC_VER) +#if defined(zig_msvc) teb = (void*)__readgsqword(0x30); -#elif defined(__GNUC__) +#elif defined(zig_gnuc_asm) __asm__ ("movq %%gs:0x30, %[ptr]" : [ptr] "=r" (teb)); #endif return teb; @@ -3976,29 +4127,39 @@ static inline void* zig_x86_64_windows_teb(void) { #endif -#if (_MSC_VER && (_M_IX86 || _M_X64)) || defined(__i386__) || defined(__x86_64__) +#if defined(zig_x86) static inline void zig_x86_cpuid(uint32_t leaf_id, uint32_t subid, uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) { -#if _MSC_VER +#if defined(zig_msvc) int cpu_info[4]; __cpuidex(cpu_info, leaf_id, subid); *eax = (uint32_t)cpu_info[0]; *ebx = (uint32_t)cpu_info[1]; *ecx = (uint32_t)cpu_info[2]; *edx = (uint32_t)cpu_info[3]; +#elif defined(zig_gnuc_asm) + __asm__("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "a"(leaf_id), "c"(subid)); #else - __cpuid_count(leaf_id, subid, *eax, *ebx, *ecx, *edx); + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; #endif } static inline uint32_t zig_x86_get_xcr0(void) { -#if _MSC_VER +#if defined(zig_msvc) return (uint32_t)_xgetbv(0); -#else +#elif defined(zig_gnuc_asm) uint32_t eax; uint32_t edx; __asm__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(0)); return eax; +#else + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; #endif } diff --git a/stage1/zig1.wasm b/stage1/zig1.wasm index 4ee7f618be7242f8a82cbceb30ed9a12b6a7afb1..7ea45015a55ce21afdec519c44a1a66ae83a531b 100644 GIT binary patch literal 2917800 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