Commit 8a7a07f30d
Changed files (3)
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;
- \\}
,
"",
);
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;
- \\}
,
"",
);
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