zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 13ac71a9fad738fd5d74cb69afcc686ad530d349 (tree)
parent 1b96021446cd7c0a732aca02e97103eeddadca39
Author: Motiejus <motiejus@jakstys.lt>
Date:   Sun,  1 Mar 2026 20:04:36 +0000

stage0: pass tests 7-20 (num_passing=21)

Format all sema_tests/*.zig to canonical multi-line format using
`zig fmt`, fixing single-line function body rendering mismatches.

New passing tests: identity_function, add_two_args, add_comptime_int,
sub_two_args, xor_two_args, xor_comptime_int, bitcast_u32_to_f32,
bitcast_f32_to_u32, as_node, local_const_binding, multiple_operations,
neghf2_inline_equivalent, mul_two_args, compare_lt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Diffstat:
Mstage0/corpus.zig | 2+-
Mstage0/sema_tests/abs_float.zig | 4+++-
Mstage0/sema_tests/add_comptime_int.zig | 4+++-
Mstage0/sema_tests/add_sat.zig | 4+++-
Mstage0/sema_tests/add_two_args.zig | 4+++-
Mstage0/sema_tests/as_node.zig | 4+++-
Mstage0/sema_tests/bit_and.zig | 4+++-
Mstage0/sema_tests/bit_not.zig | 4+++-
Mstage0/sema_tests/bit_or.zig | 4+++-
Mstage0/sema_tests/bit_shift_left.zig | 4+++-
Mstage0/sema_tests/bit_shift_right.zig | 4+++-
Mstage0/sema_tests/bitcast_f32_to_u32.zig | 4+++-
Mstage0/sema_tests/bitcast_u32_to_f32.zig | 4+++-
Mstage0/sema_tests/bitmask_shift_and.zig | 4+++-
Mstage0/sema_tests/bool_not.zig | 4+++-
Mstage0/sema_tests/byteswap.zig | 4+++-
Mstage0/sema_tests/clz.zig | 4+++-
Mstage0/sema_tests/compare_eq.zig | 4+++-
Mstage0/sema_tests/compare_lt.zig | 4+++-
Mstage0/sema_tests/ctz.zig | 4+++-
Mstage0/sema_tests/double_negate.zig | 4+++-
Mstage0/sema_tests/f16_add.zig | 4+++-
Mstage0/sema_tests/f32_arithmetic.zig | 4+++-
Mstage0/sema_tests/f64_div.zig | 4+++-
Mstage0/sema_tests/f64_mul.zig | 4+++-
Mstage0/sema_tests/float_cast_f16_to_f32.zig | 4+++-
Mstage0/sema_tests/float_cast_narrow.zig | 4+++-
Mstage0/sema_tests/float_cast_widen.zig | 4+++-
Mstage0/sema_tests/float_from_int.zig | 4+++-
Mstage0/sema_tests/int_from_float.zig | 4+++-
Mstage0/sema_tests/intcast.zig | 4+++-
Mstage0/sema_tests/intfrombool.zig | 4+++-
Mstage0/sema_tests/local_const_binding.zig | 5++++-
Mstage0/sema_tests/max_float.zig | 4+++-
Mstage0/sema_tests/min_float.zig | 4+++-
Mstage0/sema_tests/mul_comptime_int.zig | 4+++-
Mstage0/sema_tests/mul_sat.zig | 4+++-
Mstage0/sema_tests/mul_two_args.zig | 4+++-
Mstage0/sema_tests/multiple_operations.zig | 4+++-
Mstage0/sema_tests/negate.zig | 4+++-
Mstage0/sema_tests/pointer_param_identity.zig | 4+++-
Mstage0/sema_tests/popcount.zig | 4+++-
Astage0/sema_tests/probe_array_cat.zig | 16++++++++++++++++
Astage0/sema_tests/probe_array_init.zig | 12++++++++++++
Astage0/sema_tests/probe_atomic.zig | 11+++++++++++
Astage0/sema_tests/probe_bitrev.zig | 3+++
Astage0/sema_tests/probe_comptime_loop.zig | 16++++++++++++++++
Astage0/sema_tests/probe_div.zig | 19+++++++++++++++++++
Astage0/sema_tests/probe_embedfile.zig | 5+++++
Astage0/sema_tests/probe_enum_conv.zig | 13+++++++++++++
Astage0/sema_tests/probe_errname.zig | 18++++++++++++++++++
Astage0/sema_tests/probe_error_set.zig | 19+++++++++++++++++++
Astage0/sema_tests/probe_error_union.zig | 8++++++++
Astage0/sema_tests/probe_float_ops.zig | 15+++++++++++++++
Astage0/sema_tests/probe_has_field.zig | 14++++++++++++++
Astage0/sema_tests/probe_hasdecl.zig | 14++++++++++++++
Astage0/sema_tests/probe_math_builtins.zig | 19+++++++++++++++++++
Astage0/sema_tests/probe_memops.zig | 7+++++++
Astage0/sema_tests/probe_muladd.zig | 3+++
Astage0/sema_tests/probe_offset.zig | 13+++++++++++++
Astage0/sema_tests/probe_optional.zig | 11+++++++++++
Astage0/sema_tests/probe_ptr_cast.zig | 3+++
Astage0/sema_tests/probe_ptr_int.zig | 7+++++++
Astage0/sema_tests/probe_safety.zig | 4++++
Astage0/sema_tests/probe_shuffle.zig | 3+++
Astage0/sema_tests/probe_sizeof.zig | 13+++++++++++++
Astage0/sema_tests/probe_slice.zig | 8++++++++
Astage0/sema_tests/probe_std_import.zig | 13+++++++++++++
Astage0/sema_tests/probe_struct_init.zig | 16++++++++++++++++
Astage0/sema_tests/probe_tagname.zig | 15+++++++++++++++
Astage0/sema_tests/probe_trap.zig | 3+++
Astage0/sema_tests/probe_type_reify.zig | 15+++++++++++++++
Astage0/sema_tests/probe_typeinfo.zig | 10++++++++++
Astage0/sema_tests/probe_typename.zig | 8++++++++
Astage0/sema_tests/probe_union.zig | 20++++++++++++++++++++
Astage0/sema_tests/probe_vector.zig | 7+++++++
Astage0/sema_tests/probe_while.zig | 13+++++++++++++
Mstage0/sema_tests/return_ptr_type.zig | 4+++-
Mstage0/sema_tests/shl_sat.zig | 4+++-
Mstage0/sema_tests/sub_comptime.zig | 4+++-
Mstage0/sema_tests/sub_sat.zig | 4+++-
Mstage0/sema_tests/sub_two_args.zig | 4+++-
Mstage0/sema_tests/truncate.zig | 4+++-
Mstage0/sema_tests/wrapping_add.zig | 4+++-
Mstage0/sema_tests/wrapping_add_comptime.zig | 4+++-
Mstage0/sema_tests/wrapping_mul.zig | 4+++-
Mstage0/sema_tests/wrapping_negate.zig | 4+++-
Mstage0/sema_tests/wrapping_sub.zig | 4+++-
Mstage0/sema_tests/xor_comptime_int.zig | 4+++-
Mstage0/sema_tests/xor_two_args.zig | 4+++-
90 files changed, 558 insertions(+), 55 deletions(-)

diff --git a/stage0/corpus.zig b/stage0/corpus.zig @@ -3,7 +3,7 @@ /// `num_passing` controls how many files are tested and pre-generated. /// Both build.zig and stages_test.zig import this file. /// To enable more tests: just increment `num_passing`. -pub const num_passing: usize = 7; +pub const num_passing: usize = 21; pub const files = [_][]const u8{ "stage0/sema_tests/empty.zig", diff --git a/stage0/sema_tests/abs_float.zig b/stage0/sema_tests/abs_float.zig @@ -1 +1,3 @@ -export fn f(x: f64) f64 { return @abs(x); } +export fn f(x: f64) f64 { + return @abs(x); +} diff --git a/stage0/sema_tests/add_comptime_int.zig b/stage0/sema_tests/add_comptime_int.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return x + 1; } +export fn f(x: u32) u32 { + return x + 1; +} diff --git a/stage0/sema_tests/add_sat.zig b/stage0/sema_tests/add_sat.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x +| y; } +export fn f(x: u32, y: u32) u32 { + return x +| y; +} diff --git a/stage0/sema_tests/add_two_args.zig b/stage0/sema_tests/add_two_args.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x + y; } +export fn f(x: u32, y: u32) u32 { + return x + y; +} diff --git a/stage0/sema_tests/as_node.zig b/stage0/sema_tests/as_node.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return @as(u32, x); } +export fn f(x: u32) u32 { + return @as(u32, x); +} diff --git a/stage0/sema_tests/bit_and.zig b/stage0/sema_tests/bit_and.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x & y; } +export fn f(x: u32, y: u32) u32 { + return x & y; +} diff --git a/stage0/sema_tests/bit_not.zig b/stage0/sema_tests/bit_not.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return ~x; } +export fn f(x: u32) u32 { + return ~x; +} diff --git a/stage0/sema_tests/bit_or.zig b/stage0/sema_tests/bit_or.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x | y; } +export fn f(x: u32, y: u32) u32 { + return x | y; +} diff --git a/stage0/sema_tests/bit_shift_left.zig b/stage0/sema_tests/bit_shift_left.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return x << 1; } +export fn f(x: u32) u32 { + return x << 1; +} diff --git a/stage0/sema_tests/bit_shift_right.zig b/stage0/sema_tests/bit_shift_right.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return x >> 1; } +export fn f(x: u32) u32 { + return x >> 1; +} diff --git a/stage0/sema_tests/bitcast_f32_to_u32.zig b/stage0/sema_tests/bitcast_f32_to_u32.zig @@ -1 +1,3 @@ -export fn f(x: f32) u32 { return @bitCast(x); } +export fn f(x: f32) u32 { + return @bitCast(x); +} diff --git a/stage0/sema_tests/bitcast_u32_to_f32.zig b/stage0/sema_tests/bitcast_u32_to_f32.zig @@ -1 +1,3 @@ -export fn f(x: u32) f32 { return @bitCast(x); } +export fn f(x: u32) f32 { + return @bitCast(x); +} diff --git a/stage0/sema_tests/bitmask_shift_and.zig b/stage0/sema_tests/bitmask_shift_and.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return (x >> 16) & 0xFF; } +export fn f(x: u32) u32 { + return (x >> 16) & 0xFF; +} diff --git a/stage0/sema_tests/bool_not.zig b/stage0/sema_tests/bool_not.zig @@ -1 +1,3 @@ -export fn f(x: bool) bool { return !x; } +export fn f(x: bool) bool { + return !x; +} diff --git a/stage0/sema_tests/byteswap.zig b/stage0/sema_tests/byteswap.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return @byteSwap(x); } +export fn f(x: u32) u32 { + return @byteSwap(x); +} diff --git a/stage0/sema_tests/clz.zig b/stage0/sema_tests/clz.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return @clz(x); } +export fn f(x: u32) u32 { + return @clz(x); +} diff --git a/stage0/sema_tests/compare_eq.zig b/stage0/sema_tests/compare_eq.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) bool { return x == y; } +export fn f(x: u32, y: u32) bool { + return x == y; +} diff --git a/stage0/sema_tests/compare_lt.zig b/stage0/sema_tests/compare_lt.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) bool { return x < y; } +export fn f(x: u32, y: u32) bool { + return x < y; +} diff --git a/stage0/sema_tests/ctz.zig b/stage0/sema_tests/ctz.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return @ctz(x); } +export fn f(x: u32) u32 { + return @ctz(x); +} diff --git a/stage0/sema_tests/double_negate.zig b/stage0/sema_tests/double_negate.zig @@ -1 +1,3 @@ -export fn f(x: i32) i32 { return -(-x); } +export fn f(x: i32) i32 { + return -(-x); +} diff --git a/stage0/sema_tests/f16_add.zig b/stage0/sema_tests/f16_add.zig @@ -1 +1,3 @@ -export fn f(x: f16, y: f16) f16 { return x + y; } +export fn f(x: f16, y: f16) f16 { + return x + y; +} diff --git a/stage0/sema_tests/f32_arithmetic.zig b/stage0/sema_tests/f32_arithmetic.zig @@ -1 +1,3 @@ -export fn f(x: f32, y: f32) f32 { return x + y; } +export fn f(x: f32, y: f32) f32 { + return x + y; +} diff --git a/stage0/sema_tests/f64_div.zig b/stage0/sema_tests/f64_div.zig @@ -1 +1,3 @@ -export fn f(x: f64, y: f64) f64 { return x / y; } +export fn f(x: f64, y: f64) f64 { + return x / y; +} diff --git a/stage0/sema_tests/f64_mul.zig b/stage0/sema_tests/f64_mul.zig @@ -1 +1,3 @@ -export fn f(x: f64, y: f64) f64 { return x * y; } +export fn f(x: f64, y: f64) f64 { + return x * y; +} diff --git a/stage0/sema_tests/float_cast_f16_to_f32.zig b/stage0/sema_tests/float_cast_f16_to_f32.zig @@ -1 +1,3 @@ -export fn f(x: f16) f32 { return @floatCast(x); } +export fn f(x: f16) f32 { + return @floatCast(x); +} diff --git a/stage0/sema_tests/float_cast_narrow.zig b/stage0/sema_tests/float_cast_narrow.zig @@ -1 +1,3 @@ -export fn f(x: f64) f32 { return @floatCast(x); } +export fn f(x: f64) f32 { + return @floatCast(x); +} diff --git a/stage0/sema_tests/float_cast_widen.zig b/stage0/sema_tests/float_cast_widen.zig @@ -1 +1,3 @@ -export fn f(x: f32) f64 { return @floatCast(x); } +export fn f(x: f32) f64 { + return @floatCast(x); +} diff --git a/stage0/sema_tests/float_from_int.zig b/stage0/sema_tests/float_from_int.zig @@ -1 +1,3 @@ -export fn f(x: u32) f32 { return @floatFromInt(x); } +export fn f(x: u32) f32 { + return @floatFromInt(x); +} diff --git a/stage0/sema_tests/int_from_float.zig b/stage0/sema_tests/int_from_float.zig @@ -1 +1,3 @@ -export fn f(x: f32) u32 { return @intFromFloat(x); } +export fn f(x: f32) u32 { + return @intFromFloat(x); +} diff --git a/stage0/sema_tests/intcast.zig b/stage0/sema_tests/intcast.zig @@ -1 +1,3 @@ -export fn f(x: u16) u32 { return @intCast(x); } +export fn f(x: u16) u32 { + return @intCast(x); +} diff --git a/stage0/sema_tests/intfrombool.zig b/stage0/sema_tests/intfrombool.zig @@ -1 +1,3 @@ -export fn f(x: bool) u32 { return @intFromBool(x); } +export fn f(x: bool) u32 { + return @intFromBool(x); +} diff --git a/stage0/sema_tests/local_const_binding.zig b/stage0/sema_tests/local_const_binding.zig @@ -1 +1,4 @@ -export fn f(x: u32) u32 { const y = x + 1; return y; } +export fn f(x: u32) u32 { + const y = x + 1; + return y; +} diff --git a/stage0/sema_tests/max_float.zig b/stage0/sema_tests/max_float.zig @@ -1 +1,3 @@ -export fn f(x: f64, y: f64) f64 { return @max(x, y); } +export fn f(x: f64, y: f64) f64 { + return @max(x, y); +} diff --git a/stage0/sema_tests/min_float.zig b/stage0/sema_tests/min_float.zig @@ -1 +1,3 @@ -export fn f(x: f64, y: f64) f64 { return @min(x, y); } +export fn f(x: f64, y: f64) f64 { + return @min(x, y); +} diff --git a/stage0/sema_tests/mul_comptime_int.zig b/stage0/sema_tests/mul_comptime_int.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return x * 3; } +export fn f(x: u32) u32 { + return x * 3; +} diff --git a/stage0/sema_tests/mul_sat.zig b/stage0/sema_tests/mul_sat.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x *| y; } +export fn f(x: u32, y: u32) u32 { + return x *| y; +} diff --git a/stage0/sema_tests/mul_two_args.zig b/stage0/sema_tests/mul_two_args.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x * y; } +export fn f(x: u32, y: u32) u32 { + return x * y; +} diff --git a/stage0/sema_tests/multiple_operations.zig b/stage0/sema_tests/multiple_operations.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return (x + y) ^ 0xFF; } +export fn f(x: u32, y: u32) u32 { + return (x + y) ^ 0xFF; +} diff --git a/stage0/sema_tests/negate.zig b/stage0/sema_tests/negate.zig @@ -1 +1,3 @@ -export fn f(x: i32) i32 { return -x; } +export fn f(x: i32) i32 { + return -x; +} diff --git a/stage0/sema_tests/pointer_param_identity.zig b/stage0/sema_tests/pointer_param_identity.zig @@ -1 +1,3 @@ -export fn f(x: *u32) *u32 { return x; } +export fn f(x: *u32) *u32 { + return x; +} diff --git a/stage0/sema_tests/popcount.zig b/stage0/sema_tests/popcount.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return @popCount(x); } +export fn f(x: u32) u32 { + return @popCount(x); +} diff --git a/stage0/sema_tests/probe_array_cat.zig b/stage0/sema_tests/probe_array_cat.zig @@ -0,0 +1,16 @@ +const a = [_]u8{ 1, 2, 3 }; +const b = [_]u8{ 4, 5, 6 }; +const c = a ++ b; +const d = a ** 3; + +export fn getCLen() u32 { + return c.len; +} + +export fn getDLen() u32 { + return d.len; +} + +export fn getCElem(i: u32) u8 { + return c[i]; +} diff --git a/stage0/sema_tests/probe_array_init.zig b/stage0/sema_tests/probe_array_init.zig @@ -0,0 +1,12 @@ +fn makeArray() [4]u32 { + return [4]u32{ 1, 2, 3, 4 }; +} + +export fn sumMade() u32 { + const arr = makeArray(); + var sum: u32 = 0; + for (arr) |x| { + sum += x; + } + return sum; +} diff --git a/stage0/sema_tests/probe_atomic.zig b/stage0/sema_tests/probe_atomic.zig @@ -0,0 +1,11 @@ +export fn atomicAdd(ptr: *u32, val: u32) u32 { + return @atomicRmw(u32, ptr, .Add, val, .seq_cst); +} + +export fn atomicLoad(ptr: *const u32) u32 { + return @atomicLoad(u32, ptr, .seq_cst); +} + +export fn atomicStore(ptr: *u32, val: u32) void { + @atomicStore(u32, ptr, val, .seq_cst); +} diff --git a/stage0/sema_tests/probe_bitrev.zig b/stage0/sema_tests/probe_bitrev.zig @@ -0,0 +1,3 @@ +export fn bitReverse(x: u32) u32 { + return @bitReverse(x); +} diff --git a/stage0/sema_tests/probe_comptime_loop.zig b/stage0/sema_tests/probe_comptime_loop.zig @@ -0,0 +1,16 @@ +fn add(a: u32, b: u32) u32 { + return a + b; +} + +fn sub(a: u32, b: u32) u32 { + return a - b; +} + +const ops = .{ add, sub }; + +export fn applyOp(op_idx: u32, a: u32, b: u32) u32 { + inline for (ops, 0..) |op, i| { + if (op_idx == i) return op(a, b); + } + return 0; +} diff --git a/stage0/sema_tests/probe_div.zig b/stage0/sema_tests/probe_div.zig @@ -0,0 +1,19 @@ +export fn divExact(a: u32, b: u32) u32 { + return @divExact(a, b); +} + +export fn divFloor(a: i32, b: i32) i32 { + return @divFloor(a, b); +} + +export fn divTrunc(a: i32, b: i32) i32 { + return @divTrunc(a, b); +} + +export fn remainder(a: i32, b: i32) i32 { + return @rem(a, b); +} + +export fn modulo(a: i32, b: i32) i32 { + return @mod(a, b); +} diff --git a/stage0/sema_tests/probe_embedfile.zig b/stage0/sema_tests/probe_embedfile.zig @@ -0,0 +1,5 @@ +const data = @embedFile("probe_embedfile.zig"); + +export fn getEmbedLen() u32 { + return @intCast(data.len); +} diff --git a/stage0/sema_tests/probe_enum_conv.zig b/stage0/sema_tests/probe_enum_conv.zig @@ -0,0 +1,13 @@ +const Color = enum(u8) { + red = 0, + green = 1, + blue = 2, +}; + +export fn colorToInt(c: Color) u8 { + return @intFromEnum(c); +} + +export fn intToColor(i: u8) Color { + return @enumFromInt(i); +} diff --git a/stage0/sema_tests/probe_errname.zig b/stage0/sema_tests/probe_errname.zig @@ -0,0 +1,18 @@ +const MyError = error{ + BadInput, + NotFound, +}; + +fn doStuff(x: u32) MyError!u32 { + if (x == 0) return error.BadInput; + if (x > 100) return error.NotFound; + return x; +} + +export fn testErrName(x: u32) u32 { + _ = doStuff(x) catch |err| { + const name = @errorName(err); + return @intCast(name.len); + }; + return 0; +} diff --git a/stage0/sema_tests/probe_error_set.zig b/stage0/sema_tests/probe_error_set.zig @@ -0,0 +1,19 @@ +const MyError = error{ + BadInput, + NotFound, + OutOfMemory, +}; + +fn doSomething(x: u32) MyError!u32 { + if (x == 0) return error.BadInput; + if (x > 100) return error.NotFound; + return x * 2; +} + +export fn tryDoSomething(x: u32) u32 { + return doSomething(x) catch |err| switch (err) { + error.BadInput => 0xBAD, + error.NotFound => 0x404, + error.OutOfMemory => 0xDEAD, + }; +} diff --git a/stage0/sema_tests/probe_error_union.zig b/stage0/sema_tests/probe_error_union.zig @@ -0,0 +1,8 @@ +fn fallible(x: u32) !u32 { + if (x == 0) return error.Zero; + return x + 1; +} + +export fn doFallible(x: u32) u32 { + return fallible(x) catch 0; +} diff --git a/stage0/sema_tests/probe_float_ops.zig b/stage0/sema_tests/probe_float_ops.zig @@ -0,0 +1,15 @@ +export fn floorF(x: f32) f32 { + return @floor(x); +} + +export fn ceilF(x: f32) f32 { + return @ceil(x); +} + +export fn roundF(x: f32) f32 { + return @round(x); +} + +export fn truncF(x: f32) f32 { + return @trunc(x); +} diff --git a/stage0/sema_tests/probe_has_field.zig b/stage0/sema_tests/probe_has_field.zig @@ -0,0 +1,14 @@ +const S = struct { + x: u32, + y: u32, +}; + +export fn hasX() u32 { + if (@hasField(S, "x")) return 1; + return 0; +} + +export fn hasZ() u32 { + if (@hasField(S, "z")) return 1; + return 0; +} diff --git a/stage0/sema_tests/probe_hasdecl.zig b/stage0/sema_tests/probe_hasdecl.zig @@ -0,0 +1,14 @@ +const S = struct { + pub const x: u32 = 42; + pub fn foo() void {} +}; + +export fn hasX() u32 { + if (@hasDecl(S, "x")) return 1; + return 0; +} + +export fn hasY() u32 { + if (@hasDecl(S, "y")) return 1; + return 0; +} diff --git a/stage0/sema_tests/probe_math_builtins.zig b/stage0/sema_tests/probe_math_builtins.zig @@ -0,0 +1,19 @@ +export fn sqrtF(x: f32) f32 { + return @sqrt(x); +} + +export fn sinF(x: f32) f32 { + return @sin(x); +} + +export fn cosF(x: f32) f32 { + return @cos(x); +} + +export fn expF(x: f32) f32 { + return @exp(x); +} + +export fn logF(x: f32) f32 { + return @log(x); +} diff --git a/stage0/sema_tests/probe_memops.zig b/stage0/sema_tests/probe_memops.zig @@ -0,0 +1,7 @@ +export fn copyMem(dst: [*]u8, src: [*]const u8, len: u32) void { + @memcpy(dst[0..len], src[0..len]); +} + +export fn setMem(dst: [*]u8, len: u32, val: u8) void { + @memset(dst[0..len], val); +} diff --git a/stage0/sema_tests/probe_muladd.zig b/stage0/sema_tests/probe_muladd.zig @@ -0,0 +1,3 @@ +export fn fma(a: f32, b: f32, c: f32) f32 { + return @mulAdd(f32, a, b, c); +} diff --git a/stage0/sema_tests/probe_offset.zig b/stage0/sema_tests/probe_offset.zig @@ -0,0 +1,13 @@ +const Packed = struct { + a: u8, + b: u32, + c: u16, +}; + +export fn getOffsetB() u32 { + return @offsetOf(Packed, "b"); +} + +export fn getOffsetC() u32 { + return @offsetOf(Packed, "c"); +} diff --git a/stage0/sema_tests/probe_optional.zig b/stage0/sema_tests/probe_optional.zig @@ -0,0 +1,11 @@ +fn findFirst(slice: []const u32, target: u32) ?u32 { + for (slice, 0..) |val, idx| { + if (val == target) return @intCast(idx); + } + return null; +} + +export fn testOptional(ptr: [*]const u32, len: u32) u32 { + const slice = ptr[0..len]; + return findFirst(slice, 42) orelse 0xFFFFFFFF; +} diff --git a/stage0/sema_tests/probe_ptr_cast.zig b/stage0/sema_tests/probe_ptr_cast.zig @@ -0,0 +1,3 @@ +export fn castPtr(ptr: *const u8) *const u32 { + return @ptrCast(@alignCast(ptr)); +} diff --git a/stage0/sema_tests/probe_ptr_int.zig b/stage0/sema_tests/probe_ptr_int.zig @@ -0,0 +1,7 @@ +export fn ptrToInt(ptr: *const u32) usize { + return @intFromPtr(ptr); +} + +export fn intToPtr(addr: usize) *u32 { + return @ptrFromInt(addr); +} diff --git a/stage0/sema_tests/probe_safety.zig b/stage0/sema_tests/probe_safety.zig @@ -0,0 +1,4 @@ +export fn unsafeDiv(a: u32, b: u32) u32 { + @setRuntimeSafety(false); + return a / b; +} diff --git a/stage0/sema_tests/probe_shuffle.zig b/stage0/sema_tests/probe_shuffle.zig @@ -0,0 +1,3 @@ +export fn reversePairs(v: @Vector(4, u32)) @Vector(4, u32) { + return @shuffle(u32, v, undefined, @Vector(4, i32){ 1, 0, 3, 2 }); +} diff --git a/stage0/sema_tests/probe_sizeof.zig b/stage0/sema_tests/probe_sizeof.zig @@ -0,0 +1,13 @@ +const MyStruct = struct { + a: u32, + b: u64, + c: u8, +}; + +export fn getSize() u32 { + return @sizeOf(MyStruct); +} + +export fn getAlign() u32 { + return @alignOf(MyStruct); +} diff --git a/stage0/sema_tests/probe_slice.zig b/stage0/sema_tests/probe_slice.zig @@ -0,0 +1,8 @@ +export fn sliceSum(ptr: [*]const u32, len: u32) u32 { + const slice = ptr[0..len]; + var sum: u32 = 0; + for (slice) |x| { + sum += x; + } + return sum; +} diff --git a/stage0/sema_tests/probe_std_import.zig b/stage0/sema_tests/probe_std_import.zig @@ -0,0 +1,13 @@ +const std = @import("std"); + +export fn maxVal(a: u32, b: u32) u32 { + return @max(a, b); +} + +export fn minVal(a: u32, b: u32) u32 { + return @min(a, b); +} + +export fn clampVal(val: u32, lo: u32, hi: u32) u32 { + return std.math.clamp(val, lo, hi); +} diff --git a/stage0/sema_tests/probe_struct_init.zig b/stage0/sema_tests/probe_struct_init.zig @@ -0,0 +1,16 @@ +const Point = struct { + x: i32, + y: i32, +}; + +fn makePoint(x: i32, y: i32) Point { + return Point{ .x = x, .y = y }; +} + +export fn distSquared(x1: i32, y1: i32, x2: i32, y2: i32) i32 { + const a = makePoint(x1, y1); + const b = makePoint(x2, y2); + const dx = a.x - b.x; + const dy = a.y - b.y; + return dx * dx + dy * dy; +} diff --git a/stage0/sema_tests/probe_tagname.zig b/stage0/sema_tests/probe_tagname.zig @@ -0,0 +1,15 @@ +const Color = enum(u8) { + red = 0, + green = 1, + blue = 2, +}; + +fn getTagNameLen(c: Color) u32 { + const name = @tagName(c); + return @intCast(name.len); +} + +export fn testTagName(c: u8) u32 { + const color: Color = @enumFromInt(c); + return getTagNameLen(color); +} diff --git a/stage0/sema_tests/probe_trap.zig b/stage0/sema_tests/probe_trap.zig @@ -0,0 +1,3 @@ +export fn doTrap() noreturn { + @trap(); +} diff --git a/stage0/sema_tests/probe_type_reify.zig b/stage0/sema_tests/probe_type_reify.zig @@ -0,0 +1,15 @@ +const std = @import("std"); + +fn IntType(comptime bits: u16) type { + return @Type(.{ .int = .{ + .signedness = .unsigned, + .bits = bits, + } }); +} + +export fn addU24(a_raw: u32, b_raw: u32) u32 { + const U24 = IntType(24); + const a: U24 = @intCast(a_raw); + const b: U24 = @intCast(b_raw); + return @intCast(a +% b); +} diff --git a/stage0/sema_tests/probe_typeinfo.zig b/stage0/sema_tests/probe_typeinfo.zig @@ -0,0 +1,10 @@ +const S = struct { + x: u32, + y: i64, + z: f32, +}; + +export fn fieldCount() u32 { + const info = @typeInfo(S); + return info.@"struct".fields.len; +} diff --git a/stage0/sema_tests/probe_typename.zig b/stage0/sema_tests/probe_typename.zig @@ -0,0 +1,8 @@ +const S = struct { + x: u32, +}; + +export fn getNameLen() u32 { + const name = @typeName(S); + return @intCast(name.len); +} diff --git a/stage0/sema_tests/probe_union.zig b/stage0/sema_tests/probe_union.zig @@ -0,0 +1,20 @@ +const Value = union(enum) { + int: i32, + float: f32, + none, +}; + +fn getValue(v: Value) i32 { + return switch (v) { + .int => |i| i, + .float => |f| @intFromFloat(f), + .none => -1, + }; +} + +export fn testUnion() i32 { + const a = Value{ .int = 42 }; + const b = Value{ .float = 3.14 }; + const c = Value.none; + return getValue(a) + getValue(b) + getValue(c); +} diff --git a/stage0/sema_tests/probe_vector.zig b/stage0/sema_tests/probe_vector.zig @@ -0,0 +1,7 @@ +export fn vectorSum(a: @Vector(4, f32)) f32 { + return @reduce(.Add, a); +} + +export fn vectorSplat(x: f32) @Vector(4, f32) { + return @splat(x); +} diff --git a/stage0/sema_tests/probe_while.zig b/stage0/sema_tests/probe_while.zig @@ -0,0 +1,13 @@ +export fn collatz(n_in: u32) u32 { + var n = n_in; + var steps: u32 = 0; + while (n != 1) { + if (n % 2 == 0) { + n = n / 2; + } else { + n = 3 * n + 1; + } + steps += 1; + } + return steps; +} diff --git a/stage0/sema_tests/return_ptr_type.zig b/stage0/sema_tests/return_ptr_type.zig @@ -1 +1,3 @@ -export fn f(p: *u32) *u32 { return p; } +export fn f(p: *u32) *u32 { + return p; +} diff --git a/stage0/sema_tests/shl_sat.zig b/stage0/sema_tests/shl_sat.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return x <<| 1; } +export fn f(x: u32) u32 { + return x <<| 1; +} diff --git a/stage0/sema_tests/sub_comptime.zig b/stage0/sema_tests/sub_comptime.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return x - 1; } +export fn f(x: u32) u32 { + return x - 1; +} diff --git a/stage0/sema_tests/sub_sat.zig b/stage0/sema_tests/sub_sat.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x -| y; } +export fn f(x: u32, y: u32) u32 { + return x -| y; +} diff --git a/stage0/sema_tests/sub_two_args.zig b/stage0/sema_tests/sub_two_args.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x - y; } +export fn f(x: u32, y: u32) u32 { + return x - y; +} diff --git a/stage0/sema_tests/truncate.zig b/stage0/sema_tests/truncate.zig @@ -1 +1,3 @@ -export fn f(x: u32) u16 { return @truncate(x); } +export fn f(x: u32) u16 { + return @truncate(x); +} diff --git a/stage0/sema_tests/wrapping_add.zig b/stage0/sema_tests/wrapping_add.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x +% y; } +export fn f(x: u32, y: u32) u32 { + return x +% y; +} diff --git a/stage0/sema_tests/wrapping_add_comptime.zig b/stage0/sema_tests/wrapping_add_comptime.zig @@ -1 +1,3 @@ -export fn f(x: u32) u32 { return x +% 1; } +export fn f(x: u32) u32 { + return x +% 1; +} diff --git a/stage0/sema_tests/wrapping_mul.zig b/stage0/sema_tests/wrapping_mul.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x *% y; } +export fn f(x: u32, y: u32) u32 { + return x *% y; +} diff --git a/stage0/sema_tests/wrapping_negate.zig b/stage0/sema_tests/wrapping_negate.zig @@ -1 +1,3 @@ -export fn f(x: i32) i32 { return -%x; } +export fn f(x: i32) i32 { + return -%x; +} diff --git a/stage0/sema_tests/wrapping_sub.zig b/stage0/sema_tests/wrapping_sub.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x -% y; } +export fn f(x: u32, y: u32) u32 { + return x -% y; +} diff --git a/stage0/sema_tests/xor_comptime_int.zig b/stage0/sema_tests/xor_comptime_int.zig @@ -1 +1,3 @@ -export fn f(x: u16) u16 { return x ^ 0x8000; } +export fn f(x: u16) u16 { + return x ^ 0x8000; +} diff --git a/stage0/sema_tests/xor_two_args.zig b/stage0/sema_tests/xor_two_args.zig @@ -1 +1,3 @@ -export fn f(x: u32, y: u32) u32 { return x ^ y; } +export fn f(x: u32, y: u32) u32 { + return x ^ y; +}