| author | |
| committer | |
| log | e02ec8f7f5485b4e95ca8089b25a1c76d85c5834 |
| tree | 6f73e582246515b07220df133b440b55d426313d |
| parent | a36f4ee290fa9f3f1515e8aa9bd2bb0f0117c505 |
| parent | 5cb16dfa59c6e1de1fbcbfcfdecdca1335690df0 |
| signature | Signed by PGP key 4AEE18F83AFDEB23 |
stage2: wasm - `@errorName` and more15 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), |
| 1333 | 1334 | ||
| 1334 | // TODO | 1335 | // 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), |
| 1386 | 1389 | ||
| 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), |
| 1399 | 1402 | ||
| 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), | ||
| 1406 | 1412 | ||
| 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, | ||
| 1433 | 1437 | ||
| 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, |
| 1447 | 1451 | ||
| 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, |
| 1463 | 1463 | ||
| 1464 | // For these 4, probably best to wait until https://github.com/ziglang/zig/issues/10248 | 1464 | // 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 | } |
| 2541 | 2562 | ||
| 2542 | fn airUnwrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) InnerError!WValue { | 2563 | fn 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 | } |
| 2557 | 2579 | ||
| 2558 | fn airUnwrapErrUnionError(self: *Self, inst: Air.Inst.Index) InnerError!WValue { | 2580 | fn 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 = {} }; |
| 2560 | 2582 | ||
| 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 | } |
| 2568 | 2591 | ||
| ... | @@ -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 | } |
| 3212 | 3235 | ||
| 3236 | fn 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 | |||
| 3213 | fn airSplat(self: *Self, inst: Air.Inst.Index) InnerError!WValue { | 3258 | fn 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 = {} }; |
| 3215 | 3260 | ||
| ... | @@ -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 | |||
| 3667 | fn 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 | |||
| 3710 | fn 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. |
| 124 | export_names: std.AutoHashMapUnmanaged(SymbolLoc, u32) = .{}, | 124 | export_names: std.AutoHashMapUnmanaged(SymbolLoc, u32) = .{}, |
| 125 | 125 | ||
| 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`. | ||
| 131 | error_table_symbol: ?u32 = null, | ||
| 132 | |||
| 126 | pub const Segment = struct { | 133 | pub 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 | } |
| 1324 | 1331 | ||
| 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. | ||
| 1335 | pub 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. | ||
| 1381 | fn 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 | |||
| 1325 | fn resetState(self: *Wasm) void { | 1449 | fn 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 | } |
| 1375 | 1499 | ||
| 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 written | 1503 | // 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 { |
| 10 | test { | 10 | test { |
| 11 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; // TODO | 11 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; // TODO |
| 12 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 12 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 13 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 14 | 13 | ||
| 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 { |
| 19 | var renderable: Renderable = undefined; | 19 | var renderable: Renderable = undefined; |
| 20 | 20 | ||
| 21 | test "assignment of field with padding" { | 21 | test "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 = |
| 12 | 12 | ||
| 13 | test "issue 6456" { | 13 | test "issue 6456" { |
| 14 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 14 | 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; // TODO | 15 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 17 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 16 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 18 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 17 | 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 | } |
| 97 | 97 | ||
| 98 | test "@intToFloat" { | 98 | test "@intToFloat" { |
| 99 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 100 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 99 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 101 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 100 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 102 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 101 | 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; // TODO | 544 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 546 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 545 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 547 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 546 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 548 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 549 | 547 | ||
| 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 | } |
| 608 | 606 | ||
| 609 | test "peer type resolution: unreachable, error set, unreachable" { | 607 | test "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; // TODO | 608 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 612 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 609 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 613 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 610 | 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; // TODO | 815 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 819 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 816 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 820 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 817 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 821 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 822 | 818 | ||
| 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; // TODO | 906 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 911 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 907 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 912 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 908 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 913 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 914 | 909 | ||
| 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" { |
| 930 | 925 | ||
| 931 | test "peer type resolution implicit cast to return type" { | 926 | test "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; // TODO | 928 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 935 | 929 | ||
| 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" { |
| 951 | 945 | ||
| 952 | test "peer type resolution implicit cast to variable type" { | 946 | test "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; // TODO | 948 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 956 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 949 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 957 | 950 | ||
| ... | @@ -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 | } |
| 992 | 985 | ||
| 993 | test "peer type resolve string lit with sentinel-terminated mutable slice" { | 986 | test "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; // TODO | 987 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 996 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 988 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 997 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 989 | 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 | } |
| 1012 | 1004 | ||
| 1013 | test "peer type resolve array pointer and unknown pointer" { | 1005 | test "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; // TODO | 1006 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1016 | 1007 | ||
| 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; // TODO | 1075 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1085 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1076 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1086 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 1077 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1087 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 1088 | 1078 | ||
| 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 | } |
| 179 | 179 | ||
| 180 | test "error set type" { | 180 | test "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 | } |
| 222 | 220 | ||
| 223 | test "comptime test error for empty error set" { | 221 | test "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; // TODO | 222 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 226 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 223 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 227 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 224 | 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 | } |
| 339 | 336 | ||
| 340 | test "nested error union function call in optional unwrap" { | 337 | test "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; // TODO | 338 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 343 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 339 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 344 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 340 | 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 | } |
| 387 | 383 | ||
| 388 | test "return function call to error set from error union function" { | 384 | test "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; // TODO | 385 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 391 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 386 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 392 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 387 | 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 | } |
| 419 | 414 | ||
| 420 | test "nested catch" { | 415 | test "nested catch" { |
| 421 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 422 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 416 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 423 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 417 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 424 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 418 | 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 | } |
| 452 | 446 | ||
| 453 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 447 | 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; // TODO | 448 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 456 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 449 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 457 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 450 | 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 | } |
| 478 | 471 | ||
| 479 | test "return result loc as peer result loc in inferred error set function" { | 472 | test "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; // TODO | 473 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 482 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 474 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 483 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 475 | 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 | } |
| 510 | 502 | ||
| 511 | test "error payload type is correctly resolved" { | 503 | test "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; // TODO | 504 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 514 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 505 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 515 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 506 | 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" { |
| 540 | 531 | ||
| 541 | test "@errorName" { | 532 | test "@errorName" { |
| 542 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 533 | 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 { |
| 555 | 545 | ||
| 556 | test "@errorName sentinel length matches slice length" { | 546 | test "@errorName sentinel length matches slice length" { |
| 557 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 547 | 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 | } |
| 66 | 66 | ||
| 67 | test "address of unwrap optional" { | 67 | test "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; // TODO | 68 | 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; // TODO | 70 | 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 | } |
| 167 | 167 | ||
| 168 | test "implicit cast error unions with non-optional to optional pointer" { | 168 | test "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; // TODO | 169 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 171 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 170 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 172 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 171 | 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; // TODO | 282 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 284 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 283 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 285 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 286 | 284 | ||
| 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; // TODO | 300 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 303 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 301 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 304 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 305 | 302 | ||
| 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; // TODO | 316 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 320 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 317 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 321 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 322 | 318 | ||
| 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; // TODO | 337 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 342 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 338 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 343 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 344 | 339 | ||
| 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 | } |
| 425 | 420 | ||
| 426 | test "indexing array with sentinel returns correct type" { | 421 | test "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; // TODO | 422 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 429 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 423 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 430 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 424 | 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 { |
| 282 | 282 | ||
| 283 | test "struct point to self" { | 283 | test "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; // TODO | 285 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 287 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 286 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 288 | 287 | ||
| ... | @@ -300,7 +299,6 @@ test "struct point to self" { | ... | @@ -300,7 +299,6 @@ test "struct point to self" { |
| 300 | 299 | ||
| 301 | test "void struct fields" { | 300 | test "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; // TODO | 302 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 305 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 303 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 306 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 304 | 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 { |
| 321 | 319 | ||
| 322 | test "return empty struct from fn" { | 320 | test "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; // TODO | 322 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 326 | 323 | ||
| 327 | _ = testReturnEmptyStructFromFn(); | 324 | _ = testReturnEmptyStructFromFn(); |
| ... | @@ -333,7 +330,6 @@ fn testReturnEmptyStructFromFn() EmptyStruct2 { | ... | @@ -333,7 +330,6 @@ fn testReturnEmptyStructFromFn() EmptyStruct2 { |
| 333 | 330 | ||
| 334 | test "pass slice of empty struct to fn" { | 331 | test "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; // TODO | 333 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 338 | 334 | ||
| 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 { |
| 344 | 340 | ||
| 345 | test "self-referencing struct via array member" { | 341 | test "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; // TODO | 343 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 349 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 344 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 350 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 345 | 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 | } |
| 359 | 354 | ||
| 360 | test "empty struct method call" { | 355 | test "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; // TODO | 356 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 363 | 357 | ||
| 364 | const es = EmptyStruct{}; | 358 | const es = EmptyStruct{}; |
| ... | @@ -373,7 +367,6 @@ const EmptyStruct = struct { | ... | @@ -373,7 +367,6 @@ const EmptyStruct = struct { |
| 373 | 367 | ||
| 374 | test "align 1 field before self referential align 8 field as slice return type" { | 368 | test "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; // TODO | 370 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 378 | 371 | ||
| 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 { |
| 633 | 626 | ||
| 634 | test "default struct initialization fields" { | 627 | test "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; // TODO | 629 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 638 | 630 | ||
| 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 | } |
| 776 | 768 | ||
| 777 | test "access to global struct fields" { | 769 | test "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; // TODO | 770 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 780 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 771 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 781 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 772 | 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" { |
| 903 | 894 | ||
| 904 | test "anonymous struct literal syntax" { | 895 | test "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; // TODO | 897 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 908 | 898 | ||
| 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 | } |
| 993 | 983 | ||
| 994 | test "tuple element initialized with fn call" { | 984 | test "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; // TODO | 985 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 997 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 986 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 998 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 987 | 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 | } |
| 1031 | 1020 | ||
| 1032 | test "type coercion of anon struct literal to struct" { | 1021 | test "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; // TODO | 1022 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1035 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1023 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1036 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1024 | 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 | } |
| 1070 | 1058 | ||
| 1071 | test "type coercion of pointer to anon struct literal to pointer to struct" { | 1059 | test "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; // TODO | 1060 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1074 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1061 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1075 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1062 | 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" { |
| 1181 | test "anon init through error unions and optionals" { | 1168 | test "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; // TODO | 1170 | 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; // TODO | 1171 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1186 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1172 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1187 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1173 | 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" { |
| 1210 | test "anon init through optional" { | 1196 | test "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; // TODO | 1198 | 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; // TODO | 1199 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1215 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1200 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1216 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1201 | 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" { |
| 1232 | test "anon init through error union" { | 1217 | test "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; // TODO | 1219 | 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; // TODO | 1220 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1237 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1221 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1238 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1222 | 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" { |
| 1254 | test "typed init through error unions and optionals" { | 1238 | test "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; // TODO | 1240 | 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; // TODO | 1241 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1259 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1242 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1260 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1243 | 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; // TODO | 434 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 435 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 435 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 436 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 436 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 437 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 438 | 437 | ||
| 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 | } |
| 582 | 581 | ||
| 583 | test "switch on pointer type" { | 582 | test "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; // TODO | 583 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 586 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 584 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 587 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 585 | 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 | } |
| 631 | 629 | ||
| 632 | test "switch capture copies its payload" { | 630 | test "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; // TODO | 631 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 635 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 632 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 636 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 633 | 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 | } |
| 354 | 354 | ||
| 355 | test "Type.Enum" { | 355 | test "Type.Enum" { |
| 356 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 357 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 356 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 358 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 357 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 359 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 358 | 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 | } |
| 466 | 465 | ||
| 467 | test "Type.Union from Type.Enum" { | 466 | test "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; // TODO | 467 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 470 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 468 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 471 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 469 | 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 | } |
| 497 | 495 | ||
| 498 | test "Type.Union from regular enum" { | 496 | test "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; // TODO | 497 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 501 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 498 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 502 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 499 | 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 | } |
| 20 | 20 | ||
| 21 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 22 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 21 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 23 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 22 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 24 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 23 | 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 | } |
| 53 | 52 | ||
| 54 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 55 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 53 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 56 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 54 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 57 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 55 | 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 | } |
| 79 | 77 | ||
| 80 | test "basic" { | 78 | test "basic" { |
| 81 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 82 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 79 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 83 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 80 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 84 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 81 | 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 | } |
| 97 | 94 | ||
| 98 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 99 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 95 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 100 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 96 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 101 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 97 | 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 | } |
| 149 | 145 | ||
| 150 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 151 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 146 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 152 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 147 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 153 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 148 | 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 | }; |
| 183 | 178 | ||
| 184 | test "fn param" { | 179 | test "fn param" { |
| 185 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | ||
| 186 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 180 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 187 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 181 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 188 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 182 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |