authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2021-11-28 20:31:12+01:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2021-11-29 08:05:51+01:00
logadf059f272dfd3c1652bce774c0b6c204d5d6b8b
tree6069b21656f698de2e882a7f52a9ecb71dc5eaf1
parentdd49eca34274cd2396cbe06a199fe8db9e8faf79
signaturelock-open Commit is signed but in an unrecognized format.

wasm: Update wasm stage2 test backend to use 'main'


5 files changed, 215 insertions(+), 190 deletions(-)

lib/std/start.zig+1-1
...@@ -30,7 +30,7 @@ comptime {...@@ -30,7 +30,7 @@ comptime {
30 }30 }
31 } else if (builtin.os.tag == .windows) {31 } else if (builtin.os.tag == .windows) {
32 @export(wWinMainCRTStartup2, .{ .name = "wWinMainCRTStartup" });32 @export(wWinMainCRTStartup2, .{ .name = "wWinMainCRTStartup" });
33 } else if (builtin.os.tag == .wasi) {33 } else if (builtin.os.tag == .wasi and @hasDecl(root, "main")) {
34 @export(wasmMain2, .{ .name = "_start" });34 @export(wasmMain2, .{ .name = "_start" });
35 } else {35 } else {
36 if (!@hasDecl(root, "_start")) {36 if (!@hasDecl(root, "_start")) {
src/arch/wasm/CodeGen.zig+6-6
...@@ -812,7 +812,7 @@ pub fn genFunc(self: *Self) InnerError!Result {...@@ -812,7 +812,7 @@ pub fn genFunc(self: *Self) InnerError!Result {
812/// Generates the wasm bytecode for the declaration belonging to `Context`812/// Generates the wasm bytecode for the declaration belonging to `Context`
813pub fn genDecl(self: *Self, ty: Type, val: Value) InnerError!Result {813pub fn genDecl(self: *Self, ty: Type, val: Value) InnerError!Result {
814 if (val.isUndef()) {814 if (val.isUndef()) {
815 try self.code.appendNTimes(0xaa, ty.abiSize(self.target));815 try self.code.appendNTimes(0xaa, @intCast(usize, ty.abiSize(self.target)));
816 return Result.appended;816 return Result.appended;
817 }817 }
818 switch (ty.zigTypeTag()) {818 switch (ty.zigTypeTag()) {
...@@ -833,7 +833,7 @@ pub fn genDecl(self: *Self, ty: Type, val: Value) InnerError!Result {...@@ -833,7 +833,7 @@ pub fn genDecl(self: *Self, ty: Type, val: Value) InnerError!Result {
833 } else if (!val.isNull()) {833 } else if (!val.isNull()) {
834 return try self.genDecl(payload_type, val);834 return try self.genDecl(payload_type, val);
835 } else {835 } else {
836 try self.code.appendNTimes(0, ty.abiSize(self.target));836 try self.code.appendNTimes(0, @intCast(usize, ty.abiSize(self.target)));
837 return Result.appended;837 return Result.appended;
838 }838 }
839 }839 }
...@@ -882,7 +882,7 @@ pub fn genDecl(self: *Self, ty: Type, val: Value) InnerError!Result {...@@ -882,7 +882,7 @@ pub fn genDecl(self: *Self, ty: Type, val: Value) InnerError!Result {
882 },882 },
883 .Int => {883 .Int => {
884 const info = ty.intInfo(self.target);884 const info = ty.intInfo(self.target);
885 const abi_size = ty.abiSize(self.target);885 const abi_size = @intCast(usize, ty.abiSize(self.target));
886 // todo: Implement integer sizes larger than 64bits886 // todo: Implement integer sizes larger than 64bits
887 if (info.bits > 64) return self.fail("TODO: Implement genDecl for integer bit size: {d}", .{info.bits});887 if (info.bits > 64) return self.fail("TODO: Implement genDecl for integer bit size: {d}", .{info.bits});
888 var buf: [8]u8 = undefined;888 var buf: [8]u8 = undefined;
...@@ -916,8 +916,8 @@ pub fn genDecl(self: *Self, ty: Type, val: Value) InnerError!Result {...@@ -916,8 +916,8 @@ pub fn genDecl(self: *Self, ty: Type, val: Value) InnerError!Result {
916 },916 },
917 .Union => {917 .Union => {
918 // TODO: Implement Union declarations918 // TODO: Implement Union declarations
919 const abi_size = ty.abiSize(self.target);919 const abi_size = @intCast(usize, ty.abiSize(self.target));
920 try self.code.writer().writeByteNTimes(0xaa, abi_size);920 try self.code.appendNTimes(0xaa, abi_size);
921 return Result.appended;921 return Result.appended;
922 },922 },
923 .Pointer => switch (val.tag()) {923 .Pointer => switch (val.tag()) {
...@@ -973,7 +973,7 @@ fn lowerDeclRef(self: *Self, decl: *Module.Decl) InnerError!Result {...@@ -973,7 +973,7 @@ fn lowerDeclRef(self: *Self, decl: *Module.Decl) InnerError!Result {
973 .relocation_type = .R_WASM_MEMORY_ADDR_I32,973 .relocation_type = .R_WASM_MEMORY_ADDR_I32,
974 });974 });
975 }975 }
976 const ptr_width = self.target.cpu.arch.ptrBitWidth() / 8;976 const ptr_width = @intCast(usize, self.target.cpu.arch.ptrBitWidth() / 8);
977 try self.code.appendNTimes(0xaa, ptr_width);977 try self.code.appendNTimes(0xaa, ptr_width);
978978
979 return Result.appended;979 return Result.appended;
test/cases.zig+1-1
...@@ -26,7 +26,7 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -26,7 +26,7 @@ pub fn addCases(ctx: *TestContext) !void {
26 var case = ctx.exe("hello world with updates", linux_x64);26 var case = ctx.exe("hello world with updates", linux_x64);
2727
28 case.addError("", &[_][]const u8{28 case.addError("", &[_][]const u8{
29 ":97:9: error: struct 'tmp.tmp' has no member named 'main'",29 ":99:9: error: struct 'tmp.tmp' has no member named 'main'",
30 });30 });
3131
32 // Incorrect return type32 // Incorrect return type
test/stage2/darwin.zig+1-1
...@@ -14,7 +14,7 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -14,7 +14,7 @@ pub fn addCases(ctx: *TestContext) !void {
14 {14 {
15 var case = ctx.exe("darwin hello world with updates", target);15 var case = ctx.exe("darwin hello world with updates", target);
16 case.addError("", &[_][]const u8{16 case.addError("", &[_][]const u8{
17 ":97:9: error: struct 'tmp.tmp' has no member named 'main'",17 ":99:9: error: struct 'tmp.tmp' has no member named 'main'",
18 });18 });
1919
20 // Incorrect return type20 // Incorrect return type
test/stage2/wasm.zig+206-181
...@@ -11,7 +11,7 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -11,7 +11,7 @@ pub fn addCases(ctx: *TestContext) !void {
11 var case = ctx.exe("wasm function calls", wasi);11 var case = ctx.exe("wasm function calls", wasi);
1212
13 case.addCompareOutput(13 case.addCompareOutput(
14 \\pub export fn _start() u32 {14 \\pub fn main() u8 {
15 \\ foo();15 \\ foo();
16 \\ bar();16 \\ bar();
17 \\ return 42;17 \\ return 42;
...@@ -26,7 +26,7 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -26,7 +26,7 @@ pub fn addCases(ctx: *TestContext) !void {
26 );26 );
2727
28 case.addCompareOutput(28 case.addCompareOutput(
29 \\pub export fn _start() i64 {29 \\pub fn main() u8 {
30 \\ bar();30 \\ bar();
31 \\ foo();31 \\ foo();
32 \\ foo();32 \\ foo();
...@@ -44,10 +44,10 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -44,10 +44,10 @@ pub fn addCases(ctx: *TestContext) !void {
44 );44 );
4545
46 case.addCompareOutput(46 case.addCompareOutput(
47 \\pub export fn _start() f32 {47 \\pub fn main() void {
48 \\ bar();48 \\ bar();
49 \\ foo();49 \\ foo();
50 \\ return 42.0;50 \\ return;
51 \\}51 \\}
52 \\fn foo() void {52 \\fn foo() void {
53 \\ bar();53 \\ bar();
...@@ -56,15 +56,15 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -56,15 +56,15 @@ pub fn addCases(ctx: *TestContext) !void {
56 \\}56 \\}
57 \\fn bar() void {}57 \\fn bar() void {}
58 ,58 ,
59 "42\n",59 "0\n",
60 );60 );
6161
62 case.addCompareOutput(62 case.addCompareOutput(
63 \\pub export fn _start() u32 {63 \\pub fn main() u8 {
64 \\ foo(10, 20);64 \\ foo(10, 20);
65 \\ return 5;65 \\ return 5;
66 \\}66 \\}
67 \\fn foo(x: u32, y: u32) void { _ = x; _ = y; }67 \\fn foo(x: u8, y: u8) void { _ = x; _ = y; }
68 , "5\n");68 , "5\n");
69 }69 }
7070
...@@ -72,10 +72,10 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -72,10 +72,10 @@ pub fn addCases(ctx: *TestContext) !void {
72 var case = ctx.exe("wasm locals", wasi);72 var case = ctx.exe("wasm locals", wasi);
7373
74 case.addCompareOutput(74 case.addCompareOutput(
75 \\pub export fn _start() u32 {75 \\pub fn main() u8 {
76 \\ var i: u32 = 5;76 \\ var i: u8 = 5;
77 \\ var y: f32 = 42.0;77 \\ var y: f32 = 42.0;
78 \\ var x: u32 = 10;78 \\ var x: u8 = 10;
79 \\ if (false) {79 \\ if (false) {
80 \\ y;80 \\ y;
81 \\ x;81 \\ x;
...@@ -85,18 +85,18 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -85,18 +85,18 @@ pub fn addCases(ctx: *TestContext) !void {
85 , "5\n");85 , "5\n");
8686
87 case.addCompareOutput(87 case.addCompareOutput(
88 \\pub export fn _start() u32 {88 \\pub fn main() u8 {
89 \\ var i: u32 = 5;89 \\ var i: u8 = 5;
90 \\ var y: f32 = 42.0;90 \\ var y: f32 = 42.0;
91 \\ _ = y;91 \\ _ = y;
92 \\ var x: u32 = 10;92 \\ var x: u8 = 10;
93 \\ foo(i, x);93 \\ foo(i, x);
94 \\ i = x;94 \\ i = x;
95 \\ return i;95 \\ return i;
96 \\}96 \\}
97 \\fn foo(x: u32, y: u32) void {97 \\fn foo(x: u8, y: u8) void {
98 \\ _ = y;98 \\ _ = y;
99 \\ var i: u32 = 10;99 \\ var i: u8 = 10;
100 \\ i = x;100 \\ i = x;
101 \\}101 \\}
102 , "10\n");102 , "10\n");
...@@ -106,228 +106,246 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -106,228 +106,246 @@ pub fn addCases(ctx: *TestContext) !void {
106 var case = ctx.exe("wasm binary operands", wasi);106 var case = ctx.exe("wasm binary operands", wasi);
107107
108 case.addCompareOutput(108 case.addCompareOutput(
109 \\pub export fn _start() u32 {109 \\pub fn main() u8 {
110 \\ var i: u32 = 5;110 \\ var i: u8 = 5;
111 \\ i += 20;111 \\ i += 20;
112 \\ return i;112 \\ return i;
113 \\}113 \\}
114 , "25\n");114 , "25\n");
115115
116 case.addCompareOutput(116 case.addCompareOutput(
117 \\pub export fn _start() i32 {117 \\pub fn main() void {
118 \\ var i: i32 = 2147483647;118 \\ var i: i32 = 2147483647;
119 \\ return i +% 1;119 \\ if (i +% 1 != -2147483648) unreachable;
120 \\ return;
120 \\}121 \\}
121 , "-2147483648\n");122 , "0\n");
122123
123 case.addCompareOutput(124 case.addCompareOutput(
124 \\pub export fn _start() i32 {125 \\pub fn main() void {
125 \\ var i: i4 = 7;126 \\ var i: i4 = 7;
126 \\ return i +% 1;127 \\ if (i +% 1 != 0) unreachable;
128 \\ return;
127 \\}129 \\}
128 , "0\n");130 , "0\n");
129131
130 case.addCompareOutput(132 case.addCompareOutput(
131 \\pub export fn _start() u32 {133 \\pub fn main() u8 {
132 \\ var i: u8 = 255;134 \\ var i: u8 = 255;
133 \\ return i +% 1;135 \\ return i +% 1;
134 \\}136 \\}
135 , "0\n");137 , "0\n");
136138
137 case.addCompareOutput(139 case.addCompareOutput(
138 \\pub export fn _start() u32 {140 \\pub fn main() u8 {
139 \\ var i: u32 = 5;141 \\ var i: u8 = 5;
140 \\ i += 20;142 \\ i += 20;
141 \\ var result: u32 = foo(i, 10);143 \\ var result: u8 = foo(i, 10);
142 \\ return result;144 \\ return result;
143 \\}145 \\}
144 \\fn foo(x: u32, y: u32) u32 {146 \\fn foo(x: u8, y: u8) u8 {
145 \\ return x + y;147 \\ return x + y;
146 \\}148 \\}
147 , "35\n");149 , "35\n");
148150
149 case.addCompareOutput(151 case.addCompareOutput(
150 \\pub export fn _start() u32 {152 \\pub fn main() u8 {
151 \\ var i: u32 = 20;153 \\ var i: u8 = 20;
152 \\ i -= 5;154 \\ i -= 5;
153 \\ return i;155 \\ return i;
154 \\}156 \\}
155 , "15\n");157 , "15\n");
156158
157 case.addCompareOutput(159 case.addCompareOutput(
158 \\pub export fn _start() i32 {160 \\pub fn main() void {
159 \\ var i: i32 = -2147483648;161 \\ var i: i32 = -2147483648;
160 \\ return i -% 1;162 \\ if (i -% 1 != 2147483647) unreachable;
163 \\ return;
161 \\}164 \\}
162 , "2147483647\n");165 , "0\n");
163166
164 case.addCompareOutput(167 case.addCompareOutput(
165 \\pub export fn _start() i32 {168 \\pub fn main() void {
166 \\ var i: i7 = -64;169 \\ var i: i7 = -64;
167 \\ return i -% 1;170 \\ if (i -% 1 != 63) unreachable;
171 \\ return;
168 \\}172 \\}
169 , "63\n");173 , "0\n");
170174
171 case.addCompareOutput(175 case.addCompareOutput(
172 \\pub export fn _start() u32 {176 \\pub fn main() u8 {
173 \\ var i: u4 = 0;177 \\ var i: u4 = 0;
174 \\ return i -% 1;178 \\ return i -% 1;
175 \\}179 \\}
176 , "15\n");180 , "15\n");
177181
178 case.addCompareOutput(182 case.addCompareOutput(
179 \\pub export fn _start() u32 {183 \\pub fn main() u8 {
180 \\ var i: u32 = 5;184 \\ var i: u8 = 5;
181 \\ i -= 3;185 \\ i -= 3;
182 \\ var result: u32 = foo(i, 10);186 \\ var result: u8 = foo(i, 10);
183 \\ return result;187 \\ return result;
184 \\}188 \\}
185 \\fn foo(x: u32, y: u32) u32 {189 \\fn foo(x: u8, y: u8) u8 {
186 \\ return y - x;190 \\ return y - x;
187 \\}191 \\}
188 , "8\n");192 , "8\n");
189193
190 case.addCompareOutput(194 case.addCompareOutput(
191 \\pub export fn _start() u32 {195 \\pub fn main() void {
192 \\ var i: u32 = 5;196 \\ var i: u32 = 5;
193 \\ i *= 7;197 \\ i *= 7;
194 \\ var result: u32 = foo(i, 10);198 \\ var result: u32 = foo(i, 10);
195 \\ return result;199 \\ if (result != 350) unreachable;
200 \\ return;
196 \\}201 \\}
197 \\fn foo(x: u32, y: u32) u32 {202 \\fn foo(x: u32, y: u32) u32 {
198 \\ return x * y;203 \\ return x * y;
199 \\}204 \\}
200 , "350\n");205 , "0\n");
201206
202 case.addCompareOutput(207 case.addCompareOutput(
203 \\pub export fn _start() i32 {208 \\pub fn main() void {
204 \\ var i: i32 = 2147483647;209 \\ var i: i32 = 2147483647;
205 \\ return i *% 2;210 \\ const result = i *% 2;
211 \\ if (result != -2) unreachable;
212 \\ return;
206 \\}213 \\}
207 , "-2\n");214 , "0\n");
208215
209 case.addCompareOutput(216 case.addCompareOutput(
210 \\pub export fn _start() u32 {217 \\pub fn main() void {
211 \\ var i: u3 = 3;218 \\ var i: u3 = 3;
212 \\ return i *% 3;219 \\ if (i *% 3 != 1) unreachable;
220 \\ return;
213 \\}221 \\}
214 , "1\n");222 , "0\n");
215223
216 case.addCompareOutput(224 case.addCompareOutput(
217 \\pub export fn _start() i32 {225 \\pub fn main() void {
218 \\ var i: i4 = 3;226 \\ var i: i4 = 3;
219 \\ return i *% 3;227 \\ if (i *% 3 != 1) unreachable;
228 \\ return;
220 \\}229 \\}
221 , "1\n");230 , "0\n");
222231
223 case.addCompareOutput(232 case.addCompareOutput(
224 \\pub export fn _start() u32 {233 \\pub fn main() void {
225 \\ var i: u32 = 352;234 \\ var i: u32 = 352;
226 \\ i /= 7; // i = 50235 \\ i /= 7; // i = 50
227 \\ var result: u32 = foo(i, 7);236 \\ var result: u32 = foo(i, 7);
228 \\ return result;237 \\ if (result != 7) unreachable;
238 \\ return;
229 \\}239 \\}
230 \\fn foo(x: u32, y: u32) u32 {240 \\fn foo(x: u32, y: u32) u32 {
231 \\ return x / y;241 \\ return x / y;
232 \\}242 \\}
233 , "7\n");243 , "0\n");
234244
235 case.addCompareOutput(245 case.addCompareOutput(
236 \\pub export fn _start() u32 {246 \\pub fn main() u8 {
237 \\ var i: u32 = 5;247 \\ var i: u8 = 5;
238 \\ i &= 6;248 \\ i &= 6;
239 \\ return i;249 \\ return i;
240 \\}250 \\}
241 , "4\n");251 , "4\n");
242252
243 case.addCompareOutput(253 case.addCompareOutput(
244 \\pub export fn _start() u32 {254 \\pub fn main() u8 {
245 \\ var i: u32 = 5;255 \\ var i: u8 = 5;
246 \\ i |= 6;256 \\ i |= 6;
247 \\ return i;257 \\ return i;
248 \\}258 \\}
249 , "7\n");259 , "7\n");
250260
251 case.addCompareOutput(261 case.addCompareOutput(
252 \\pub export fn _start() u32 {262 \\pub fn main() u8 {
253 \\ var i: u32 = 5;263 \\ var i: u8 = 5;
254 \\ i ^= 6;264 \\ i ^= 6;
255 \\ return i;265 \\ return i;
256 \\}266 \\}
257 , "3\n");267 , "3\n");
258268
259 case.addCompareOutput(269 case.addCompareOutput(
260 \\pub export fn _start() bool {270 \\pub fn main() void {
261 \\ var b: bool = false;271 \\ var b: bool = false;
262 \\ b = b or false;272 \\ b = b or false;
263 \\ return b;273 \\ if (b) unreachable;
274 \\ return;
264 \\}275 \\}
265 , "0\n");276 , "0\n");
266277
267 case.addCompareOutput(278 case.addCompareOutput(
268 \\pub export fn _start() bool {279 \\pub fn main() void {
269 \\ var b: bool = true;280 \\ var b: bool = true;
270 \\ b = b or false;281 \\ b = b or false;
271 \\ return b;282 \\ if (!b) unreachable;
283 \\ return;
272 \\}284 \\}
273 , "1\n");285 , "0\n");
274286
275 case.addCompareOutput(287 case.addCompareOutput(
276 \\pub export fn _start() bool {288 \\pub fn main() void {
277 \\ var b: bool = false;289 \\ var b: bool = false;
278 \\ b = b or true;290 \\ b = b or true;
279 \\ return b;291 \\ if (!b) unreachable;
292 \\ return;
280 \\}293 \\}
281 , "1\n");294 , "0\n");
282295
283 case.addCompareOutput(296 case.addCompareOutput(
284 \\pub export fn _start() bool {297 \\pub fn main() void {
285 \\ var b: bool = true;298 \\ var b: bool = true;
286 \\ b = b or true;299 \\ b = b or true;
287 \\ return b;300 \\ if (!b) unreachable;
301 \\ return;
288 \\}302 \\}
289 , "1\n");303 , "0\n");
290304
291 case.addCompareOutput(305 case.addCompareOutput(
292 \\pub export fn _start() bool {306 \\pub fn main() void {
293 \\ var b: bool = false;307 \\ var b: bool = false;
294 \\ b = b and false;308 \\ b = b and false;
295 \\ return b;309 \\ if (b) unreachable;
310 \\ return;
296 \\}311 \\}
297 , "0\n");312 , "0\n");
298313
299 case.addCompareOutput(314 case.addCompareOutput(
300 \\pub export fn _start() bool {315 \\pub fn main() void {
301 \\ var b: bool = true;316 \\ var b: bool = true;
302 \\ b = b and false;317 \\ b = b and false;
303 \\ return b;318 \\ if (b) unreachable;
319 \\ return;
304 \\}320 \\}
305 , "0\n");321 , "0\n");
306322
307 case.addCompareOutput(323 case.addCompareOutput(
308 \\pub export fn _start() bool {324 \\pub fn main() void {
309 \\ var b: bool = false;325 \\ var b: bool = false;
310 \\ b = b and true;326 \\ b = b and true;
311 \\ return b;327 \\ if (b) unreachable;
328 \\ return;
312 \\}329 \\}
313 , "0\n");330 , "0\n");
314331
315 case.addCompareOutput(332 case.addCompareOutput(
316 \\pub export fn _start() bool {333 \\pub fn main() void {
317 \\ var b: bool = true;334 \\ var b: bool = true;
318 \\ b = b and true;335 \\ b = b and true;
319 \\ return b;336 \\ if (!b) unreachable;
337 \\ return;
320 \\}338 \\}
321 , "1\n");339 , "0\n");
322 }340 }
323341
324 {342 {
325 var case = ctx.exe("wasm conditions", wasi);343 var case = ctx.exe("wasm conditions", wasi);
326344
327 case.addCompareOutput(345 case.addCompareOutput(
328 \\pub export fn _start() u32 {346 \\pub fn main() u8 {
329 \\ var i: u32 = 5;347 \\ var i: u8 = 5;
330 \\ if (i > @as(u32, 4)) {348 \\ if (i > @as(u8, 4)) {
331 \\ i += 10;349 \\ i += 10;
332 \\ }350 \\ }
333 \\ return i;351 \\ return i;
...@@ -335,9 +353,9 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -335,9 +353,9 @@ pub fn addCases(ctx: *TestContext) !void {
335 , "15\n");353 , "15\n");
336354
337 case.addCompareOutput(355 case.addCompareOutput(
338 \\pub export fn _start() u32 {356 \\pub fn main() u8 {
339 \\ var i: u32 = 5;357 \\ var i: u8 = 5;
340 \\ if (i < @as(u32, 4)) {358 \\ if (i < @as(u8, 4)) {
341 \\ i += 10;359 \\ i += 10;
342 \\ } else {360 \\ } else {
343 \\ i = 2;361 \\ i = 2;
...@@ -347,11 +365,11 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -347,11 +365,11 @@ pub fn addCases(ctx: *TestContext) !void {
347 , "2\n");365 , "2\n");
348366
349 case.addCompareOutput(367 case.addCompareOutput(
350 \\pub export fn _start() u32 {368 \\pub fn main() u8 {
351 \\ var i: u32 = 5;369 \\ var i: u8 = 5;
352 \\ if (i < @as(u32, 4)) {370 \\ if (i < @as(u8, 4)) {
353 \\ i += 10;371 \\ i += 10;
354 \\ } else if(i == @as(u32, 5)) {372 \\ } else if(i == @as(u8, 5)) {
355 \\ i = 20;373 \\ i = 20;
356 \\ }374 \\ }
357 \\ return i;375 \\ return i;
...@@ -359,12 +377,12 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -359,12 +377,12 @@ pub fn addCases(ctx: *TestContext) !void {
359 , "20\n");377 , "20\n");
360378
361 case.addCompareOutput(379 case.addCompareOutput(
362 \\pub export fn _start() u32 {380 \\pub fn main() u8 {
363 \\ var i: u32 = 11;381 \\ var i: u8 = 11;
364 \\ if (i < @as(u32, 4)) {382 \\ if (i < @as(u8, 4)) {
365 \\ i += 10;383 \\ i += 10;
366 \\ } else {384 \\ } else {
367 \\ if (i > @as(u32, 10)) {385 \\ if (i > @as(u8, 10)) {
368 \\ i += 20;386 \\ i += 20;
369 \\ } else {387 \\ } else {
370 \\ i = 20;388 \\ i = 20;
...@@ -375,7 +393,7 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -375,7 +393,7 @@ pub fn addCases(ctx: *TestContext) !void {
375 , "31\n");393 , "31\n");
376394
377 case.addCompareOutput(395 case.addCompareOutput(
378 \\pub export fn _start() void {396 \\pub fn main() void {
379 \\ assert(foo(true) != @as(i32, 30));397 \\ assert(foo(true) != @as(i32, 30));
380 \\}398 \\}
381 \\399 \\
...@@ -387,10 +405,10 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -387,10 +405,10 @@ pub fn addCases(ctx: *TestContext) !void {
387 \\ const x = if(ok) @as(i32, 20) else @as(i32, 10);405 \\ const x = if(ok) @as(i32, 20) else @as(i32, 10);
388 \\ return x;406 \\ return x;
389 \\}407 \\}
390 , "");408 , "0\n");
391409
392 case.addCompareOutput(410 case.addCompareOutput(
393 \\pub export fn _start() void {411 \\pub fn main() void {
394 \\ assert(foo(false) == @as(i32, 20));412 \\ assert(foo(false) == @as(i32, 20));
395 \\ assert(foo(true) == @as(i32, 30));413 \\ assert(foo(true) == @as(i32, 30));
396 \\}414 \\}
...@@ -407,16 +425,16 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -407,16 +425,16 @@ pub fn addCases(ctx: *TestContext) !void {
407 \\ };425 \\ };
408 \\ return val + 10;426 \\ return val + 10;
409 \\}427 \\}
410 , "");428 , "0\n");
411 }429 }
412430
413 {431 {
414 var case = ctx.exe("wasm while loops", wasi);432 var case = ctx.exe("wasm while loops", wasi);
415433
416 case.addCompareOutput(434 case.addCompareOutput(
417 \\pub export fn _start() u32 {435 \\pub fn main() u8 {
418 \\ var i: u32 = 0;436 \\ var i: u8 = 0;
419 \\ while(i < @as(u32, 5)){437 \\ while(i < @as(u8, 5)){
420 \\ i += 1;438 \\ i += 1;
421 \\ }439 \\ }
422 \\440 \\
...@@ -425,10 +443,10 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -425,10 +443,10 @@ pub fn addCases(ctx: *TestContext) !void {
425 , "5\n");443 , "5\n");
426444
427 case.addCompareOutput(445 case.addCompareOutput(
428 \\pub export fn _start() u32 {446 \\pub fn main() u8 {
429 \\ var i: u32 = 0;447 \\ var i: u8 = 0;
430 \\ while(i < @as(u32, 10)){448 \\ while(i < @as(u8, 10)){
431 \\ var x: u32 = 1;449 \\ var x: u8 = 1;
432 \\ i += x;450 \\ i += x;
433 \\ }451 \\ }
434 \\ return i;452 \\ return i;
...@@ -436,12 +454,12 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -436,12 +454,12 @@ pub fn addCases(ctx: *TestContext) !void {
436 , "10\n");454 , "10\n");
437455
438 case.addCompareOutput(456 case.addCompareOutput(
439 \\pub export fn _start() u32 {457 \\pub fn main() u8 {
440 \\ var i: u32 = 0;458 \\ var i: u8 = 0;
441 \\ while(i < @as(u32, 10)){459 \\ while(i < @as(u8, 10)){
442 \\ var x: u32 = 1;460 \\ var x: u8 = 1;
443 \\ i += x;461 \\ i += x;
444 \\ if (i == @as(u32, 5)) break;462 \\ if (i == @as(u8, 5)) break;
445 \\ }463 \\ }
446 \\ return i;464 \\ return i;
447 \\}465 \\}
...@@ -454,7 +472,7 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -454,7 +472,7 @@ pub fn addCases(ctx: *TestContext) !void {
454 case.addCompareOutput(472 case.addCompareOutput(
455 \\const Number = enum { One, Two, Three };473 \\const Number = enum { One, Two, Three };
456 \\474 \\
457 \\pub export fn _start() i32 {475 \\pub fn main() void {
458 \\ var number1 = Number.One;476 \\ var number1 = Number.One;
459 \\ var number2: Number = .Two;477 \\ var number2: Number = .Two;
460 \\ if (false) {478 \\ if (false) {
...@@ -462,47 +480,52 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -462,47 +480,52 @@ pub fn addCases(ctx: *TestContext) !void {
462 \\ number2;480 \\ number2;
463 \\ }481 \\ }
464 \\ const number3 = @intToEnum(Number, 2);482 \\ const number3 = @intToEnum(Number, 2);
465 \\483 \\ if (@enumToInt(number3) != 2) {
466 \\ return @enumToInt(number3);484 \\ unreachable;
485 \\ }
486 \\ return;
467 \\}487 \\}
468 , "2\n");488 , "0\n");
469489
470 case.addCompareOutput(490 case.addCompareOutput(
471 \\const Number = enum { One, Two, Three };491 \\const Number = enum { One, Two, Three };
472 \\492 \\
473 \\pub export fn _start() i32 {493 \\pub fn main() void {
474 \\ var number1 = Number.One;494 \\ var number1 = Number.One;
475 \\ var number2: Number = .Two;495 \\ var number2: Number = .Two;
476 \\ const number3 = @intToEnum(Number, 2);496 \\ const number3 = @intToEnum(Number, 2);
477 \\ if (number1 == number2) return 1;497 \\ assert(number1 != number2);
478 \\ if (number2 == number3) return 1;498 \\ assert(number2 != number3);
479 \\ if (@enumToInt(number1) != 0) return 1;499 \\ assert(@enumToInt(number1) == 0);
480 \\ if (@enumToInt(number2) != 1) return 1;500 \\ assert(@enumToInt(number2) == 1);
481 \\ if (@enumToInt(number3) != 2) return 1;501 \\ assert(@enumToInt(number3) == 2);
482 \\ var x: Number = .Two;502 \\ var x: Number = .Two;
483 \\ if (number2 != x) return 1;503 \\ assert(number2 == x);
484 \\504 \\
485 \\ return @enumToInt(number3);505 \\ return;
486 \\}506 \\}
487 , "2\n");507 \\fn assert(val: bool) void {
508 \\ if(!val) unreachable;
509 \\}
510 , "0\n");
488 }511 }
489512
490 {513 {
491 var case = ctx.exe("wasm structs", wasi);514 var case = ctx.exe("wasm structs", wasi);
492515
493 case.addCompareOutput(516 case.addCompareOutput(
494 \\const Example = struct { x: u32 };517 \\const Example = struct { x: u8 };
495 \\518 \\
496 \\pub export fn _start() u32 {519 \\pub fn main() u8 {
497 \\ var example: Example = .{ .x = 5 };520 \\ var example: Example = .{ .x = 5 };
498 \\ return example.x;521 \\ return example.x;
499 \\}522 \\}
500 , "5\n");523 , "5\n");
501524
502 case.addCompareOutput(525 case.addCompareOutput(
503 \\const Example = struct { x: u32 };526 \\const Example = struct { x: u8 };
504 \\527 \\
505 \\pub export fn _start() u32 {528 \\pub fn main() u8 {
506 \\ var example: Example = .{ .x = 5 };529 \\ var example: Example = .{ .x = 5 };
507 \\ example.x = 10;530 \\ example.x = 10;
508 \\ return example.x;531 \\ return example.x;
...@@ -510,18 +533,18 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -510,18 +533,18 @@ pub fn addCases(ctx: *TestContext) !void {
510 , "10\n");533 , "10\n");
511534
512 case.addCompareOutput(535 case.addCompareOutput(
513 \\const Example = struct { x: u32, y: u32 };536 \\const Example = struct { x: u8, y: u8 };
514 \\537 \\
515 \\pub export fn _start() u32 {538 \\pub fn main() u8 {
516 \\ var example: Example = .{ .x = 5, .y = 10 };539 \\ var example: Example = .{ .x = 5, .y = 10 };
517 \\ return example.y + example.x;540 \\ return example.y + example.x;
518 \\}541 \\}
519 , "15\n");542 , "15\n");
520543
521 case.addCompareOutput(544 case.addCompareOutput(
522 \\const Example = struct { x: u32, y: u32 };545 \\const Example = struct { x: u8, y: u8 };
523 \\546 \\
524 \\pub export fn _start() u32 {547 \\pub fn main() u8 {
525 \\ var example: Example = .{ .x = 5, .y = 10 };548 \\ var example: Example = .{ .x = 5, .y = 10 };
526 \\ var example2: Example = .{ .x = 10, .y = 20 };549 \\ var example2: Example = .{ .x = 10, .y = 20 };
527 \\550 \\
...@@ -531,9 +554,9 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -531,9 +554,9 @@ pub fn addCases(ctx: *TestContext) !void {
531 , "30\n");554 , "30\n");
532555
533 case.addCompareOutput(556 case.addCompareOutput(
534 \\const Example = struct { x: u32, y: u32 };557 \\const Example = struct { x: u8, y: u8 };
535 \\558 \\
536 \\pub export fn _start() u32 {559 \\pub fn main() u8 {
537 \\ var example: Example = .{ .x = 5, .y = 10 };560 \\ var example: Example = .{ .x = 5, .y = 10 };
538 \\561 \\
539 \\ example = .{ .x = 10, .y = 20 };562 \\ example = .{ .x = 10, .y = 20 };
...@@ -546,9 +569,9 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -546,9 +569,9 @@ pub fn addCases(ctx: *TestContext) !void {
546 var case = ctx.exe("wasm switch", wasi);569 var case = ctx.exe("wasm switch", wasi);
547570
548 case.addCompareOutput(571 case.addCompareOutput(
549 \\pub export fn _start() u32 {572 \\pub fn main() u8 {
550 \\ var val: u32 = 1;573 \\ var val: u8 = 1;
551 \\ var a: u32 = switch (val) {574 \\ var a: u8 = switch (val) {
552 \\ 0, 1 => 2,575 \\ 0, 1 => 2,
553 \\ 2 => 3,576 \\ 2 => 3,
554 \\ 3 => 4,577 \\ 3 => 4,
...@@ -560,9 +583,9 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -560,9 +583,9 @@ pub fn addCases(ctx: *TestContext) !void {
560 , "2\n");583 , "2\n");
561584
562 case.addCompareOutput(585 case.addCompareOutput(
563 \\pub export fn _start() u32 {586 \\pub fn main() u8 {
564 \\ var val: u32 = 2;587 \\ var val: u8 = 2;
565 \\ var a: u32 = switch (val) {588 \\ var a: u8 = switch (val) {
566 \\ 0, 1 => 2,589 \\ 0, 1 => 2,
567 \\ 2 => 3,590 \\ 2 => 3,
568 \\ 3 => 4,591 \\ 3 => 4,
...@@ -574,9 +597,9 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -574,9 +597,9 @@ pub fn addCases(ctx: *TestContext) !void {
574 , "3\n");597 , "3\n");
575598
576 case.addCompareOutput(599 case.addCompareOutput(
577 \\pub export fn _start() u32 {600 \\pub fn main() u8 {
578 \\ var val: u32 = 10;601 \\ var val: u8 = 10;
579 \\ var a: u32 = switch (val) {602 \\ var a: u8 = switch (val) {
580 \\ 0, 1 => 2,603 \\ 0, 1 => 2,
581 \\ 2 => 3,604 \\ 2 => 3,
582 \\ 3 => 4,605 \\ 3 => 4,
...@@ -590,9 +613,9 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -590,9 +613,9 @@ pub fn addCases(ctx: *TestContext) !void {
590 case.addCompareOutput(613 case.addCompareOutput(
591 \\const MyEnum = enum { One, Two, Three };614 \\const MyEnum = enum { One, Two, Three };
592 \\615 \\
593 \\pub export fn _start() u32 {616 \\pub fn main() u8 {
594 \\ var val: MyEnum = .Two;617 \\ var val: MyEnum = .Two;
595 \\ var a: u32 = switch (val) {618 \\ var a: u8 = switch (val) {
596 \\ .One => 1,619 \\ .One => 1,
597 \\ .Two => 2,620 \\ .Two => 2,
598 \\ .Three => 3,621 \\ .Three => 3,
...@@ -607,7 +630,7 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -607,7 +630,7 @@ pub fn addCases(ctx: *TestContext) !void {
607 var case = ctx.exe("wasm error unions", wasi);630 var case = ctx.exe("wasm error unions", wasi);
608631
609 case.addCompareOutput(632 case.addCompareOutput(
610 \\pub export fn _start() void {633 \\pub fn main() void {
611 \\ var e1 = error.Foo;634 \\ var e1 = error.Foo;
612 \\ var e2 = error.Bar;635 \\ var e2 = error.Bar;
613 \\ assert(e1 != e2);636 \\ assert(e1 != e2);
...@@ -618,32 +641,32 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -618,32 +641,32 @@ pub fn addCases(ctx: *TestContext) !void {
618 \\fn assert(b: bool) void {641 \\fn assert(b: bool) void {
619 \\ if (!b) unreachable;642 \\ if (!b) unreachable;
620 \\}643 \\}
621 , "");644 , "0\n");
622645
623 case.addCompareOutput(646 case.addCompareOutput(
624 \\pub export fn _start() u32 {647 \\pub fn main() u8 {
625 \\ var e: anyerror!u32 = 5;648 \\ var e: anyerror!u8 = 5;
626 \\ const i = e catch 10;649 \\ const i = e catch 10;
627 \\ return i;650 \\ return i;
628 \\}651 \\}
629 , "5\n");652 , "5\n");
630653
631 case.addCompareOutput(654 case.addCompareOutput(
632 \\pub export fn _start() u32 {655 \\pub fn main() u8 {
633 \\ var e: anyerror!u32 = error.Foo;656 \\ var e: anyerror!u8 = error.Foo;
634 \\ const i = e catch 10;657 \\ const i = e catch 10;
635 \\ return i;658 \\ return i;
636 \\}659 \\}
637 , "10\n");660 , "10\n");
638661
639 case.addCompareOutput(662 case.addCompareOutput(
640 \\pub export fn _start() u32 {663 \\pub fn main() u8 {
641 \\ var e = foo();664 \\ var e = foo();
642 \\ const i = e catch 69;665 \\ const i = e catch 69;
643 \\ return i;666 \\ return i;
644 \\}667 \\}
645 \\668 \\
646 \\fn foo() anyerror!u32 {669 \\fn foo() anyerror!u8 {
647 \\ return 5;670 \\ return 5;
648 \\}671 \\}
649 , "5\n");672 , "5\n");
...@@ -653,24 +676,24 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -653,24 +676,24 @@ pub fn addCases(ctx: *TestContext) !void {
653 var case = ctx.exe("wasm error union part 2", wasi);676 var case = ctx.exe("wasm error union part 2", wasi);
654677
655 case.addCompareOutput(678 case.addCompareOutput(
656 \\pub export fn _start() u32 {679 \\pub fn main() u8 {
657 \\ var e = foo();680 \\ var e = foo();
658 \\ const i = e catch 69;681 \\ const i = e catch 69;
659 \\ return i;682 \\ return i;
660 \\}683 \\}
661 \\684 \\
662 \\fn foo() anyerror!u32 {685 \\fn foo() anyerror!u8 {
663 \\ return error.Bruh;686 \\ return error.Bruh;
664 \\}687 \\}
665 , "69\n");688 , "69\n");
666 case.addCompareOutput(689 case.addCompareOutput(
667 \\pub export fn _start() u32 {690 \\pub fn main() u8 {
668 \\ var e = foo();691 \\ var e = foo();
669 \\ const i = e catch 42;692 \\ const i = e catch 42;
670 \\ return i;693 \\ return i;
671 \\}694 \\}
672 \\695 \\
673 \\fn foo() anyerror!u32 {696 \\fn foo() anyerror!u8 {
674 \\ return error.Dab;697 \\ return error.Dab;
675 \\}698 \\}
676 , "42\n");699 , "42\n");
...@@ -680,20 +703,22 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -680,20 +703,22 @@ pub fn addCases(ctx: *TestContext) !void {
680 var case = ctx.exe("wasm integer widening", wasi);703 var case = ctx.exe("wasm integer widening", wasi);
681704
682 case.addCompareOutput(705 case.addCompareOutput(
683 \\pub export fn _start() u64 {706 \\pub fn main() void{
684 \\ var x: u32 = 5;707 \\ var x: u8 = 5;
685 \\ return x;708 \\ var y: u64 = x;
709 \\ _ = y;
710 \\ return;
686 \\}711 \\}
687 , "5\n");712 , "0\n");
688 }713 }
689714
690 {715 {
691 var case = ctx.exe("wasm optionals", wasi);716 var case = ctx.exe("wasm optionals", wasi);
692717
693 case.addCompareOutput(718 case.addCompareOutput(
694 \\pub export fn _start() u32 {719 \\pub fn main() u8 {
695 \\ var x: ?u32 = 5;720 \\ var x: ?u8 = 5;
696 \\ var y: u32 = 0;721 \\ var y: u8 = 0;
697 \\ if (x) |val| {722 \\ if (x) |val| {
698 \\ y = val;723 \\ y = val;
699 \\ }724 \\ }
...@@ -702,9 +727,9 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -702,9 +727,9 @@ pub fn addCases(ctx: *TestContext) !void {
702 , "5\n");727 , "5\n");
703728
704 case.addCompareOutput(729 case.addCompareOutput(
705 \\pub export fn _start() u32 {730 \\pub fn main() u8 {
706 \\ var x: ?u32 = null;731 \\ var x: ?u8 = null;
707 \\ var y: u32 = 0;732 \\ var y: u8 = 0;
708 \\ if (x) |val| {733 \\ if (x) |val| {
709 \\ y = val;734 \\ y = val;
710 \\ }735 \\ }
...@@ -713,23 +738,23 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -713,23 +738,23 @@ pub fn addCases(ctx: *TestContext) !void {
713 , "0\n");738 , "0\n");
714739
715 case.addCompareOutput(740 case.addCompareOutput(
716 \\pub export fn _start() u32 {741 \\pub fn main() u8 {
717 \\ var x: ?u32 = 5;742 \\ var x: ?u8 = 5;
718 \\ return x.?;743 \\ return x.?;
719 \\}744 \\}
720 , "5\n");745 , "5\n");
721746
722 case.addCompareOutput(747 case.addCompareOutput(
723 \\pub export fn _start() u32 {748 \\pub fn main() u8 {
724 \\ var x: u32 = 5;749 \\ var x: u8 = 5;
725 \\ var y: ?u32 = x;750 \\ var y: ?u8 = x;
726 \\ return y.?;751 \\ return y.?;
727 \\}752 \\}
728 , "5\n");753 , "5\n");
729754
730 case.addCompareOutput(755 case.addCompareOutput(
731 \\pub export fn _start() u32 {756 \\pub fn main() u8 {
732 \\ var val: ?u32 = 5;757 \\ var val: ?u8 = 5;
733 \\ while (val) |*v| {758 \\ while (val) |*v| {
734 \\ v.* -= 1;759 \\ v.* -= 1;
735 \\ if (v.* == 2) {760 \\ if (v.* == 2) {
...@@ -745,32 +770,32 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -745,32 +770,32 @@ pub fn addCases(ctx: *TestContext) !void {
745 var case = ctx.exe("wasm pointers", wasi);770 var case = ctx.exe("wasm pointers", wasi);
746771
747 case.addCompareOutput(772 case.addCompareOutput(
748 \\pub export fn _start() u32 {773 \\pub fn main() u8 {
749 \\ var x: u32 = 0;774 \\ var x: u8 = 0;
750 \\775 \\
751 \\ foo(&x);776 \\ foo(&x);
752 \\ return x;777 \\ return x;
753 \\}778 \\}
754 \\779 \\
755 \\fn foo(x: *u32)void {780 \\fn foo(x: *u8)void {
756 \\ x.* = 2;781 \\ x.* = 2;
757 \\}782 \\}
758 , "2\n");783 , "2\n");
759784
760 case.addCompareOutput(785 case.addCompareOutput(
761 \\pub export fn _start() u32 {786 \\pub fn main() u8 {
762 \\ var x: u32 = 0;787 \\ var x: u8 = 0;
763 \\788 \\
764 \\ foo(&x);789 \\ foo(&x);
765 \\ bar(&x);790 \\ bar(&x);
766 \\ return x;791 \\ return x;
767 \\}792 \\}
768 \\793 \\
769 \\fn foo(x: *u32)void {794 \\fn foo(x: *u8)void {
770 \\ x.* = 2;795 \\ x.* = 2;
771 \\}796 \\}
772 \\797 \\
773 \\fn bar(x: *u32) void {798 \\fn bar(x: *u8) void {
774 \\ x.* += 2;799 \\ x.* += 2;
775 \\}800 \\}
776 , "4\n");801 , "4\n");