aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/stage2/cbe.zig89
-rw-r--r--test/stage2/compare_output.zig24
2 files changed, 104 insertions, 9 deletions
diff --git a/test/stage2/cbe.zig b/test/stage2/cbe.zig
index 2c3f0631c8..5e2d56b5ed 100644
--- a/test/stage2/cbe.zig
+++ b/test/stage2/cbe.zig
@@ -12,7 +12,7 @@ pub fn addCases(ctx: *TestContext) !void {
ctx.c("empty start function", linux_x64,
\\export fn _start() noreturn {}
,
- \\noreturn void _start(void) {}
+ \\zig_noreturn void _start(void) {}
\\
);
ctx.c("less empty start function", linux_x64,
@@ -22,19 +22,19 @@ pub fn addCases(ctx: *TestContext) !void {
\\ main();
\\}
,
- \\noreturn void main(void);
+ \\zig_noreturn void main(void);
\\
- \\noreturn void _start(void) {
+ \\zig_noreturn void _start(void) {
\\ main();
\\}
\\
- \\noreturn void main(void) {}
+ \\zig_noreturn void main(void) {}
\\
);
// TODO: implement return values
// TODO: figure out a way to prevent asm constants from being generated
ctx.c("inline asm", linux_x64,
- \\fn exitGood() void {
+ \\fn exitGood() noreturn {
\\ asm volatile ("syscall"
\\ :
\\ : [number] "{rax}" (231),
@@ -48,21 +48,92 @@ pub fn addCases(ctx: *TestContext) !void {
,
\\#include <stddef.h>
\\
- \\void exitGood(void);
+ \\zig_noreturn void exitGood(void);
\\
\\const char *const exitGood__anon_0 = "{rax}";
\\const char *const exitGood__anon_1 = "{rdi}";
\\const char *const exitGood__anon_2 = "syscall";
\\
- \\noreturn void _start(void) {
+ \\zig_noreturn void _start(void) {
\\ exitGood();
\\}
\\
- \\void exitGood(void) {
+ \\zig_noreturn void exitGood(void) {
\\ register size_t rax_constant __asm__("rax") = 231;
\\ register size_t rdi_constant __asm__("rdi") = 0;
\\ __asm volatile ("syscall" :: ""(rax_constant), ""(rdi_constant));
- \\ return;
+ \\}
+ \\
+ );
+ ctx.c("exit with parameter", linux_x64,
+ \\export fn _start() noreturn {
+ \\ exit(0);
+ \\}
+ \\
+ \\fn exit(code: usize) noreturn {
+ \\ asm volatile ("syscall"
+ \\ :
+ \\ : [number] "{rax}" (231),
+ \\ [arg1] "{rdi}" (code)
+ \\ );
+ \\ unreachable;
+ \\}
+ \\
+ ,
+ \\#include <stddef.h>
+ \\
+ \\zig_noreturn void exit(size_t arg0);
+ \\
+ \\const char *const exit__anon_0 = "{rax}";
+ \\const char *const exit__anon_1 = "{rdi}";
+ \\const char *const exit__anon_2 = "syscall";
+ \\
+ \\zig_noreturn void _start(void) {
+ \\ exit(0);
+ \\}
+ \\
+ \\zig_noreturn void exit(size_t arg0) {
+ \\ register size_t rax_constant __asm__("rax") = 231;
+ \\ register size_t rdi_constant __asm__("rdi") = arg0;
+ \\ __asm volatile ("syscall" :: ""(rax_constant), ""(rdi_constant));
+ \\ zig_unreachable();
+ \\}
+ \\
+ );
+ ctx.c("exit with u8 parameter", linux_x64,
+ \\export fn _start() noreturn {
+ \\ exit(0);
+ \\}
+ \\
+ \\fn exit(code: u8) noreturn {
+ \\ asm volatile ("syscall"
+ \\ :
+ \\ : [number] "{rax}" (231),
+ \\ [arg1] "{rdi}" (code)
+ \\ );
+ \\ unreachable;
+ \\}
+ \\
+ ,
+ \\#include <stddef.h>
+ \\#include <stdint.h>
+ \\
+ \\zig_noreturn void exit(uint8_t arg0);
+ \\
+ \\const char *const exit__anon_0 = "{rax}";
+ \\const char *const exit__anon_1 = "{rdi}";
+ \\const char *const exit__anon_2 = "syscall";
+ \\
+ \\zig_noreturn void _start(void) {
+ \\ exit(0);
+ \\}
+ \\
+ \\zig_noreturn void exit(uint8_t arg0) {
+ \\ const size_t __temp_0 = (size_t)arg0;
+ \\ register size_t rax_constant __asm__("rax") = 231;
+ \\ register size_t rdi_constant __asm__("rdi") = __temp_0;
+ \\ __asm volatile ("syscall" :: ""(rax_constant), ""(rdi_constant));
+ \\ zig_unreachable();
\\}
\\
);
diff --git a/test/stage2/compare_output.zig b/test/stage2/compare_output.zig
index bb3e542f13..29312a8f53 100644
--- a/test/stage2/compare_output.zig
+++ b/test/stage2/compare_output.zig
@@ -441,5 +441,29 @@ pub fn addCases(ctx: *TestContext) !void {
,
"",
);
+
+ // Optionals
+ case.addCompareOutput(
+ \\export fn _start() noreturn {
+ \\ 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;
+ \\}
+ ,
+ "",
+ );
}
}