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
signaturebadge-question-mark 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 {...@@ -1329,6 +1329,7 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1329 .fptrunc => self.airFptrunc(inst),1329 .fptrunc => self.airFptrunc(inst),
1330 .fpext => self.airFpext(inst),1330 .fpext => self.airFpext(inst),
1331 .float_to_int => self.airFloatToInt(inst),1331 .float_to_int => self.airFloatToInt(inst),
1332 .int_to_float => self.airIntToFloat(inst),
1332 .get_union_tag => self.airGetUnionTag(inst),1333 .get_union_tag => self.airGetUnionTag(inst),
13331334
1334 // TODO1335 // TODO
...@@ -1382,6 +1383,8 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1382,6 +1383,8 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1382 .slice_elem_val => self.airSliceElemVal(inst),1383 .slice_elem_val => self.airSliceElemVal(inst),
1383 .slice_elem_ptr => self.airSliceElemPtr(inst),1384 .slice_elem_ptr => self.airSliceElemPtr(inst),
1384 .slice_ptr => self.airSlicePtr(inst),1385 .slice_ptr => self.airSlicePtr(inst),
1386 .ptr_slice_len_ptr => self.airPtrSliceFieldPtr(inst, self.ptrSize()),
1387 .ptr_slice_ptr_ptr => self.airPtrSliceFieldPtr(inst, 0),
1385 .store => self.airStore(inst),1388 .store => self.airStore(inst),
13861389
1387 .set_union_tag => self.airSetUnionTag(inst),1390 .set_union_tag => self.airSetUnionTag(inst),
...@@ -1398,11 +1401,14 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1398,11 +1401,14 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1398 .unreach => self.airUnreachable(inst),1401 .unreach => self.airUnreachable(inst),
13991402
1400 .wrap_optional => self.airWrapOptional(inst),1403 .wrap_optional => self.airWrapOptional(inst),
1401 .unwrap_errunion_payload => self.airUnwrapErrUnionPayload(inst),1404 .unwrap_errunion_payload => self.airUnwrapErrUnionPayload(inst, false),
1402 .unwrap_errunion_err => self.airUnwrapErrUnionError(inst),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),
1403 .wrap_errunion_payload => self.airWrapErrUnionPayload(inst),1408 .wrap_errunion_payload => self.airWrapErrUnionPayload(inst),
1404 .wrap_errunion_err => self.airWrapErrUnionErr(inst),1409 .wrap_errunion_err => self.airWrapErrUnionErr(inst),
1405 .errunion_payload_ptr_set => self.airErrUnionPayloadPtrSet(inst),1410 .errunion_payload_ptr_set => self.airErrUnionPayloadPtrSet(inst),
1411 .error_name => self.airErrorName(inst),
14061412
1407 .wasm_memory_size => self.airWasmMemorySize(inst),1413 .wasm_memory_size => self.airWasmMemorySize(inst),
1408 .wasm_memory_grow => self.airWasmMemoryGrow(inst),1414 .wasm_memory_grow => self.airWasmMemoryGrow(inst),
...@@ -1428,8 +1434,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1428,8 +1434,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1428 .bit_reverse,1434 .bit_reverse,
1429 .is_err_ptr,1435 .is_err_ptr,
1430 .is_non_err_ptr,1436 .is_non_err_ptr,
1431 .unwrap_errunion_payload_ptr,
1432 .unwrap_errunion_err_ptr,
14331437
1434 .sqrt,1438 .sqrt,
1435 .sin,1439 .sin,
...@@ -1445,9 +1449,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1445,9 +1449,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1445 .round,1449 .round,
1446 .trunc_float,1450 .trunc_float,
14471451
1448 .ptr_slice_len_ptr,
1449 .ptr_slice_ptr_ptr,
1450 .int_to_float,
1451 .cmpxchg_weak,1452 .cmpxchg_weak,
1452 .cmpxchg_strong,1453 .cmpxchg_strong,
1453 .fence,1454 .fence,
...@@ -1458,7 +1459,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1458,7 +1459,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1458 .atomic_store_seq_cst,1459 .atomic_store_seq_cst,
1459 .atomic_rmw,1460 .atomic_rmw,
1460 .tag_name,1461 .tag_name,
1461 .error_name,
1462 .mul_add,1462 .mul_add,
14631463
1464 // For these 4, probably best to wait until https://github.com/ziglang/zig/issues/102481464 // 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...@@ -1886,6 +1886,23 @@ fn lowerParentPtr(self: *Self, ptr_val: Value, ptr_child_ty: Type) InnerError!WV
1886 .offset = @intCast(u32, offset),1886 .offset = @intCast(u32, offset),
1887 } };1887 } };
1888 },1888 },
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 },
1889 else => |tag| return self.fail("TODO: Implement lowerParentPtr for tag: {}", .{tag}),1906 else => |tag| return self.fail("TODO: Implement lowerParentPtr for tag: {}", .{tag}),
1890 }1907 }
1891}1908}
...@@ -1948,7 +1965,7 @@ fn lowerConstant(self: *Self, val: Value, ty: Type) InnerError!WValue {...@@ -1948,7 +1965,7 @@ fn lowerConstant(self: *Self, val: Value, ty: Type) InnerError!WValue {
1948 else => unreachable,1965 else => unreachable,
1949 },1966 },
1950 .Pointer => switch (val.tag()) {1967 .Pointer => switch (val.tag()) {
1951 .field_ptr, .elem_ptr => {1968 .field_ptr, .elem_ptr, .opt_payload_ptr => {
1952 return self.lowerParentPtr(val, ty.childType());1969 return self.lowerParentPtr(val, ty.childType());
1953 },1970 },
1954 .int_u64, .one => return WValue{ .imm32 = @intCast(u32, val.toUnsignedInt(target)) },1971 .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 {...@@ -2452,7 +2469,11 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2452 if (case_value.integer == value) break :blk @intCast(u32, idx);2469 if (case_value.integer == value) break :blk @intCast(u32, idx);
2453 }2470 }
2454 }2471 }
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;
2456 };2477 };
2457 self.mir_extra.appendAssumeCapacity(idx);2478 self.mir_extra.appendAssumeCapacity(idx);
2458 } else if (has_else_body) {2479 } else if (has_else_body) {
...@@ -2539,30 +2560,32 @@ fn airIsErr(self: *Self, inst: Air.Inst.Index, opcode: wasm.Opcode) InnerError!W...@@ -2539,30 +2560,32 @@ fn airIsErr(self: *Self, inst: Air.Inst.Index, opcode: wasm.Opcode) InnerError!W
2539 return is_err_tmp;2560 return is_err_tmp;
2540}2561}
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 {
2543 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };2564 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
2544 const ty_op = self.air.instructions.items(.data)[inst].ty_op;2565 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2545 const operand = try self.resolveInst(ty_op.operand);2566 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;
2547 const payload_ty = err_ty.errorUnionPayload();2569 const payload_ty = err_ty.errorUnionPayload();
2548 if (!payload_ty.hasRuntimeBits()) return WValue{ .none = {} };2570 if (!payload_ty.hasRuntimeBits()) return WValue{ .none = {} };
2549 const err_align = err_ty.abiAlignment(self.target);2571 const err_align = err_ty.abiAlignment(self.target);
2550 const set_size = err_ty.errorUnionSet().abiSize(self.target);2572 const set_size = err_ty.errorUnionSet().abiSize(self.target);
2551 const offset = mem.alignForwardGeneric(u64, set_size, err_align);2573 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)) {
2553 return self.buildPointerOffset(operand, offset, .new);2575 return self.buildPointerOffset(operand, offset, .new);
2554 }2576 }
2555 return self.load(operand, payload_ty, @intCast(u32, offset));2577 return self.load(operand, payload_ty, @intCast(u32, offset));
2556}2578}
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 {
2559 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };2581 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
25602582
2561 const ty_op = self.air.instructions.items(.data)[inst].ty_op;2583 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2562 const operand = try self.resolveInst(ty_op.operand);2584 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;
2564 const payload_ty = err_ty.errorUnionPayload();2587 const payload_ty = err_ty.errorUnionPayload();
2565 if (!payload_ty.hasRuntimeBits()) {2588 if (op_is_ptr or !payload_ty.hasRuntimeBits()) {
2566 return operand;2589 return operand;
2567 }2590 }
25682591
...@@ -3210,6 +3233,28 @@ fn airFloatToInt(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -3210,6 +3233,28 @@ fn airFloatToInt(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3210 return result;3233 return result;
3211}3234}
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
3213fn airSplat(self: *Self, inst: Air.Inst.Index) InnerError!WValue {3258fn airSplat(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3214 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };3259 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
32153260
...@@ -3618,3 +3663,54 @@ fn airPopcount(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -3618,3 +3663,54 @@ fn airPopcount(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3618 try self.addLabel(.local_set, result.local);3663 try self.addLabel(.local_set, result.local);
3619 return result;3664 return result;
3620}3665}
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 {...@@ -203,6 +203,14 @@ pub fn emitMir(emit: *Emit) InnerError!void {
203 .i64_trunc_f32_u => try emit.emitTag(tag),203 .i64_trunc_f32_u => try emit.emitTag(tag),
204 .i64_trunc_f64_s => try emit.emitTag(tag),204 .i64_trunc_f64_s => try emit.emitTag(tag),
205 .i64_trunc_f64_u => try emit.emitTag(tag),205 .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),
206 .i32_rem_s => try emit.emitTag(tag),214 .i32_rem_s => try emit.emitTag(tag),
207 .i32_rem_u => try emit.emitTag(tag),215 .i32_rem_u => try emit.emitTag(tag),
208 .i64_rem_s => try emit.emitTag(tag),216 .i64_rem_s => try emit.emitTag(tag),
src/arch/wasm/Mir.zig+16
...@@ -451,8 +451,24 @@ pub const Inst = struct {...@@ -451,8 +451,24 @@ pub const Inst = struct {
451 /// Uses `tag`451 /// Uses `tag`
452 i64_trunc_f64_u = 0xB1,452 i64_trunc_f64_u = 0xB1,
453 /// Uses `tag`453 /// 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`
454 f32_demote_f64 = 0xB6,462 f32_demote_f64 = 0xB6,
455 /// Uses `tag`463 /// 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`
456 f64_promote_f32 = 0xBB,472 f64_promote_f32 = 0xBB,
457 /// Uses `tag`473 /// Uses `tag`
458 i32_reinterpret_f32 = 0xBC,474 i32_reinterpret_f32 = 0xBC,
src/link/Wasm.zig+127
...@@ -123,6 +123,13 @@ symbol_atom: std.AutoHashMapUnmanaged(SymbolLoc, *Atom) = .{},...@@ -123,6 +123,13 @@ symbol_atom: std.AutoHashMapUnmanaged(SymbolLoc, *Atom) = .{},
123/// Note: The value represents the offset into the string table, rather than the actual string.123/// Note: The value represents the offset into the string table, rather than the actual string.
124export_names: std.AutoHashMapUnmanaged(SymbolLoc, u32) = .{},124export_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
126pub const Segment = struct {133pub const Segment = struct {
127 alignment: u32,134 alignment: u32,
128 size: u32,135 size: u32,
...@@ -1322,6 +1329,123 @@ pub fn getMatchingSegment(self: *Wasm, object_index: u16, relocatable_index: u32...@@ -1322,6 +1329,123 @@ pub fn getMatchingSegment(self: *Wasm, object_index: u16, relocatable_index: u32
1322 }1329 }
1323}1330}
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
1325fn resetState(self: *Wasm) void {1449fn resetState(self: *Wasm) void {
1326 for (self.segment_info.items) |*segment_info| {1450 for (self.segment_info.items) |*segment_info| {
1327 self.base.allocator.free(segment_info.name);1451 self.base.allocator.free(segment_info.name);
...@@ -1373,6 +1497,9 @@ pub fn flushModule(self: *Wasm, comp: *Compilation) !void {...@@ -1373,6 +1497,9 @@ pub fn flushModule(self: *Wasm, comp: *Compilation) !void {
1373 }1497 }
1374 }1498 }
13751499
1500 // ensure the error names table is populated when an error name is referenced
1501 try self.populateErrorNameTable();
1502
1376 // The amount of sections that will be written1503 // The amount of sections that will be written
1377 var section_count: u32 = 0;1504 var section_count: u32 = 0;
1378 // Index of the code section. Used to tell relocation table where the section lives.1505 // 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 {...@@ -10,7 +10,6 @@ test {
10test {10test {
11 if (builtin.zig_backend == .stage1) return error.SkipZigTest; // TODO11 if (builtin.zig_backend == .stage1) return error.SkipZigTest; // TODO
12 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO12 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1413
15 const S = struct {14 const S = struct {
16 comptime x: i32 = 0,15 comptime x: i32 = 0,
test/behavior/bugs/5398.zig-1
...@@ -19,7 +19,6 @@ pub const Renderable = struct {...@@ -19,7 +19,6 @@ pub const Renderable = struct {
19var renderable: Renderable = undefined;19var renderable: Renderable = undefined;
2020
21test "assignment of field with padding" {21test "assignment of field with padding" {
22 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
23 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;22 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
24 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;23 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
25 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;24 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
test/behavior/bugs/6456.zig-1
...@@ -12,7 +12,6 @@ const text =...@@ -12,7 +12,6 @@ const text =
1212
13test "issue 6456" {13test "issue 6456" {
14 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO14 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
15 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
16 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO15 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
17 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO16 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
18 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO17 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/cast.zig-10
...@@ -96,7 +96,6 @@ test "comptime_int @intToFloat" {...@@ -96,7 +96,6 @@ test "comptime_int @intToFloat" {
96}96}
9797
98test "@intToFloat" {98test "@intToFloat" {
99 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
100 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO99 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
101 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO100 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
102 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO101 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -545,7 +544,6 @@ test "cast *[1][*]const u8 to [*]const ?[*]const u8" {...@@ -545,7 +544,6 @@ test "cast *[1][*]const u8 to [*]const ?[*]const u8" {
545 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO544 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
546 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO545 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
547 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO546 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
548 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
549547
550 const window_name = [1][*]const u8{"window name"};548 const window_name = [1][*]const u8{"window name"};
551 const x: [*]const ?[*]const u8 = &window_name;549 const x: [*]const ?[*]const u8 = &window_name;
...@@ -607,7 +605,6 @@ test "@floatCast cast down" {...@@ -607,7 +605,6 @@ test "@floatCast cast down" {
607}605}
608606
609test "peer type resolution: unreachable, error set, unreachable" {607test "peer type resolution: unreachable, error set, unreachable" {
610 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
611 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO608 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
612 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO609 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
613 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO610 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -818,7 +815,6 @@ test "peer resolution of string literals" {...@@ -818,7 +815,6 @@ test "peer resolution of string literals" {
818 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO815 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
819 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO816 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
820 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO817 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
821 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
822818
823 const S = struct {819 const S = struct {
824 const E = enum { a, b, c, d };820 const E = enum { a, b, c, d };
...@@ -910,7 +906,6 @@ test "peer cast [:x]T to [*:x]T" {...@@ -910,7 +906,6 @@ test "peer cast [:x]T to [*:x]T" {
910 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO906 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
911 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO907 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
912 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO908 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
913 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
914909
915 const S = struct {910 const S = struct {
916 fn doTheTest() !void {911 fn doTheTest() !void {
...@@ -930,7 +925,6 @@ test "peer cast [:x]T to [*:x]T" {...@@ -930,7 +925,6 @@ test "peer cast [:x]T to [*:x]T" {
930925
931test "peer type resolution implicit cast to return type" {926test "peer type resolution implicit cast to return type" {
932 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;927 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
933 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
934 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO928 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
935929
936 const S = struct {930 const S = struct {
...@@ -951,7 +945,6 @@ test "peer type resolution implicit cast to return type" {...@@ -951,7 +945,6 @@ test "peer type resolution implicit cast to return type" {
951945
952test "peer type resolution implicit cast to variable type" {946test "peer type resolution implicit cast to variable type" {
953 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;947 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
954 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
955 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO948 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
956 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO949 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" {...@@ -991,7 +984,6 @@ test "cast between C pointer with different but compatible types" {
991}984}
992985
993test "peer type resolve string lit with sentinel-terminated mutable slice" {986test "peer type resolve string lit with sentinel-terminated mutable slice" {
994 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
995 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO987 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
996 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO988 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
997 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO989 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
...@@ -1011,7 +1003,6 @@ test "peer type resolve array pointers, one of them const" {...@@ -1011,7 +1003,6 @@ test "peer type resolve array pointers, one of them const" {
1011}1003}
10121004
1013test "peer type resolve array pointer and unknown pointer" {1005test "peer type resolve array pointer and unknown pointer" {
1014 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1015 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1006 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
10161007
1017 const const_array: [4]u8 = undefined;1008 const const_array: [4]u8 = undefined;
...@@ -1084,7 +1075,6 @@ test "compile time int to ptr of function" {...@@ -1084,7 +1075,6 @@ test "compile time int to ptr of function" {
1084 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1075 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1085 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1076 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1086 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1077 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1087 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10881078
1089 try foobar(FUNCTION_CONSTANT);1079 try foobar(FUNCTION_CONSTANT);
1090}1080}
test/behavior/error.zig-11
...@@ -178,8 +178,6 @@ fn testErrorUnionType() !void {...@@ -178,8 +178,6 @@ fn testErrorUnionType() !void {
178}178}
179179
180test "error set type" {180test "error set type" {
181 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
182
183 try testErrorSetType();181 try testErrorSetType();
184 comptime try testErrorSetType();182 comptime try testErrorSetType();
185}183}
...@@ -221,7 +219,6 @@ fn testExplicitErrorSetCast(set1: Set1) !void {...@@ -221,7 +219,6 @@ fn testExplicitErrorSetCast(set1: Set1) !void {
221}219}
222220
223test "comptime test error for empty error set" {221test "comptime test error for empty error set" {
224 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
225 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO222 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
226 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO223 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
227 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO224 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -338,7 +335,6 @@ fn intLiteral(str: []const u8) !?i64 {...@@ -338,7 +335,6 @@ fn intLiteral(str: []const u8) !?i64 {
338}335}
339336
340test "nested error union function call in optional unwrap" {337test "nested error union function call in optional unwrap" {
341 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
342 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO338 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
343 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO339 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
344 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO340 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -386,7 +382,6 @@ test "nested error union function call in optional unwrap" {...@@ -386,7 +382,6 @@ test "nested error union function call in optional unwrap" {
386}382}
387383
388test "return function call to error set from error union function" {384test "return function call to error set from error union function" {
389 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
390 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO385 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
391 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO386 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
392 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO387 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" {...@@ -418,7 +413,6 @@ test "optional error set is the same size as error set" {
418}413}
419414
420test "nested catch" {415test "nested catch" {
421 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
422 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO416 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
423 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO417 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
424 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO418 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...@@ -451,7 +445,6 @@ test "function pointer with return type that is error union with payload which i
451 }445 }
452446
453 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO447 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
454 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
455 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO448 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
456 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO449 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
457 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO450 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...@@ -477,7 +470,6 @@ test "function pointer with return type that is error union with payload which i
477}470}
478471
479test "return result loc as peer result loc in inferred error set function" {472test "return result loc as peer result loc in inferred error set function" {
480 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
481 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO473 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
482 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO474 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
483 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO475 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" {...@@ -509,7 +501,6 @@ test "return result loc as peer result loc in inferred error set function" {
509}501}
510502
511test "error payload type is correctly resolved" {503test "error payload type is correctly resolved" {
512 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
513 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO504 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
514 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO505 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
515 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO506 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -540,7 +531,6 @@ test "error union comptime caching" {...@@ -540,7 +531,6 @@ test "error union comptime caching" {
540531
541test "@errorName" {532test "@errorName" {
542 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO533 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
543 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
544 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;534 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
545 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;535 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
546 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;536 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
...@@ -555,7 +545,6 @@ fn gimmeItBroke() anyerror {...@@ -555,7 +545,6 @@ fn gimmeItBroke() anyerror {
555545
556test "@errorName sentinel length matches slice length" {546test "@errorName sentinel length matches slice length" {
557 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO547 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
558 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
559 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;548 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
560 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;549 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
561 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;550 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
test/behavior/optional.zig-1
...@@ -65,7 +65,6 @@ test "optional with void type" {...@@ -65,7 +65,6 @@ test "optional with void type" {
65}65}
6666
67test "address of unwrap optional" {67test "address of unwrap optional" {
68 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
69 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO68 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
70 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;69 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
71 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO70 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" {...@@ -166,7 +166,6 @@ test "implicit casting between C pointer and optional non-C pointer" {
166}166}
167167
168test "implicit cast error unions with non-optional to optional pointer" {168test "implicit cast error unions with non-optional to optional pointer" {
169 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
170 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO169 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
171 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO170 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
172 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO171 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -282,7 +281,6 @@ test "null terminated pointer" {...@@ -282,7 +281,6 @@ test "null terminated pointer" {
282 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;281 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
283 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO282 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
284 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO283 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
285 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
286284
287 const S = struct {285 const S = struct {
288 fn doTheTest() !void {286 fn doTheTest() !void {
...@@ -301,7 +299,6 @@ test "allow any sentinel" {...@@ -301,7 +299,6 @@ test "allow any sentinel" {
301 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;299 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
302 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO300 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
303 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO301 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
304 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
305302
306 const S = struct {303 const S = struct {
307 fn doTheTest() !void {304 fn doTheTest() !void {
...@@ -318,7 +315,6 @@ test "pointer sentinel with enums" {...@@ -318,7 +315,6 @@ test "pointer sentinel with enums" {
318 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;315 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
319 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO316 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
320 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO317 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
321 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
322318
323 const S = struct {319 const S = struct {
324 const Number = enum {320 const Number = enum {
...@@ -340,7 +336,6 @@ test "pointer sentinel with optional element" {...@@ -340,7 +336,6 @@ test "pointer sentinel with optional element" {
340 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;336 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
341 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO337 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
342 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO338 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
343 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
344339
345 const S = struct {340 const S = struct {
346 fn doTheTest() !void {341 fn doTheTest() !void {
...@@ -424,7 +419,6 @@ test "@ptrToInt on null optional at comptime" {...@@ -424,7 +419,6 @@ test "@ptrToInt on null optional at comptime" {
424}419}
425420
426test "indexing array with sentinel returns correct type" {421test "indexing array with sentinel returns correct type" {
427 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
428 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO422 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
429 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO423 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
430 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO424 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/struct.zig-17
...@@ -282,7 +282,6 @@ const Val = struct {...@@ -282,7 +282,6 @@ const Val = struct {
282282
283test "struct point to self" {283test "struct point to self" {
284 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;284 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
285 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
286 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO285 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
287 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO286 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
288287
...@@ -300,7 +299,6 @@ test "struct point to self" {...@@ -300,7 +299,6 @@ test "struct point to self" {
300299
301test "void struct fields" {300test "void struct fields" {
302 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;301 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
303 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
304 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO302 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
305 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO303 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
306 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO304 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
...@@ -321,7 +319,6 @@ const VoidStructFieldsFoo = struct {...@@ -321,7 +319,6 @@ const VoidStructFieldsFoo = struct {
321319
322test "return empty struct from fn" {320test "return empty struct from fn" {
323 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;321 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
324 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
325 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO322 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
326323
327 _ = testReturnEmptyStructFromFn();324 _ = testReturnEmptyStructFromFn();
...@@ -333,7 +330,6 @@ fn testReturnEmptyStructFromFn() EmptyStruct2 {...@@ -333,7 +330,6 @@ fn testReturnEmptyStructFromFn() EmptyStruct2 {
333330
334test "pass slice of empty struct to fn" {331test "pass slice of empty struct to fn" {
335 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;332 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
336 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
337 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO333 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
338334
339 try expect(testPassSliceOfEmptyStructToFn(&[_]EmptyStruct2{EmptyStruct2{}}) == 1);335 try expect(testPassSliceOfEmptyStructToFn(&[_]EmptyStruct2{EmptyStruct2{}}) == 1);
...@@ -344,7 +340,6 @@ fn testPassSliceOfEmptyStructToFn(slice: []const EmptyStruct2) usize {...@@ -344,7 +340,6 @@ fn testPassSliceOfEmptyStructToFn(slice: []const EmptyStruct2) usize {
344340
345test "self-referencing struct via array member" {341test "self-referencing struct via array member" {
346 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;342 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
347 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
348 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO343 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
349 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO344 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
350 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO345 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
...@@ -358,7 +353,6 @@ test "self-referencing struct via array member" {...@@ -358,7 +353,6 @@ test "self-referencing struct via array member" {
358}353}
359354
360test "empty struct method call" {355test "empty struct method call" {
361 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
362 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO356 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
363357
364 const es = EmptyStruct{};358 const es = EmptyStruct{};
...@@ -373,7 +367,6 @@ const EmptyStruct = struct {...@@ -373,7 +367,6 @@ const EmptyStruct = struct {
373367
374test "align 1 field before self referential align 8 field as slice return type" {368test "align 1 field before self referential align 8 field as slice return type" {
375 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;369 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
376 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
377 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO370 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
378371
379 const result = alloc(Expr);372 const result = alloc(Expr);
...@@ -633,7 +626,6 @@ fn getC(data: *const BitField1) u2 {...@@ -633,7 +626,6 @@ fn getC(data: *const BitField1) u2 {
633626
634test "default struct initialization fields" {627test "default struct initialization fields" {
635 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;628 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
636 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
637 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO629 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
638630
639 const S = struct {631 const S = struct {
...@@ -775,7 +767,6 @@ test "packed struct with u0 field access" {...@@ -775,7 +767,6 @@ test "packed struct with u0 field access" {
775}767}
776768
777test "access to global struct fields" {769test "access to global struct fields" {
778 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
779 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO770 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
780 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO771 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
781 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO772 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
...@@ -903,7 +894,6 @@ test "packed struct field passed to generic function" {...@@ -903,7 +894,6 @@ test "packed struct field passed to generic function" {
903894
904test "anonymous struct literal syntax" {895test "anonymous struct literal syntax" {
905 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;896 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
906 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
907 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO897 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
908898
909 const S = struct {899 const S = struct {
...@@ -992,7 +982,6 @@ test "comptime struct field" {...@@ -992,7 +982,6 @@ test "comptime struct field" {
992}982}
993983
994test "tuple element initialized with fn call" {984test "tuple element initialized with fn call" {
995 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
996 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO985 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
997 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO986 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
998 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO987 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -1030,7 +1019,6 @@ test "struct with union field" {...@@ -1030,7 +1019,6 @@ test "struct with union field" {
1030}1019}
10311020
1032test "type coercion of anon struct literal to struct" {1021test "type coercion of anon struct literal to struct" {
1033 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1034 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1022 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1035 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1023 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1036 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1024 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -1069,7 +1057,6 @@ test "type coercion of anon struct literal to struct" {...@@ -1069,7 +1057,6 @@ test "type coercion of anon struct literal to struct" {
1069}1057}
10701058
1071test "type coercion of pointer to anon struct literal to pointer to struct" {1059test "type coercion of pointer to anon struct literal to pointer to struct" {
1072 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1073 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1060 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1074 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1061 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1075 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1062 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" {...@@ -1181,7 +1168,6 @@ test "for loop over pointers to struct, getting field from struct pointer" {
1181test "anon init through error unions and optionals" {1168test "anon init through error unions and optionals" {
1182 if (builtin.zig_backend == .stage1) return error.SkipZigTest;1169 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
1183 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1170 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1184 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1185 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1171 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1186 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1172 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1187 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1173 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -1210,7 +1196,6 @@ test "anon init through error unions and optionals" {...@@ -1210,7 +1196,6 @@ test "anon init through error unions and optionals" {
1210test "anon init through optional" {1196test "anon init through optional" {
1211 if (builtin.zig_backend == .stage1) return error.SkipZigTest;1197 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
1212 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1198 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1213 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1214 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1199 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1215 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1200 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1216 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1201 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -1232,7 +1217,6 @@ test "anon init through optional" {...@@ -1232,7 +1217,6 @@ test "anon init through optional" {
1232test "anon init through error union" {1217test "anon init through error union" {
1233 if (builtin.zig_backend == .stage1) return error.SkipZigTest;1218 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
1234 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1219 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1235 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1236 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1220 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1237 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1221 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1238 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1222 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -1254,7 +1238,6 @@ test "anon init through error union" {...@@ -1254,7 +1238,6 @@ test "anon init through error union" {
1254test "typed init through error unions and optionals" {1238test "typed init through error unions and optionals" {
1255 if (builtin.zig_backend == .stage1) return error.SkipZigTest;1239 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
1256 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1240 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1257 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1258 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1241 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1259 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1242 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1260 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1243 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" {...@@ -434,7 +434,6 @@ test "else prong of switch on error set excludes other cases" {
434 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO434 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
435 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO435 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
436 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO436 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
437 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
438437
439 const S = struct {438 const S = struct {
440 fn doTheTest() !void {439 fn doTheTest() !void {
...@@ -581,7 +580,6 @@ test "switch prongs with cases with identical payload types" {...@@ -581,7 +580,6 @@ test "switch prongs with cases with identical payload types" {
581}580}
582581
583test "switch on pointer type" {582test "switch on pointer type" {
584 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
585 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO583 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
586 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO584 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
587 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO585 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -630,7 +628,6 @@ test "switch on error set with single else" {...@@ -630,7 +628,6 @@ test "switch on error set with single else" {
630}628}
631629
632test "switch capture copies its payload" {630test "switch capture copies its payload" {
633 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
634 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO631 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
635 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO632 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
636 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO633 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/behavior/type.zig-3
...@@ -353,7 +353,6 @@ test "Type.Struct" {...@@ -353,7 +353,6 @@ test "Type.Struct" {
353}353}
354354
355test "Type.Enum" {355test "Type.Enum" {
356 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
357 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO356 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
358 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO357 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
359 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO358 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
...@@ -465,7 +464,6 @@ test "Type.Union" {...@@ -465,7 +464,6 @@ test "Type.Union" {
465}464}
466465
467test "Type.Union from Type.Enum" {466test "Type.Union from Type.Enum" {
468 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
469 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO467 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
470 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO468 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
471 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO469 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -496,7 +494,6 @@ test "Type.Union from Type.Enum" {...@@ -496,7 +494,6 @@ test "Type.Union from Type.Enum" {
496}494}
497495
498test "Type.Union from regular enum" {496test "Type.Union from regular enum" {
499 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
500 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO497 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
501 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO498 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
502 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO499 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/behavior/typename.zig-6
...@@ -18,7 +18,6 @@ test "anon fn param" {...@@ -18,7 +18,6 @@ test "anon fn param" {
18 return error.SkipZigTest;18 return error.SkipZigTest;
19 }19 }
2020
21 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
22 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO21 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
23 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO22 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
24 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO23 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -51,7 +50,6 @@ test "anon field init" {...@@ -51,7 +50,6 @@ test "anon field init" {
51 return error.SkipZigTest;50 return error.SkipZigTest;
52 }51 }
5352
54 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
55 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO53 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
56 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO54 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
57 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO55 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -78,7 +76,6 @@ test "anon field init" {...@@ -78,7 +76,6 @@ test "anon field init" {
78}76}
7977
80test "basic" {78test "basic" {
81 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
82 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO79 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
83 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO80 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
84 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO81 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -95,7 +92,6 @@ test "top level decl" {...@@ -95,7 +92,6 @@ test "top level decl" {
95 return error.SkipZigTest;92 return error.SkipZigTest;
96 }93 }
9794
98 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
99 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO95 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
100 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO96 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
101 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO97 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -147,7 +143,6 @@ test "fn body decl" {...@@ -147,7 +143,6 @@ test "fn body decl" {
147 return error.SkipZigTest;143 return error.SkipZigTest;
148 }144 }
149145
150 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
151 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO146 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
152 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO147 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
153 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO148 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
...@@ -182,7 +177,6 @@ const B = struct {...@@ -182,7 +177,6 @@ const B = struct {
182};177};
183178
184test "fn param" {179test "fn param" {
185 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
186 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO180 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
187 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO181 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
188 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO182 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO