authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-23 20:18:50-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-03-23 20:18:50-04:00
loge02ec8f7f5485b4e95ca8089b25a1c76d85c5834
tree6f73e582246515b07220df133b440b55d426313d
parenta36f4ee290fa9f3f1515e8aa9bd2bb0f0117c505
parent5cb16dfa59c6e1de1fbcbfcfdecdca1335690df0
signature Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #11280 from Luukdegram/wasm-errors

stage2: wasm - `@errorName` and more

15 files changed, 263 insertions(+), 76 deletions(-)

src/arch/wasm/CodeGen.zig+112-16
......@@ -1329,6 +1329,7 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
13291329 .fptrunc => self.airFptrunc(inst),
13301330 .fpext => self.airFpext(inst),
13311331 .float_to_int => self.airFloatToInt(inst),
1332 .int_to_float => self.airIntToFloat(inst),
13321333 .get_union_tag => self.airGetUnionTag(inst),
13331334
13341335 // TODO
......@@ -1382,6 +1383,8 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
13821383 .slice_elem_val => self.airSliceElemVal(inst),
13831384 .slice_elem_ptr => self.airSliceElemPtr(inst),
13841385 .slice_ptr => self.airSlicePtr(inst),
1386 .ptr_slice_len_ptr => self.airPtrSliceFieldPtr(inst, self.ptrSize()),
1387 .ptr_slice_ptr_ptr => self.airPtrSliceFieldPtr(inst, 0),
13851388 .store => self.airStore(inst),
13861389
13871390 .set_union_tag => self.airSetUnionTag(inst),
......@@ -1398,11 +1401,14 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
13981401 .unreach => self.airUnreachable(inst),
13991402
14001403 .wrap_optional => self.airWrapOptional(inst),
1401 .unwrap_errunion_payload => self.airUnwrapErrUnionPayload(inst),
1402 .unwrap_errunion_err => self.airUnwrapErrUnionError(inst),
1404 .unwrap_errunion_payload => self.airUnwrapErrUnionPayload(inst, false),
1405 .unwrap_errunion_payload_ptr => self.airUnwrapErrUnionPayload(inst, true),
1406 .unwrap_errunion_err => self.airUnwrapErrUnionError(inst, false),
1407 .unwrap_errunion_err_ptr => self.airUnwrapErrUnionError(inst, true),
14031408 .wrap_errunion_payload => self.airWrapErrUnionPayload(inst),
14041409 .wrap_errunion_err => self.airWrapErrUnionErr(inst),
14051410 .errunion_payload_ptr_set => self.airErrUnionPayloadPtrSet(inst),
1411 .error_name => self.airErrorName(inst),
14061412
14071413 .wasm_memory_size => self.airWasmMemorySize(inst),
14081414 .wasm_memory_grow => self.airWasmMemoryGrow(inst),
......@@ -1428,8 +1434,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
14281434 .bit_reverse,
14291435 .is_err_ptr,
14301436 .is_non_err_ptr,
1431 .unwrap_errunion_payload_ptr,
1432 .unwrap_errunion_err_ptr,
14331437
14341438 .sqrt,
14351439 .sin,
......@@ -1445,9 +1449,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
14451449 .round,
14461450 .trunc_float,
14471451
1448 .ptr_slice_len_ptr,
1449 .ptr_slice_ptr_ptr,
1450 .int_to_float,
14511452 .cmpxchg_weak,
14521453 .cmpxchg_strong,
14531454 .fence,
......@@ -1458,7 +1459,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
14581459 .atomic_store_seq_cst,
14591460 .atomic_rmw,
14601461 .tag_name,
1461 .error_name,
14621462 .mul_add,
14631463
14641464 // For these 4, probably best to wait until https://github.com/ziglang/zig/issues/10248
......@@ -1886,6 +1886,23 @@ fn lowerParentPtr(self: *Self, ptr_val: Value, ptr_child_ty: Type) InnerError!WV
18861886 .offset = @intCast(u32, offset),
18871887 } };
18881888 },
1889 .opt_payload_ptr => {
1890 const payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data;
1891 const parent_ptr = try self.lowerParentPtr(payload_ptr.container_ptr, payload_ptr.container_ty);
1892 var buf: Type.Payload.ElemType = undefined;
1893 const payload_ty = payload_ptr.container_ty.optionalChild(&buf);
1894 if (!payload_ty.hasRuntimeBitsIgnoreComptime() or payload_ty.isPtrLikeOptional()) {
1895 return parent_ptr;
1896 }
1897
1898 const abi_size = payload_ptr.container_ty.abiSize(self.target);
1899 const offset = abi_size - payload_ty.abiSize(self.target);
1900
1901 return WValue{ .memory_offset = .{
1902 .pointer = parent_ptr.memory,
1903 .offset = @intCast(u32, offset),
1904 } };
1905 },
18891906 else => |tag| return self.fail("TODO: Implement lowerParentPtr for tag: {}", .{tag}),
18901907 }
18911908}
......@@ -1948,7 +1965,7 @@ fn lowerConstant(self: *Self, val: Value, ty: Type) InnerError!WValue {
19481965 else => unreachable,
19491966 },
19501967 .Pointer => switch (val.tag()) {
1951 .field_ptr, .elem_ptr => {
1968 .field_ptr, .elem_ptr, .opt_payload_ptr => {
19521969 return self.lowerParentPtr(val, ty.childType());
19531970 },
19541971 .int_u64, .one => return WValue{ .imm32 = @intCast(u32, val.toUnsignedInt(target)) },
......@@ -2452,7 +2469,11 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
24522469 if (case_value.integer == value) break :blk @intCast(u32, idx);
24532470 }
24542471 }
2455 break :blk if (has_else_body) case_i else unreachable;
2472 // error sets are almost always sparse so we use the default case
2473 // for errors that are not present in any branch. This is fine as this default
2474 // case will never be hit for those cases but we do save runtime cost and size
2475 // by using a jump table for this instead of if-else chains.
2476 break :blk if (has_else_body or target_ty.zigTypeTag() == .ErrorSet) case_i else unreachable;
24562477 };
24572478 self.mir_extra.appendAssumeCapacity(idx);
24582479 } else if (has_else_body) {
......@@ -2539,30 +2560,32 @@ fn airIsErr(self: *Self, inst: Air.Inst.Index, opcode: wasm.Opcode) InnerError!W
25392560 return is_err_tmp;
25402561}
25412562
2542fn airUnwrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2563fn airUnwrapErrUnionPayload(self: *Self, inst: Air.Inst.Index, op_is_ptr: bool) InnerError!WValue {
25432564 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
25442565 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
25452566 const operand = try self.resolveInst(ty_op.operand);
2546 const err_ty = self.air.typeOf(ty_op.operand);
2567 const op_ty = self.air.typeOf(ty_op.operand);
2568 const err_ty = if (op_is_ptr) op_ty.childType() else op_ty;
25472569 const payload_ty = err_ty.errorUnionPayload();
25482570 if (!payload_ty.hasRuntimeBits()) return WValue{ .none = {} };
25492571 const err_align = err_ty.abiAlignment(self.target);
25502572 const set_size = err_ty.errorUnionSet().abiSize(self.target);
25512573 const offset = mem.alignForwardGeneric(u64, set_size, err_align);
2552 if (isByRef(payload_ty, self.target)) {
2574 if (op_is_ptr or isByRef(payload_ty, self.target)) {
25532575 return self.buildPointerOffset(operand, offset, .new);
25542576 }
25552577 return self.load(operand, payload_ty, @intCast(u32, offset));
25562578}
25572579
2558fn airUnwrapErrUnionError(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2580fn airUnwrapErrUnionError(self: *Self, inst: Air.Inst.Index, op_is_ptr: bool) InnerError!WValue {
25592581 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
25602582
25612583 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
25622584 const operand = try self.resolveInst(ty_op.operand);
2563 const err_ty = self.air.typeOf(ty_op.operand);
2585 const op_ty = self.air.typeOf(ty_op.operand);
2586 const err_ty = if (op_is_ptr) op_ty.childType() else op_ty;
25642587 const payload_ty = err_ty.errorUnionPayload();
2565 if (!payload_ty.hasRuntimeBits()) {
2588 if (op_is_ptr or !payload_ty.hasRuntimeBits()) {
25662589 return operand;
25672590 }
25682591
......@@ -3210,6 +3233,28 @@ fn airFloatToInt(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
32103233 return result;
32113234}
32123235
3236fn airIntToFloat(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3237 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
3238
3239 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
3240 const operand = try self.resolveInst(ty_op.operand);
3241 const dest_ty = self.air.typeOfIndex(inst);
3242 const op_ty = self.air.typeOf(ty_op.operand);
3243
3244 try self.emitWValue(operand);
3245 const op = buildOpcode(.{
3246 .op = .convert,
3247 .valtype1 = typeToValtype(dest_ty, self.target),
3248 .valtype2 = typeToValtype(op_ty, self.target),
3249 .signedness = if (op_ty.isSignedInt()) .signed else .unsigned,
3250 });
3251 try self.addTag(Mir.Inst.Tag.fromOpcode(op));
3252
3253 const result = try self.allocLocal(dest_ty);
3254 try self.addLabel(.local_set, result.local);
3255 return result;
3256}
3257
32133258fn airSplat(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
32143259 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
32153260
......@@ -3618,3 +3663,54 @@ fn airPopcount(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
36183663 try self.addLabel(.local_set, result.local);
36193664 return result;
36203665}
3666
3667fn airErrorName(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3668 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
3669
3670 const un_op = self.air.instructions.items(.data)[inst].un_op;
3671 const operand = try self.resolveInst(un_op);
3672
3673 // First retrieve the symbol index to the error name table
3674 // that will be used to emit a relocation for the pointer
3675 // to the error name table.
3676 //
3677 // Each entry to this table is a slice (ptr+len).
3678 // The operand in this instruction represents the index within this table.
3679 // This means to get the final name, we emit the base pointer and then perform
3680 // pointer arithmetic to find the pointer to this slice and return that.
3681 //
3682 // As the names are global and the slice elements are constant, we do not have
3683 // to make a copy of the ptr+value but can point towards them directly.
3684 const error_table_symbol = try self.bin_file.getErrorTableSymbol();
3685 const name_ty = Type.initTag(.const_slice_u8_sentinel_0);
3686 const abi_size = name_ty.abiSize(self.target);
3687
3688 const error_name_value: WValue = .{ .memory = error_table_symbol }; // emitting this will create a relocation
3689 try self.emitWValue(error_name_value);
3690 try self.emitWValue(operand);
3691 switch (self.arch()) {
3692 .wasm32 => {
3693 try self.addImm32(@bitCast(i32, @intCast(u32, abi_size)));
3694 try self.addTag(.i32_mul);
3695 try self.addTag(.i32_add);
3696 },
3697 .wasm64 => {
3698 try self.addImm64(abi_size);
3699 try self.addTag(.i64_mul);
3700 try self.addTag(.i64_add);
3701 },
3702 else => unreachable,
3703 }
3704
3705 const result_ptr = try self.allocLocal(Type.usize);
3706 try self.addLabel(.local_set, result_ptr.local);
3707 return result_ptr;
3708}
3709
3710fn airPtrSliceFieldPtr(self: *Self, inst: Air.Inst.Index, offset: u32) InnerError!WValue {
3711 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
3712
3713 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
3714 const slice_ptr = try self.resolveInst(ty_op.operand);
3715 return self.buildPointerOffset(slice_ptr, offset, .new);
3716}
src/arch/wasm/Emit.zig+8
......@@ -203,6 +203,14 @@ pub fn emitMir(emit: *Emit) InnerError!void {
203203 .i64_trunc_f32_u => try emit.emitTag(tag),
204204 .i64_trunc_f64_s => try emit.emitTag(tag),
205205 .i64_trunc_f64_u => try emit.emitTag(tag),
206 .f32_convert_i32_s => try emit.emitTag(tag),
207 .f32_convert_i32_u => try emit.emitTag(tag),
208 .f32_convert_i64_s => try emit.emitTag(tag),
209 .f32_convert_i64_u => try emit.emitTag(tag),
210 .f64_convert_i32_s => try emit.emitTag(tag),
211 .f64_convert_i32_u => try emit.emitTag(tag),
212 .f64_convert_i64_s => try emit.emitTag(tag),
213 .f64_convert_i64_u => try emit.emitTag(tag),
206214 .i32_rem_s => try emit.emitTag(tag),
207215 .i32_rem_u => try emit.emitTag(tag),
208216 .i64_rem_s => try emit.emitTag(tag),
src/arch/wasm/Mir.zig+16
......@@ -451,8 +451,24 @@ pub const Inst = struct {
451451 /// Uses `tag`
452452 i64_trunc_f64_u = 0xB1,
453453 /// Uses `tag`
454 f32_convert_i32_s = 0xB2,
455 /// Uses `tag`
456 f32_convert_i32_u = 0xB3,
457 /// Uses `tag`
458 f32_convert_i64_s = 0xB4,
459 /// Uses `tag`
460 f32_convert_i64_u = 0xB5,
461 /// Uses `tag`
454462 f32_demote_f64 = 0xB6,
455463 /// Uses `tag`
464 f64_convert_i32_s = 0xB7,
465 /// Uses `tag`
466 f64_convert_i32_u = 0xB8,
467 /// Uses `tag`
468 f64_convert_i64_s = 0xB9,
469 /// Uses `tag`
470 f64_convert_i64_u = 0xBA,
471 /// Uses `tag`
456472 f64_promote_f32 = 0xBB,
457473 /// Uses `tag`
458474 i32_reinterpret_f32 = 0xBC,
src/link/Wasm.zig+127
......@@ -123,6 +123,13 @@ symbol_atom: std.AutoHashMapUnmanaged(SymbolLoc, *Atom) = .{},
123123/// Note: The value represents the offset into the string table, rather than the actual string.
124124export_names: std.AutoHashMapUnmanaged(SymbolLoc, u32) = .{},
125125
126/// Represents the symbol index of the error name table
127/// When this is `null`, no code references an error using runtime `@errorName`.
128/// During initializion, a symbol with corresponding atom will be created that is
129/// used to perform relocations to the pointer of this table.
130/// The actual table is populated during `flush`.
131error_table_symbol: ?u32 = null,
132
126133pub const Segment = struct {
127134 alignment: u32,
128135 size: u32,
......@@ -1322,6 +1329,123 @@ pub fn getMatchingSegment(self: *Wasm, object_index: u16, relocatable_index: u32
13221329 }
13231330}
13241331
1332/// Returns the symbol index of the error name table.
1333///
1334/// When the symbol does not yet exist, it will create a new one instead.
1335pub fn getErrorTableSymbol(self: *Wasm) !u32 {
1336 if (self.error_table_symbol) |symbol| {
1337 return symbol;
1338 }
1339
1340 // no error was referenced yet, so create a new symbol and atom for it
1341 // and then return said symbol's index. The final table will be populated
1342 // during `flush` when we know all possible error names.
1343
1344 // As sym_index '0' is reserved, we use it for our stack pointer symbol
1345 const symbol_index = self.symbols_free_list.popOrNull() orelse blk: {
1346 const index = @intCast(u32, self.symbols.items.len);
1347 _ = try self.symbols.addOne(self.base.allocator);
1348 break :blk index;
1349 };
1350
1351 const sym_name = try self.string_table.put(self.base.allocator, "__zig_err_name_table");
1352 const symbol = &self.symbols.items[symbol_index];
1353 symbol.* = .{
1354 .name = sym_name,
1355 .tag = .data,
1356 .flags = 0,
1357 .index = 0,
1358 };
1359 symbol.setFlag(.WASM_SYM_VISIBILITY_HIDDEN);
1360
1361 const slice_ty = Type.initTag(.const_slice_u8_sentinel_0);
1362
1363 const atom = try self.base.allocator.create(Atom);
1364 atom.* = Atom.empty;
1365 atom.sym_index = symbol_index;
1366 atom.alignment = slice_ty.abiAlignment(self.base.options.target);
1367 try self.managed_atoms.append(self.base.allocator, atom);
1368 const loc = atom.symbolLoc();
1369 try self.resolved_symbols.put(self.base.allocator, loc, {});
1370 try self.symbol_atom.put(self.base.allocator, loc, atom);
1371
1372 log.debug("Error name table was created with symbol index: ({d})", .{symbol_index});
1373 self.error_table_symbol = symbol_index;
1374 return symbol_index;
1375}
1376
1377/// Populates the error name table, when `error_table_symbol` is not null.
1378///
1379/// This creates a table that consists of pointers and length to each error name.
1380/// The table is what is being pointed to within the runtime bodies that are generated.
1381fn populateErrorNameTable(self: *Wasm) !void {
1382 const symbol_index = self.error_table_symbol orelse return;
1383 const atom: *Atom = self.symbol_atom.get(.{ .file = null, .index = symbol_index }).?;
1384 // Rather than creating a symbol for each individual error name,
1385 // we create a symbol for the entire region of error names. We then calculate
1386 // the pointers into the list using addends which are appended to the relocation.
1387 const names_atom = try self.base.allocator.create(Atom);
1388 names_atom.* = Atom.empty;
1389 try self.managed_atoms.append(self.base.allocator, names_atom);
1390 const names_symbol_index = self.symbols_free_list.popOrNull() orelse blk: {
1391 const index = @intCast(u32, self.symbols.items.len);
1392 _ = try self.symbols.addOne(self.base.allocator);
1393 break :blk index;
1394 };
1395 names_atom.sym_index = names_symbol_index;
1396 names_atom.alignment = 1;
1397 const sym_name = try self.string_table.put(self.base.allocator, "__zig_err_names");
1398 const names_symbol = &self.symbols.items[names_symbol_index];
1399 names_symbol.* = .{
1400 .name = sym_name,
1401 .tag = .data,
1402 .flags = 0,
1403 .index = 0,
1404 };
1405 names_symbol.setFlag(.WASM_SYM_VISIBILITY_HIDDEN);
1406
1407 log.debug("Populating error names", .{});
1408
1409 // Addend for each relocation to the table
1410 var addend: u32 = 0;
1411 const module = self.base.options.module.?;
1412 for (module.error_name_list.items) |error_name| {
1413 const len = @intCast(u32, error_name.len + 1); // names are 0-termianted
1414
1415 const slice_ty = Type.initTag(.const_slice_u8_sentinel_0);
1416 const offset = @intCast(u32, atom.code.items.len);
1417 // first we create the data for the slice of the name
1418 try atom.code.appendNTimes(self.base.allocator, 0, 4); // ptr to name, will be relocated
1419 try atom.code.writer(self.base.allocator).writeIntLittle(u32, len - 1);
1420 // create relocation to the error name
1421 try atom.relocs.append(self.base.allocator, .{
1422 .index = names_symbol_index,
1423 .relocation_type = .R_WASM_MEMORY_ADDR_I32,
1424 .offset = offset,
1425 .addend = addend,
1426 });
1427 atom.size += @intCast(u32, slice_ty.abiSize(self.base.options.target));
1428 addend += len;
1429
1430 // as we updated the error name table, we now store the actual name within the names atom
1431 try names_atom.code.ensureUnusedCapacity(self.base.allocator, len);
1432 names_atom.code.appendSliceAssumeCapacity(error_name);
1433 names_atom.code.appendAssumeCapacity(0);
1434
1435 log.debug("Populated error name: '{s}'", .{error_name});
1436 }
1437 names_atom.size = addend;
1438
1439 const name_loc = names_atom.symbolLoc();
1440 try self.resolved_symbols.put(self.base.allocator, name_loc, {});
1441 try self.symbol_atom.put(self.base.allocator, name_loc, names_atom);
1442
1443 // link the atoms with the rest of the binary so they can be allocated
1444 // and relocations will be performed.
1445 try self.parseAtom(atom, .data);
1446 try self.parseAtom(names_atom, .data);
1447}
1448
13251449fn resetState(self: *Wasm) void {
13261450 for (self.segment_info.items) |*segment_info| {
13271451 self.base.allocator.free(segment_info.name);
......@@ -1373,6 +1497,9 @@ pub fn flushModule(self: *Wasm, comp: *Compilation) !void {
13731497 }
13741498 }
13751499
1500 // ensure the error names table is populated when an error name is referenced
1501 try self.populateErrorNameTable();
1502
13761503 // The amount of sections that will be written
13771504 var section_count: u32 = 0;
13781505 // Index of the code section. Used to tell relocation table where the section lives.
test/behavior/bugs/11159.zig-1
......@@ -10,7 +10,6 @@ test {
1010test {
1111 if (builtin.zig_backend == .stage1) return error.SkipZigTest; // TODO
1212 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1413
1514 const S = struct {
1615 comptime x: i32 = 0,
test/behavior/bugs/5398.zig-1
......@@ -19,7 +19,6 @@ pub const Renderable = struct {
1919var renderable: Renderable = undefined;
2020
2121test "assignment of field with padding" {
22 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
2322 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
2423 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2524 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
test/behavior/bugs/6456.zig-1
......@@ -12,7 +12,6 @@ const text =
1212
1313test "issue 6456" {
1414 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
15 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1615 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1716 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1817 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/cast.zig-10
......@@ -96,7 +96,6 @@ test "comptime_int @intToFloat" {
9696}
9797
9898test "@intToFloat" {
99 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10099 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
101100 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
102101 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -545,7 +544,6 @@ test "cast *[1][*]const u8 to [*]const ?[*]const u8" {
545544 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
546545 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
547546 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
548 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
549547
550548 const window_name = [1][*]const u8{"window name"};
551549 const x: [*]const ?[*]const u8 = &window_name;
......@@ -607,7 +605,6 @@ test "@floatCast cast down" {
607605}
608606
609607test "peer type resolution: unreachable, error set, unreachable" {
610 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
611608 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
612609 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
613610 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -818,7 +815,6 @@ test "peer resolution of string literals" {
818815 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
819816 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
820817 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
821 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
822818
823819 const S = struct {
824820 const E = enum { a, b, c, d };
......@@ -910,7 +906,6 @@ test "peer cast [:x]T to [*:x]T" {
910906 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
911907 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
912908 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
913 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
914909
915910 const S = struct {
916911 fn doTheTest() !void {
......@@ -930,7 +925,6 @@ test "peer cast [:x]T to [*:x]T" {
930925
931926test "peer type resolution implicit cast to return type" {
932927 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
933 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
934928 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
935929
936930 const S = struct {
......@@ -951,7 +945,6 @@ test "peer type resolution implicit cast to return type" {
951945
952946test "peer type resolution implicit cast to variable type" {
953947 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
954 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
955948 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
956949 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
957950
......@@ -991,7 +984,6 @@ test "cast between C pointer with different but compatible types" {
991984}
992985
993986test "peer type resolve string lit with sentinel-terminated mutable slice" {
994 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
995987 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
996988 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
997989 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
......@@ -1011,7 +1003,6 @@ test "peer type resolve array pointers, one of them const" {
10111003}
10121004
10131005test "peer type resolve array pointer and unknown pointer" {
1014 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10151006 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
10161007
10171008 const const_array: [4]u8 = undefined;
......@@ -1084,7 +1075,6 @@ test "compile time int to ptr of function" {
10841075 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
10851076 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
10861077 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1087 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10881078
10891079 try foobar(FUNCTION_CONSTANT);
10901080}
test/behavior/error.zig-11
......@@ -178,8 +178,6 @@ fn testErrorUnionType() !void {
178178}
179179
180180test "error set type" {
181 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
182
183181 try testErrorSetType();
184182 comptime try testErrorSetType();
185183}
......@@ -221,7 +219,6 @@ fn testExplicitErrorSetCast(set1: Set1) !void {
221219}
222220
223221test "comptime test error for empty error set" {
224 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
225222 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
226223 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
227224 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -338,7 +335,6 @@ fn intLiteral(str: []const u8) !?i64 {
338335}
339336
340337test "nested error union function call in optional unwrap" {
341 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
342338 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
343339 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
344340 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -386,7 +382,6 @@ test "nested error union function call in optional unwrap" {
386382}
387383
388384test "return function call to error set from error union function" {
389 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
390385 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
391386 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
392387 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -418,7 +413,6 @@ test "optional error set is the same size as error set" {
418413}
419414
420415test "nested catch" {
421 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
422416 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
423417 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
424418 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -451,7 +445,6 @@ test "function pointer with return type that is error union with payload which i
451445 }
452446
453447 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
454 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
455448 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
456449 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
457450 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -477,7 +470,6 @@ test "function pointer with return type that is error union with payload which i
477470}
478471
479472test "return result loc as peer result loc in inferred error set function" {
480 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
481473 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
482474 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
483475 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -509,7 +501,6 @@ test "return result loc as peer result loc in inferred error set function" {
509501}
510502
511503test "error payload type is correctly resolved" {
512 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
513504 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
514505 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
515506 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -540,7 +531,6 @@ test "error union comptime caching" {
540531
541532test "@errorName" {
542533 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
543 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
544534 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
545535 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
546536 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
......@@ -555,7 +545,6 @@ fn gimmeItBroke() anyerror {
555545
556546test "@errorName sentinel length matches slice length" {
557547 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
558 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
559548 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
560549 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
561550 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
test/behavior/optional.zig-1
......@@ -65,7 +65,6 @@ test "optional with void type" {
6565}
6666
6767test "address of unwrap optional" {
68 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
6968 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
7069 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7170 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/pointers.zig-6
......@@ -166,7 +166,6 @@ test "implicit casting between C pointer and optional non-C pointer" {
166166}
167167
168168test "implicit cast error unions with non-optional to optional pointer" {
169 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
170169 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
171170 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
172171 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -282,7 +281,6 @@ test "null terminated pointer" {
282281 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
283282 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
284283 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
285 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
286284
287285 const S = struct {
288286 fn doTheTest() !void {
......@@ -301,7 +299,6 @@ test "allow any sentinel" {
301299 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
302300 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
303301 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
304 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
305302
306303 const S = struct {
307304 fn doTheTest() !void {
......@@ -318,7 +315,6 @@ test "pointer sentinel with enums" {
318315 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
319316 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
320317 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
321 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
322318
323319 const S = struct {
324320 const Number = enum {
......@@ -340,7 +336,6 @@ test "pointer sentinel with optional element" {
340336 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
341337 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
342338 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
343 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
344339
345340 const S = struct {
346341 fn doTheTest() !void {
......@@ -424,7 +419,6 @@ test "@ptrToInt on null optional at comptime" {
424419}
425420
426421test "indexing array with sentinel returns correct type" {
427 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
428422 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
429423 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
430424 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/struct.zig-17
......@@ -282,7 +282,6 @@ const Val = struct {
282282
283283test "struct point to self" {
284284 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
285 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
286285 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
287286 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
288287
......@@ -300,7 +299,6 @@ test "struct point to self" {
300299
301300test "void struct fields" {
302301 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
303 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
304302 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
305303 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
306304 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
......@@ -321,7 +319,6 @@ const VoidStructFieldsFoo = struct {
321319
322320test "return empty struct from fn" {
323321 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
324 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
325322 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
326323
327324 _ = testReturnEmptyStructFromFn();
......@@ -333,7 +330,6 @@ fn testReturnEmptyStructFromFn() EmptyStruct2 {
333330
334331test "pass slice of empty struct to fn" {
335332 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
336 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
337333 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
338334
339335 try expect(testPassSliceOfEmptyStructToFn(&[_]EmptyStruct2{EmptyStruct2{}}) == 1);
......@@ -344,7 +340,6 @@ fn testPassSliceOfEmptyStructToFn(slice: []const EmptyStruct2) usize {
344340
345341test "self-referencing struct via array member" {
346342 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
347 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
348343 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
349344 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
350345 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
......@@ -358,7 +353,6 @@ test "self-referencing struct via array member" {
358353}
359354
360355test "empty struct method call" {
361 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
362356 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
363357
364358 const es = EmptyStruct{};
......@@ -373,7 +367,6 @@ const EmptyStruct = struct {
373367
374368test "align 1 field before self referential align 8 field as slice return type" {
375369 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
376 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
377370 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
378371
379372 const result = alloc(Expr);
......@@ -633,7 +626,6 @@ fn getC(data: *const BitField1) u2 {
633626
634627test "default struct initialization fields" {
635628 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
636 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
637629 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
638630
639631 const S = struct {
......@@ -775,7 +767,6 @@ test "packed struct with u0 field access" {
775767}
776768
777769test "access to global struct fields" {
778 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
779770 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
780771 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
781772 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
......@@ -903,7 +894,6 @@ test "packed struct field passed to generic function" {
903894
904895test "anonymous struct literal syntax" {
905896 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
906 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
907897 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
908898
909899 const S = struct {
......@@ -992,7 +982,6 @@ test "comptime struct field" {
992982}
993983
994984test "tuple element initialized with fn call" {
995 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
996985 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
997986 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
998987 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -1030,7 +1019,6 @@ test "struct with union field" {
10301019}
10311020
10321021test "type coercion of anon struct literal to struct" {
1033 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10341022 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
10351023 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
10361024 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -1069,7 +1057,6 @@ test "type coercion of anon struct literal to struct" {
10691057}
10701058
10711059test "type coercion of pointer to anon struct literal to pointer to struct" {
1072 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10731060 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
10741061 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
10751062 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -1181,7 +1168,6 @@ test "for loop over pointers to struct, getting field from struct pointer" {
11811168test "anon init through error unions and optionals" {
11821169 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
11831170 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1184 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
11851171 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
11861172 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
11871173 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -1210,7 +1196,6 @@ test "anon init through error unions and optionals" {
12101196test "anon init through optional" {
12111197 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
12121198 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1213 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
12141199 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
12151200 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12161201 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -1232,7 +1217,6 @@ test "anon init through optional" {
12321217test "anon init through error union" {
12331218 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
12341219 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1235 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
12361220 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
12371221 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12381222 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -1254,7 +1238,6 @@ test "anon init through error union" {
12541238test "typed init through error unions and optionals" {
12551239 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
12561240 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1257 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
12581241 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
12591242 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12601243 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/switch.zig-3
......@@ -434,7 +434,6 @@ test "else prong of switch on error set excludes other cases" {
434434 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
435435 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
436436 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
437 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
438437
439438 const S = struct {
440439 fn doTheTest() !void {
......@@ -581,7 +580,6 @@ test "switch prongs with cases with identical payload types" {
581580}
582581
583582test "switch on pointer type" {
584 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
585583 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
586584 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
587585 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -630,7 +628,6 @@ test "switch on error set with single else" {
630628}
631629
632630test "switch capture copies its payload" {
633 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
634631 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
635632 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
636633 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/behavior/type.zig-3
......@@ -353,7 +353,6 @@ test "Type.Struct" {
353353}
354354
355355test "Type.Enum" {
356 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
357356 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
358357 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
359358 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
......@@ -465,7 +464,6 @@ test "Type.Union" {
465464}
466465
467466test "Type.Union from Type.Enum" {
468 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
469467 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
470468 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
471469 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -496,7 +494,6 @@ test "Type.Union from Type.Enum" {
496494}
497495
498496test "Type.Union from regular enum" {
499 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
500497 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
501498 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
502499 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/behavior/typename.zig-6
......@@ -18,7 +18,6 @@ test "anon fn param" {
1818 return error.SkipZigTest;
1919 }
2020
21 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2221 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
2322 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2423 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -51,7 +50,6 @@ test "anon field init" {
5150 return error.SkipZigTest;
5251 }
5352
54 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
5553 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
5654 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
5755 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -78,7 +76,6 @@ test "anon field init" {
7876}
7977
8078test "basic" {
81 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
8279 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
8380 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
8481 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -95,7 +92,6 @@ test "top level decl" {
9592 return error.SkipZigTest;
9693 }
9794
98 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
9995 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
10096 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
10197 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -147,7 +143,6 @@ test "fn body decl" {
147143 return error.SkipZigTest;
148144 }
149145
150 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
151146 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
152147 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
153148 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
......@@ -182,7 +177,6 @@ const B = struct {
182177};
183178
184179test "fn param" {
185 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
186180 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
187181 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
188182 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO