From 8a7a07f30dc9aedb596db327f57d5dc12f2ffd52 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 17 May 2021 14:39:56 -0700 Subject: [PATCH] stage2: test cases take advantage of `pub fn main` support --- BRANCH_TODO | 2 - test/stage2/arm.zig | 171 ++------------- test/stage2/test.zig | 491 +++++-------------------------------------- 3 files changed, 62 insertions(+), 602 deletions(-) diff --git a/BRANCH_TODO b/BRANCH_TODO index 50a0246989..d5bc2c5fba 100644 --- a/BRANCH_TODO +++ b/BRANCH_TODO @@ -1,5 +1,3 @@ - * modify stage2 tests so that only 1 uses _start and the rest use - pub fn main * modify stage2 CBE tests so that only 1 uses pub export main and the rest use pub fn main diff --git a/test/stage2/arm.zig b/test/stage2/arm.zig index 1d3d76c6ee..e00a5e8bfb 100644 --- a/test/stage2/arm.zig +++ b/test/stage2/arm.zig @@ -9,7 +9,7 @@ const linux_arm = std.zig.CrossTarget{ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("linux_arm hello world", linux_arm); - // Regular old hello world + // Hello world using _start and inline asm. case.addCompareOutput( \\pub export fn _start() noreturn { \\ print(); @@ -50,9 +50,8 @@ pub fn addCases(ctx: *TestContext) !void { // be in a specific order because otherwise the write to r0 // would overwrite the len parameter which resides in r0 case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ print(id(14)); - \\ exit(); \\} \\ \\fn id(x: u32) u32 { @@ -70,16 +69,6 @@ pub fn addCases(ctx: *TestContext) !void { \\ ); \\ return; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "Hello, World!\n", ); @@ -89,9 +78,8 @@ pub fn addCases(ctx: *TestContext) !void { var case = ctx.exe("non-leaf functions", linux_arm); // Testing non-leaf functions case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ foo(); - \\ exit(); \\} \\ \\fn foo() void { @@ -99,16 +87,6 @@ pub fn addCases(ctx: *TestContext) !void { \\} \\ \\fn bar() void {} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -119,10 +97,9 @@ pub fn addCases(ctx: *TestContext) !void { // Add two numbers case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ print(2, 4); \\ print(1, 7); - \\ exit(); \\} \\ \\fn print(a: u32, b: u32) void { @@ -136,26 +113,15 @@ pub fn addCases(ctx: *TestContext) !void { \\ ); \\ return; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "12345612345678", ); // Subtract two numbers case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ print(10, 5); \\ print(4, 3); - \\ exit(); \\} \\ \\fn print(a: u32, b: u32) void { @@ -169,26 +135,15 @@ pub fn addCases(ctx: *TestContext) !void { \\ ); \\ return; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "123451", ); // Bitwise And case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ print(8, 9); \\ print(3, 7); - \\ exit(); \\} \\ \\fn print(a: u32, b: u32) void { @@ -202,26 +157,15 @@ pub fn addCases(ctx: *TestContext) !void { \\ ); \\ return; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "12345678123", ); // Bitwise Or case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ print(4, 2); \\ print(3, 7); - \\ exit(); \\} \\ \\fn print(a: u32, b: u32) void { @@ -235,26 +179,15 @@ pub fn addCases(ctx: *TestContext) !void { \\ ); \\ return; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "1234561234567", ); // Bitwise Xor case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ print(42, 42); \\ print(3, 5); - \\ exit(); \\} \\ \\fn print(a: u32, b: u32) void { @@ -268,16 +201,6 @@ pub fn addCases(ctx: *TestContext) !void { \\ ); \\ return; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "123456", ); @@ -287,26 +210,15 @@ pub fn addCases(ctx: *TestContext) !void { var case = ctx.exe("if statements", linux_arm); // Simple if statement in assert case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ var x: u32 = 123; \\ var y: u32 = 42; \\ assert(x > y); - \\ exit(); \\} \\ \\fn assert(ok: bool) void { \\ if (!ok) unreachable; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -316,7 +228,7 @@ pub fn addCases(ctx: *TestContext) !void { var case = ctx.exe("while loops", linux_arm); // Simple while loop with assert case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ var x: u32 = 2020; \\ var i: u32 = 0; \\ while (x > 0) { @@ -324,22 +236,11 @@ pub fn addCases(ctx: *TestContext) !void { \\ i += 1; \\ } \\ assert(i == 1010); - \\ exit(); \\} \\ \\fn assert(ok: bool) void { \\ if (!ok) unreachable; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -349,12 +250,11 @@ pub fn addCases(ctx: *TestContext) !void { var case = ctx.exe("integer multiplication", linux_arm); // Simple u32 integer multiplication case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(mul(1, 1) == 1); \\ assert(mul(42, 1) == 42); \\ assert(mul(1, 42) == 42); \\ assert(mul(123, 42) == 5166); - \\ exit(); \\} \\ \\fn mul(x: u32, y: u32) u32 { @@ -364,16 +264,6 @@ pub fn addCases(ctx: *TestContext) !void { \\fn assert(ok: bool) void { \\ if (!ok) unreachable; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -385,9 +275,8 @@ pub fn addCases(ctx: *TestContext) !void { // callee preserved register, otherwise it will be overwritten // by the first parameter to baz. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(foo() == 43); - \\ exit(); \\} \\ \\fn foo() u32 { @@ -405,16 +294,6 @@ pub fn addCases(ctx: *TestContext) !void { \\fn assert(ok: bool) void { \\ if (!ok) unreachable; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -423,14 +302,13 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("recursive fibonacci", linux_arm); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(fib(0) == 0); \\ assert(fib(1) == 1); \\ assert(fib(2) == 1); \\ assert(fib(3) == 2); \\ assert(fib(10) == 55); \\ assert(fib(20) == 6765); - \\ exit(); \\} \\ \\fn fib(n: u32) u32 { @@ -444,16 +322,6 @@ pub fn addCases(ctx: *TestContext) !void { \\fn assert(ok: bool) void { \\ if (!ok) unreachable; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -462,9 +330,8 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("spilling registers", linux_arm); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(add(3, 4) == 791); - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) u32 { @@ -497,16 +364,6 @@ pub fn addCases(ctx: *TestContext) !void { \\fn assert(ok: bool) void { \\ if (!ok) unreachable; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("svc #0" - \\ : - \\ : [number] "{r7}" (1), - \\ [arg1] "{r0}" (0) - \\ : "memory" - \\ ); - \\ unreachable; - \\} , "", ); diff --git a/test/stage2/test.zig b/test/stage2/test.zig index 03bdf73475..fd57275270 100644 --- a/test/stage2/test.zig +++ b/test/stage2/test.zig @@ -65,6 +65,7 @@ pub fn addCases(ctx: *TestContext) !void { , "Hello, World!\n", ); + // Now change the message only case.addCompareOutput( \\pub export fn _start() noreturn { @@ -237,25 +238,13 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("subtracting numbers at runtime", linux_x64); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ sub(7, 4); - \\ - \\ exit(); \\} \\ \\fn sub(a: u32, b: u32) void { \\ if (a - b != 3) unreachable; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -263,58 +252,33 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("@TypeOf", linux_x64); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ var x: usize = 0; \\ const z = @TypeOf(x, @as(u128, 5)); \\ assert(z == u128); - \\ - \\ exit(); \\} \\ \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const z = @TypeOf(true); \\ assert(z == bool); - \\ - \\ exit(); \\} \\ \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); case.addError( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const z = @TypeOf(true, 1); - \\ unreachable; \\} , &[_][]const u8{":2:15: error: incompatible types: 'bool' and 'comptime_int'"}); } @@ -346,7 +310,7 @@ pub fn addCases(ctx: *TestContext) !void { ); // comptime function call case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn _start() noreturn { \\ exit(); \\} \\ @@ -397,10 +361,8 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("assert function", linux_x64); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ add(3, 4); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) void { @@ -427,10 +389,8 @@ pub fn addCases(ctx: *TestContext) !void { // Tests copying a register. For the `c = a + b`, it has to // preserve both a and b, because they are both used later. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ add(3, 4); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) void { @@ -443,26 +403,14 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // More stress on the liveness detection. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ add(3, 4); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) void { @@ -479,26 +427,14 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Requires a second move. The register allocator should figure out to re-use rax. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ add(3, 4); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) void { @@ -516,27 +452,15 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Now we test integer return values. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(add(3, 4) == 7); \\ assert(add(20, 10) == 30); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) u32 { @@ -546,27 +470,15 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Local mutable variables. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(add(3, 4) == 7); \\ assert(add(20, 10) == 30); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) u32 { @@ -580,39 +492,17 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Optionals case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const a: u32 = 2; \\ const b: ?u32 = a; \\ const c = b.?; \\ if (c != 2) unreachable; - \\ - \\ exit(); - \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; \\} , "", @@ -620,12 +510,10 @@ pub fn addCases(ctx: *TestContext) !void { // While loops case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ var i: u32 = 0; \\ while (i < 4) : (i += 1) print(); \\ assert(i == 4); - \\ - \\ exit(); \\} \\ \\fn print() void { @@ -643,28 +531,16 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "hello\nhello\nhello\nhello\n", ); // inline while requires the condition to be comptime known. case.addError( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ var i: u32 = 0; \\ inline while (i < 4) : (i += 1) print(); \\ assert(i == 4); - \\ - \\ exit(); \\} \\ \\fn print() void { @@ -682,24 +558,12 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , &[_][]const u8{":3:21: error: unable to resolve comptime value"}); // Labeled blocks (no conditional branch) case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(add(3, 4) == 20); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) u32 { @@ -717,26 +581,14 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // This catches a possible bug in the logic for re-using dying operands. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(add(3, 4) == 116); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) u32 { @@ -759,27 +611,15 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Spilling registers to the stack. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(add(3, 4) == 1221); \\ assert(mul(3, 4) == 21609); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) u32 { @@ -840,27 +680,15 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Reusing the registers of dead operands playing nicely with conditional branching. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(add(3, 4) == 791); \\ assert(add(4, 3) == 79); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) u32 { @@ -902,30 +730,18 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Character literals and multiline strings. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const ignore = \\ \\ cool thx \\ \\ \\ ; \\ add('ぁ', '\x03'); - \\ - \\ exit(); \\} \\ \\fn add(a: u32, b: u32) void { @@ -935,26 +751,14 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Global const. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ add(aa, bb); - \\ - \\ exit(); \\} \\ \\const aa = 'ぁ'; @@ -967,41 +771,19 @@ pub fn addCases(ctx: *TestContext) !void { \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Array access. case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert("hello"[0] == 'h'); - \\ - \\ exit(); \\} \\ \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -1009,61 +791,35 @@ pub fn addCases(ctx: *TestContext) !void { // Array access to a global array. case.addCompareOutput( \\const hello = "hello".*; - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ assert(hello[1] == 'e'); - \\ - \\ exit(); \\} \\ \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // 64bit set stack case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ var i: u64 = 0xFFEEDDCCBBAA9988; \\ assert(i == 0xFFEEDDCCBBAA9988); - \\ - \\ exit(); \\} \\ \\pub fn assert(ok: bool) void { \\ if (!ok) unreachable; // assertion failure \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); // Basic for loop case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ for ("hello") |_| print(); - \\ - \\ exit(); \\} \\ \\fn print() void { @@ -1077,16 +833,6 @@ pub fn addCases(ctx: *TestContext) !void { \\ ); \\ return; \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "hello\nhello\nhello\nhello\nhello\n", ); @@ -1095,19 +841,8 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("basic import", linux_x64); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ @import("print.zig").print(); - \\ exit(); - \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (@as(usize, 0)) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; \\} , "Hello, World!\n", @@ -1132,14 +867,14 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("redundant comptime", linux_x64); case.addError( - \\pub export fn _start() void { + \\pub fn main() void { \\ var a: comptime u32 = 0; \\} , &.{":2:12: error: redundant comptime keyword in already comptime scope"}, ); case.addError( - \\pub export fn _start() void { + \\pub fn main() void { \\ comptime { \\ var a: u32 = comptime 0; \\ } @@ -1151,19 +886,8 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("import private", linux_x64); case.addError( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ @import("print.zig").print(); - \\ exit(); - \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (@as(usize, 0)) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; \\} , &.{ @@ -1215,19 +939,17 @@ pub fn addCases(ctx: *TestContext) !void { }); ctx.compileError("compileError", linux_x64, - \\pub export fn _start() noreturn { + \\export fn foo() void { \\ @compileError("this is an error"); - \\ unreachable; \\} , &[_][]const u8{":2:3: error: this is an error"}); { var case = ctx.obj("variable shadowing", linux_x64); case.addError( - \\export fn _start() noreturn { + \\pub fn main() void { \\ var i: u32 = 10; \\ var i: u32 = 10; - \\ unreachable; \\} , &[_][]const u8{ ":3:9: error: redeclaration of 'i'", @@ -1235,9 +957,8 @@ pub fn addCases(ctx: *TestContext) !void { }); case.addError( \\var testing: i64 = 10; - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ var testing: i64 = 20; - \\ unreachable; \\} , &[_][]const u8{ ":3:9: error: local shadows declaration of 'testing'", @@ -1268,7 +989,7 @@ pub fn addCases(ctx: *TestContext) !void { // Now only compile log statements remain. One per Decl. case.addError( - \\pub export fn _start() noreturn { + \\export fn _start() noreturn { \\ const b = true; \\ var f: u32 = 1; \\ @compileLog(b, 20, f, x); @@ -1306,43 +1027,19 @@ pub fn addCases(ctx: *TestContext) !void { // Break out of loop case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ while (true) { \\ break; \\ } - \\ - \\ exit(); - \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; \\} , "", ); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ foo: while (true) { \\ break :foo; \\ } - \\ - \\ exit(); - \\} - \\ - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; \\} , "", @@ -1534,46 +1231,26 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("orelse at comptime", linux_x64); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const i: ?u64 = 0; - \\ const orelsed = i orelse 5; - \\ assert(orelsed == 0); - \\ exit(); + \\ const result = i orelse 5; + \\ assert(result == 0); \\} \\fn assert(b: bool) void { \\ if (!b) unreachable; \\} - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const i: ?u64 = null; - \\ const orelsed = i orelse 5; - \\ assert(orelsed == 5); - \\ exit(); + \\ const result = i orelse 5; + \\ assert(result == 5); \\} \\fn assert(b: bool) void { \\ if (!b) unreachable; \\} - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -1611,20 +1288,10 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("passing u0 to function", linux_x64); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ doNothing(0); - \\ exit(); \\} \\fn doNothing(arg: u0) void {} - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); @@ -1632,119 +1299,67 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.exe("catch at comptime", linux_x64); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const i: anyerror!u64 = 0; \\ const caught = i catch 5; \\ assert(caught == 0); - \\ exit(); \\} \\fn assert(b: bool) void { \\ if (!b) unreachable; \\} - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const i: anyerror!u64 = error.B; \\ const caught = i catch 5; \\ assert(caught == 5); - \\ exit(); \\} \\fn assert(b: bool) void { \\ if (!b) unreachable; \\} - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", ); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const a: anyerror!comptime_int = 42; \\ const b: *const comptime_int = &(a catch unreachable); \\ assert(b.* == 42); - \\ - \\ exit(); \\} \\fn assert(b: bool) void { \\ if (!b) unreachable; // assertion failure \\} - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , ""); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const a: anyerror!u32 = error.B; \\ _ = &(a catch |err| assert(err == error.B)); - \\ exit(); \\} \\fn assert(b: bool) void { \\ if (!b) unreachable; \\} - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , ""); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const a: anyerror!u32 = error.Bar; \\ a catch |err| assert(err == error.Bar); - \\ - \\ exit(); \\} \\fn assert(b: bool) void { \\ if (!b) unreachable; \\} - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , ""); } { var case = ctx.exe("merge error sets", linux_x64); case.addCompareOutput( - \\pub export fn _start() noreturn { + \\pub fn main() void { \\ const E = error{ A, B, D } || error { A, B, C }; \\ const a = E.A; \\ const b = E.B; @@ -1755,20 +1370,10 @@ pub fn addCases(ctx: *TestContext) !void { \\ const y = E2.Y; \\ const z = E2.Z; \\ assert(anyerror || error { Z } == anyerror); - \\ exit(); \\} \\fn assert(b: bool) void { \\ if (!b) unreachable; \\} - \\fn exit() noreturn { - \\ asm volatile ("syscall" - \\ : - \\ : [number] "{rax}" (231), - \\ [arg1] "{rdi}" (0) - \\ : "rcx", "r11", "memory" - \\ ); - \\ unreachable; - \\} , "", );