| author | |
| committer | |
| log | a270c6f8c82bc81eecf37cc06a326e46ed44fb8b |
| tree | 6ee1ab61e42d94d92eaeb62ee7b371d64de2e9a7 |
| parent | d69c48370a0381c7dce463c68b2097dd8fa67eb7 |
| signature |
23 files changed, 222 insertions(+), 105 deletions(-)
src/arch/riscv64/CodeGen.zig+220-58| ... | @@ -1545,6 +1545,58 @@ fn splitType(func: *Func, ty: Type) ![2]Type { | ... | @@ -1545,6 +1545,58 @@ fn splitType(func: *Func, ty: Type) ![2]Type { |
| 1545 | return func.fail("TODO implement splitType for {}", .{ty.fmt(zcu)}); | 1545 | return func.fail("TODO implement splitType for {}", .{ty.fmt(zcu)}); |
| 1546 | } | 1546 | } |
| 1547 | 1547 | ||
| 1548 | /// Truncates the value in the register in place. | ||
| 1549 | /// Clobbers any remaining bits. | ||
| 1550 | fn truncateRegister(func: *Func, ty: Type, reg: Register) !void { | ||
| 1551 | const mod = func.bin_file.comp.module.?; | ||
| 1552 | const int_info = if (ty.isAbiInt(mod)) ty.intInfo(mod) else std.builtin.Type.Int{ | ||
| 1553 | .signedness = .unsigned, | ||
| 1554 | .bits = @intCast(ty.bitSize(mod)), | ||
| 1555 | }; | ||
| 1556 | const shift = math.cast(u6, 64 - int_info.bits % 64) orelse return; | ||
| 1557 | switch (int_info.signedness) { | ||
| 1558 | .signed => { | ||
| 1559 | _ = try func.addInst(.{ | ||
| 1560 | .tag = .slli, | ||
| 1561 | .ops = .rri, | ||
| 1562 | .data = .{ | ||
| 1563 | .i_type = .{ | ||
| 1564 | .rd = reg, | ||
| 1565 | .rs1 = reg, | ||
| 1566 | .imm12 = Immediate.s(shift), | ||
| 1567 | }, | ||
| 1568 | }, | ||
| 1569 | }); | ||
| 1570 | _ = try func.addInst(.{ | ||
| 1571 | .tag = .srai, | ||
| 1572 | .ops = .rri, | ||
| 1573 | .data = .{ | ||
| 1574 | .i_type = .{ | ||
| 1575 | .rd = reg, | ||
| 1576 | .rs1 = reg, | ||
| 1577 | .imm12 = Immediate.s(shift), | ||
| 1578 | }, | ||
| 1579 | }, | ||
| 1580 | }); | ||
| 1581 | }, | ||
| 1582 | .unsigned => { | ||
| 1583 | const mask = ~@as(u64, 0) >> shift; | ||
| 1584 | const tmp_reg = try func.copyToTmpRegister(Type.usize, .{ .immediate = mask }); | ||
| 1585 | _ = try func.addInst(.{ | ||
| 1586 | .tag = .@"and", | ||
| 1587 | .ops = .rrr, | ||
| 1588 | .data = .{ | ||
| 1589 | .r_type = .{ | ||
| 1590 | .rd = reg, | ||
| 1591 | .rs1 = reg, | ||
| 1592 | .rs2 = tmp_reg, | ||
| 1593 | }, | ||
| 1594 | }, | ||
| 1595 | }); | ||
| 1596 | }, | ||
| 1597 | } | ||
| 1598 | } | ||
| 1599 | |||
| 1548 | fn symbolIndex(func: *Func) !u32 { | 1600 | fn symbolIndex(func: *Func) !u32 { |
| 1549 | const zcu = func.bin_file.comp.module.?; | 1601 | const zcu = func.bin_file.comp.module.?; |
| 1550 | const decl_index = zcu.funcOwnerDeclIndex(func.func_index); | 1602 | const decl_index = zcu.funcOwnerDeclIndex(func.func_index); |
| ... | @@ -2868,8 +2920,25 @@ fn airShr(func: *Func, inst: Air.Inst.Index) !void { | ... | @@ -2868,8 +2920,25 @@ fn airShr(func: *Func, inst: Air.Inst.Index) !void { |
| 2868 | } | 2920 | } |
| 2869 | 2921 | ||
| 2870 | fn airOptionalPayload(func: *Func, inst: Air.Inst.Index) !void { | 2922 | fn airOptionalPayload(func: *Func, inst: Air.Inst.Index) !void { |
| 2923 | const zcu = func.bin_file.comp.module.?; | ||
| 2871 | const ty_op = func.air.instructions.items(.data)[@intFromEnum(inst)].ty_op; | 2924 | const ty_op = func.air.instructions.items(.data)[@intFromEnum(inst)].ty_op; |
| 2872 | const result: MCValue = if (func.liveness.isUnused(inst)) .unreach else return func.fail("TODO implement .optional_payload for {}", .{func.target.cpu.arch}); | 2925 | const result: MCValue = result: { |
| 2926 | const pl_ty = func.typeOfIndex(inst); | ||
| 2927 | if (!pl_ty.hasRuntimeBitsIgnoreComptime(zcu)) break :result .none; | ||
| 2928 | |||
| 2929 | const opt_mcv = try func.resolveInst(ty_op.operand); | ||
| 2930 | if (func.reuseOperand(inst, ty_op.operand, 0, opt_mcv)) { | ||
| 2931 | switch (opt_mcv) { | ||
| 2932 | .register => |pl_reg| try func.truncateRegister(pl_ty, pl_reg), | ||
| 2933 | else => {}, | ||
| 2934 | } | ||
| 2935 | break :result opt_mcv; | ||
| 2936 | } | ||
| 2937 | |||
| 2938 | const pl_mcv = try func.allocRegOrMem(inst, true); | ||
| 2939 | try func.genCopy(pl_ty, pl_mcv, opt_mcv); | ||
| 2940 | break :result pl_mcv; | ||
| 2941 | }; | ||
| 2873 | return func.finishAir(inst, result, .{ ty_op.operand, .none, .none }); | 2942 | return func.finishAir(inst, result, .{ ty_op.operand, .none, .none }); |
| 2874 | } | 2943 | } |
| 2875 | 2944 | ||
| ... | @@ -3022,16 +3091,40 @@ fn airSaveErrReturnTraceIndex(func: *Func, inst: Air.Inst.Index) !void { | ... | @@ -3022,16 +3091,40 @@ fn airSaveErrReturnTraceIndex(func: *Func, inst: Air.Inst.Index) !void { |
| 3022 | } | 3091 | } |
| 3023 | 3092 | ||
| 3024 | fn airWrapOptional(func: *Func, inst: Air.Inst.Index) !void { | 3093 | fn airWrapOptional(func: *Func, inst: Air.Inst.Index) !void { |
| 3094 | const zcu = func.bin_file.comp.module.?; | ||
| 3025 | const ty_op = func.air.instructions.items(.data)[@intFromEnum(inst)].ty_op; | 3095 | const ty_op = func.air.instructions.items(.data)[@intFromEnum(inst)].ty_op; |
| 3026 | const result: MCValue = if (func.liveness.isUnused(inst)) .unreach else result: { | 3096 | const result: MCValue = result: { |
| 3027 | const zcu = func.bin_file.comp.module.?; | 3097 | const pl_ty = func.typeOf(ty_op.operand); |
| 3028 | const optional_ty = func.typeOfIndex(inst); | 3098 | if (!pl_ty.hasRuntimeBits(zcu)) break :result .{ .immediate = 1 }; |
| 3029 | 3099 | ||
| 3030 | // Optional with a zero-bit payload type is just a boolean true | 3100 | const opt_ty = func.typeOfIndex(inst); |
| 3031 | if (optional_ty.abiSize(zcu) == 1) | 3101 | const pl_mcv = try func.resolveInst(ty_op.operand); |
| 3032 | break :result MCValue{ .immediate = 1 }; | 3102 | const same_repr = opt_ty.optionalReprIsPayload(zcu); |
| 3103 | if (same_repr and func.reuseOperand(inst, ty_op.operand, 0, pl_mcv)) break :result pl_mcv; | ||
| 3033 | 3104 | ||
| 3034 | return func.fail("TODO implement wrap optional for {}", .{func.target.cpu.arch}); | 3105 | const pl_lock: ?RegisterLock = switch (pl_mcv) { |
| 3106 | .register => |reg| func.register_manager.lockRegAssumeUnused(reg), | ||
| 3107 | else => null, | ||
| 3108 | }; | ||
| 3109 | defer if (pl_lock) |lock| func.register_manager.unlockReg(lock); | ||
| 3110 | |||
| 3111 | const opt_mcv = try func.allocRegOrMem(inst, true); | ||
| 3112 | try func.genCopy(pl_ty, opt_mcv, pl_mcv); | ||
| 3113 | |||
| 3114 | if (!same_repr) { | ||
| 3115 | const pl_abi_size: i32 = @intCast(pl_ty.abiSize(zcu)); | ||
| 3116 | switch (opt_mcv) { | ||
| 3117 | .load_frame => |frame_addr| try func.genSetMem( | ||
| 3118 | .{ .frame = frame_addr.index }, | ||
| 3119 | frame_addr.off + pl_abi_size, | ||
| 3120 | Type.u8, | ||
| 3121 | .{ .immediate = 1 }, | ||
| 3122 | ), | ||
| 3123 | .register => return func.fail("TODO: airWrapOption opt_mcv register", .{}), | ||
| 3124 | else => unreachable, | ||
| 3125 | } | ||
| 3126 | } | ||
| 3127 | break :result opt_mcv; | ||
| 3035 | }; | 3128 | }; |
| 3036 | return func.finishAir(inst, result, .{ ty_op.operand, .none, .none }); | 3129 | return func.finishAir(inst, result, .{ ty_op.operand, .none, .none }); |
| 3037 | } | 3130 | } |
| ... | @@ -4435,72 +4528,141 @@ fn condBr(func: *Func, cond_ty: Type, condition: MCValue) !Mir.Inst.Index { | ... | @@ -4435,72 +4528,141 @@ fn condBr(func: *Func, cond_ty: Type, condition: MCValue) !Mir.Inst.Index { |
| 4435 | }); | 4528 | }); |
| 4436 | } | 4529 | } |
| 4437 | 4530 | ||
| 4531 | fn isNull(func: *Func, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MCValue { | ||
| 4532 | const zcu = func.bin_file.comp.module.?; | ||
| 4533 | const pl_ty = opt_ty.optionalChild(zcu); | ||
| 4534 | |||
| 4535 | const some_info: struct { off: i32, ty: Type } = if (opt_ty.optionalReprIsPayload(zcu)) | ||
| 4536 | .{ .off = 0, .ty = if (pl_ty.isSlice(zcu)) pl_ty.slicePtrFieldType(zcu) else pl_ty } | ||
| 4537 | else | ||
| 4538 | .{ .off = @intCast(pl_ty.abiSize(zcu)), .ty = Type.bool }; | ||
| 4539 | |||
| 4540 | const return_mcv = try func.allocRegOrMem(inst, true); | ||
| 4541 | assert(return_mcv == .register); // should not be larger 8 bytes | ||
| 4542 | const return_reg = return_mcv.register; | ||
| 4543 | |||
| 4544 | switch (opt_mcv) { | ||
| 4545 | .none, | ||
| 4546 | .unreach, | ||
| 4547 | .dead, | ||
| 4548 | .undef, | ||
| 4549 | .immediate, | ||
| 4550 | .register_pair, | ||
| 4551 | .register_offset, | ||
| 4552 | .lea_frame, | ||
| 4553 | .lea_symbol, | ||
| 4554 | .reserved_frame, | ||
| 4555 | .air_ref, | ||
| 4556 | => return func.fail("TODO: hmm {}", .{opt_mcv}), | ||
| 4557 | |||
| 4558 | .register => |opt_reg| { | ||
| 4559 | if (some_info.off == 0) { | ||
| 4560 | _ = try func.addInst(.{ | ||
| 4561 | .tag = .pseudo, | ||
| 4562 | .ops = .pseudo_compare, | ||
| 4563 | .data = .{ | ||
| 4564 | .compare = .{ | ||
| 4565 | .op = .eq, | ||
| 4566 | .rd = return_reg, | ||
| 4567 | .rs1 = opt_reg, | ||
| 4568 | .rs2 = try func.copyToTmpRegister( | ||
| 4569 | some_info.ty, | ||
| 4570 | .{ .immediate = 0 }, | ||
| 4571 | ), | ||
| 4572 | .size = .byte, | ||
| 4573 | }, | ||
| 4574 | }, | ||
| 4575 | }); | ||
| 4576 | return return_mcv; | ||
| 4577 | } | ||
| 4578 | assert(some_info.ty.ip_index == .bool_type); | ||
| 4579 | const opt_abi_size: u32 = @intCast(opt_ty.abiSize(zcu)); | ||
| 4580 | _ = opt_abi_size; | ||
| 4581 | return func.fail("TODO: isNull some_info.off != 0 register", .{}); | ||
| 4582 | }, | ||
| 4583 | |||
| 4584 | .load_frame => { | ||
| 4585 | const opt_reg = try func.copyToTmpRegister( | ||
| 4586 | some_info.ty, | ||
| 4587 | opt_mcv.address().offset(some_info.off).deref(), | ||
| 4588 | ); | ||
| 4589 | const opt_reg_lock = func.register_manager.lockRegAssumeUnused(opt_reg); | ||
| 4590 | defer func.register_manager.unlockReg(opt_reg_lock); | ||
| 4591 | |||
| 4592 | _ = try func.addInst(.{ | ||
| 4593 | .tag = .pseudo, | ||
| 4594 | .ops = .pseudo_compare, | ||
| 4595 | .data = .{ | ||
| 4596 | .compare = .{ | ||
| 4597 | .op = .eq, | ||
| 4598 | .rd = return_reg, | ||
| 4599 | .rs1 = opt_reg, | ||
| 4600 | .rs2 = try func.copyToTmpRegister( | ||
| 4601 | some_info.ty, | ||
| 4602 | .{ .immediate = 0 }, | ||
| 4603 | ), | ||
| 4604 | .size = .byte, | ||
| 4605 | }, | ||
| 4606 | }, | ||
| 4607 | }); | ||
| 4608 | return return_mcv; | ||
| 4609 | }, | ||
| 4610 | |||
| 4611 | else => return func.fail("TODO: isNull {}", .{opt_mcv}), | ||
| 4612 | } | ||
| 4613 | } | ||
| 4614 | |||
| 4438 | fn airIsNull(func: *Func, inst: Air.Inst.Index) !void { | 4615 | fn airIsNull(func: *Func, inst: Air.Inst.Index) !void { |
| 4439 | const un_op = func.air.instructions.items(.data)[@intFromEnum(inst)].un_op; | 4616 | const un_op = func.air.instructions.items(.data)[@intFromEnum(inst)].un_op; |
| 4440 | const result: MCValue = if (func.liveness.isUnused(inst)) .unreach else result: { | 4617 | const operand = try func.resolveInst(un_op); |
| 4441 | const operand = try func.resolveInst(un_op); | 4618 | const ty = func.typeOf(un_op); |
| 4442 | break :result try func.isNull(operand); | 4619 | const result = try func.isNull(inst, ty, operand); |
| 4443 | }; | ||
| 4444 | return func.finishAir(inst, result, .{ un_op, .none, .none }); | 4620 | return func.finishAir(inst, result, .{ un_op, .none, .none }); |
| 4445 | } | 4621 | } |
| 4446 | 4622 | ||
| 4447 | fn airIsNullPtr(func: *Func, inst: Air.Inst.Index) !void { | 4623 | fn airIsNullPtr(func: *Func, inst: Air.Inst.Index) !void { |
| 4448 | const un_op = func.air.instructions.items(.data)[@intFromEnum(inst)].un_op; | 4624 | const un_op = func.air.instructions.items(.data)[@intFromEnum(inst)].un_op; |
| 4449 | const result: MCValue = if (func.liveness.isUnused(inst)) .unreach else result: { | 4625 | const operand = try func.resolveInst(un_op); |
| 4450 | const operand_ptr = try func.resolveInst(un_op); | 4626 | _ = operand; // autofix |
| 4451 | const operand: MCValue = blk: { | 4627 | const ty = func.typeOf(un_op); |
| 4452 | if (func.reuseOperand(inst, un_op, 0, operand_ptr)) { | 4628 | _ = ty; // autofix |
| 4453 | // The MCValue that holds the pointer can be re-used as the value. | ||
| 4454 | break :blk operand_ptr; | ||
| 4455 | } else { | ||
| 4456 | break :blk try func.allocRegOrMem(inst, true); | ||
| 4457 | } | ||
| 4458 | }; | ||
| 4459 | try func.load(operand, operand_ptr, func.typeOf(un_op)); | ||
| 4460 | break :result try func.isNull(operand); | ||
| 4461 | }; | ||
| 4462 | return func.finishAir(inst, result, .{ un_op, .none, .none }); | ||
| 4463 | } | ||
| 4464 | 4629 | ||
| 4465 | fn isNull(func: *Func, operand: MCValue) !MCValue { | 4630 | if (true) return func.fail("TODO: airIsNullPtr", .{}); |
| 4466 | _ = operand; | 4631 | |
| 4467 | // Here you can specialize this instruction if it makes sense to, otherwise the default | 4632 | return func.finishAir(inst, .unreach, .{ un_op, .none, .none }); |
| 4468 | // will call isNonNull and invert the result. | ||
| 4469 | return func.fail("TODO call isNonNull and invert the result", .{}); | ||
| 4470 | } | 4633 | } |
| 4471 | 4634 | ||
| 4472 | fn airIsNonNull(func: *Func, inst: Air.Inst.Index) !void { | 4635 | fn airIsNonNull(func: *Func, inst: Air.Inst.Index) !void { |
| 4473 | const un_op = func.air.instructions.items(.data)[@intFromEnum(inst)].un_op; | 4636 | const un_op = func.air.instructions.items(.data)[@intFromEnum(inst)].un_op; |
| 4474 | const result: MCValue = if (func.liveness.isUnused(inst)) .unreach else result: { | 4637 | const operand = try func.resolveInst(un_op); |
| 4475 | const operand = try func.resolveInst(un_op); | 4638 | const ty = func.typeOf(un_op); |
| 4476 | break :result try func.isNonNull(operand); | 4639 | const result = try func.isNull(inst, ty, operand); |
| 4477 | }; | 4640 | assert(result == .register); |
| 4478 | return func.finishAir(inst, result, .{ un_op, .none, .none }); | ||
| 4479 | } | ||
| 4480 | 4641 | ||
| 4481 | fn isNonNull(func: *Func, operand: MCValue) !MCValue { | 4642 | _ = try func.addInst(.{ |
| 4482 | _ = operand; | 4643 | .tag = .pseudo, |
| 4483 | // Here you can specialize this instruction if it makes sense to, otherwise the default | 4644 | .ops = .pseudo_not, |
| 4484 | // will call isNull and invert the result. | 4645 | .data = .{ |
| 4485 | return func.fail("TODO call isNull and invert the result", .{}); | 4646 | .rr = .{ |
| 4647 | .rd = result.register, | ||
| 4648 | .rs = result.register, | ||
| 4649 | }, | ||
| 4650 | }, | ||
| 4651 | }); | ||
| 4652 | |||
| 4653 | return func.finishAir(inst, result, .{ un_op, .none, .none }); | ||
| 4486 | } | 4654 | } |
| 4487 | 4655 | ||
| 4488 | fn airIsNonNullPtr(func: *Func, inst: Air.Inst.Index) !void { | 4656 | fn airIsNonNullPtr(func: *Func, inst: Air.Inst.Index) !void { |
| 4489 | const un_op = func.air.instructions.items(.data)[@intFromEnum(inst)].un_op; | 4657 | const un_op = func.air.instructions.items(.data)[@intFromEnum(inst)].un_op; |
| 4490 | const result: MCValue = if (func.liveness.isUnused(inst)) .unreach else result: { | 4658 | const operand = try func.resolveInst(un_op); |
| 4491 | const operand_ptr = try func.resolveInst(un_op); | 4659 | _ = operand; // autofix |
| 4492 | const operand: MCValue = blk: { | 4660 | const ty = func.typeOf(un_op); |
| 4493 | if (func.reuseOperand(inst, un_op, 0, operand_ptr)) { | 4661 | _ = ty; // autofix |
| 4494 | // The MCValue that holds the pointer can be re-used as the value. | 4662 | |
| 4495 | break :blk operand_ptr; | 4663 | if (true) return func.fail("TODO: airIsNonNullPtr", .{}); |
| 4496 | } else { | 4664 | |
| 4497 | break :blk try func.allocRegOrMem(inst, true); | 4665 | return func.finishAir(inst, .unreach, .{ un_op, .none, .none }); |
| 4498 | } | ||
| 4499 | }; | ||
| 4500 | try func.load(operand, operand_ptr, func.typeOf(un_op)); | ||
| 4501 | break :result try func.isNonNull(operand); | ||
| 4502 | }; | ||
| 4503 | return func.finishAir(inst, result, .{ un_op, .none, .none }); | ||
| 4504 | } | 4666 | } |
| 4505 | 4667 | ||
| 4506 | fn airIsErr(func: *Func, inst: Air.Inst.Index) !void { | 4668 | fn airIsErr(func: *Func, inst: Air.Inst.Index) !void { |
| ... | @@ -5110,7 +5272,7 @@ fn genCopy(func: *Func, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !void { | ... | @@ -5110,7 +5272,7 @@ fn genCopy(func: *Func, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !void { |
| 5110 | dst_mcv, | 5272 | dst_mcv, |
| 5111 | try func.resolveInst(src_ref), | 5273 | try func.resolveInst(src_ref), |
| 5112 | ), | 5274 | ), |
| 5113 | else => unreachable, | 5275 | else => return func.fail("genCopy register_pair src: {}", .{src_mcv}), |
| 5114 | }; | 5276 | }; |
| 5115 | 5277 | ||
| 5116 | defer if (src_info) |info| { | 5278 | defer if (src_info) |info| { |
src/arch/riscv64/abi.zig+1| ... | @@ -125,6 +125,7 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]SystemClass { | ... | @@ -125,6 +125,7 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]SystemClass { |
| 125 | return result; | 125 | return result; |
| 126 | } | 126 | } |
| 127 | result[0] = .integer; | 127 | result[0] = .integer; |
| 128 | if (ty.optionalChild(zcu).abiSize(zcu) == 0) return result; | ||
| 128 | result[1] = .integer; | 129 | result[1] = .integer; |
| 129 | return result; | 130 | return result; |
| 130 | }, | 131 | }, |
src/arch/riscv64/bits.zig+1-1| ... | @@ -230,7 +230,7 @@ pub const Register = enum(u8) { | ... | @@ -230,7 +230,7 @@ pub const Register = enum(u8) { |
| 230 | return @as(u8, reg.id()); | 230 | return @as(u8, reg.id()); |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | pub fn bitSize(reg: Register, zcu: Module) u32 { | 233 | pub fn bitSize(reg: Register, zcu: *const Module) u32 { |
| 234 | const features = zcu.getTarget().cpu.features; | 234 | const features = zcu.getTarget().cpu.features; |
| 235 | 235 | ||
| 236 | return switch (@intFromEnum(reg)) { | 236 | return switch (@intFromEnum(reg)) { |
test/behavior/align.zig-1| ... | @@ -603,7 +603,6 @@ test "comptime alloc alignment" { | ... | @@ -603,7 +603,6 @@ test "comptime alloc alignment" { |
| 603 | } | 603 | } |
| 604 | 604 | ||
| 605 | test "@alignCast null" { | 605 | test "@alignCast null" { |
| 606 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO | ||
| 607 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 606 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 608 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 607 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 609 | 608 |
test/behavior/basic.zig-2| ... | @@ -483,7 +483,6 @@ fn testStructInFn() !void { | ... | @@ -483,7 +483,6 @@ fn testStructInFn() !void { |
| 483 | 483 | ||
| 484 | test "fn call returning scalar optional in equality expression" { | 484 | test "fn call returning scalar optional in equality expression" { |
| 485 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 485 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 486 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 487 | try expect(getNull() == null); | 486 | try expect(getNull() == null); |
| 488 | } | 487 | } |
| 489 | 488 | ||
| ... | @@ -494,7 +493,6 @@ fn getNull() ?*i32 { | ... | @@ -494,7 +493,6 @@ fn getNull() ?*i32 { |
| 494 | test "global variable assignment with optional unwrapping with var initialized to undefined" { | 493 | test "global variable assignment with optional unwrapping with var initialized to undefined" { |
| 495 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | 494 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 496 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 495 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 497 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 498 | 496 | ||
| 499 | const S = struct { | 497 | const S = struct { |
| 500 | var data: i32 = 1234; | 498 | var data: i32 = 1234; |
test/behavior/cast.zig-15| ... | @@ -186,7 +186,6 @@ fn expectIntFromFloat(comptime F: type, f: F, comptime I: type, i: I) !void { | ... | @@ -186,7 +186,6 @@ fn expectIntFromFloat(comptime F: type, f: F, comptime I: type, i: I) !void { |
| 186 | test "implicitly cast indirect pointer to maybe-indirect pointer" { | 186 | test "implicitly cast indirect pointer to maybe-indirect pointer" { |
| 187 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 187 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 188 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 188 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 189 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 190 | 189 | ||
| 191 | const S = struct { | 190 | const S = struct { |
| 192 | const Self = @This(); | 191 | const Self = @This(); |
| ... | @@ -247,7 +246,6 @@ test "coerce undefined to optional" { | ... | @@ -247,7 +246,6 @@ test "coerce undefined to optional" { |
| 247 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 246 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 248 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | 247 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 249 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 248 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 250 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 251 | 249 | ||
| 252 | try expect(MakeType(void).getNull() == null); | 250 | try expect(MakeType(void).getNull() == null); |
| 253 | try expect(MakeType(void).getNonNull() != null); | 251 | try expect(MakeType(void).getNonNull() != null); |
| ... | @@ -1184,7 +1182,6 @@ test "implicit ptr to *anyopaque" { | ... | @@ -1184,7 +1182,6 @@ test "implicit ptr to *anyopaque" { |
| 1184 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 1182 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1185 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1183 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1186 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1184 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1187 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1188 | 1185 | ||
| 1189 | var a: u32 = 1; | 1186 | var a: u32 = 1; |
| 1190 | const ptr: *align(@alignOf(u32)) anyopaque = &a; | 1187 | const ptr: *align(@alignOf(u32)) anyopaque = &a; |
| ... | @@ -1198,7 +1195,6 @@ test "implicit ptr to *anyopaque" { | ... | @@ -1198,7 +1195,6 @@ test "implicit ptr to *anyopaque" { |
| 1198 | test "return null from fn () anyerror!?&T" { | 1195 | test "return null from fn () anyerror!?&T" { |
| 1199 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 1196 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1200 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1197 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1201 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1202 | 1198 | ||
| 1203 | const a = returnNullFromOptionalTypeErrorRef(); | 1199 | const a = returnNullFromOptionalTypeErrorRef(); |
| 1204 | const b = returnNullLitFromOptionalTypeErrorRef(); | 1200 | const b = returnNullLitFromOptionalTypeErrorRef(); |
| ... | @@ -1289,7 +1285,6 @@ test "implicit cast from *T to ?*anyopaque" { | ... | @@ -1289,7 +1285,6 @@ test "implicit cast from *T to ?*anyopaque" { |
| 1289 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 1285 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1290 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1286 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1291 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1287 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1292 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1293 | 1288 | ||
| 1294 | var a: u8 = 1; | 1289 | var a: u8 = 1; |
| 1295 | incrementVoidPtrValue(&a); | 1290 | incrementVoidPtrValue(&a); |
| ... | @@ -1361,7 +1356,6 @@ test "assignment to optional pointer result loc" { | ... | @@ -1361,7 +1356,6 @@ test "assignment to optional pointer result loc" { |
| 1361 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 1356 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1362 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1357 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1363 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1358 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1364 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1365 | 1359 | ||
| 1366 | var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct }; | 1360 | var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct }; |
| 1367 | _ = &foo; | 1361 | _ = &foo; |
| ... | @@ -1437,7 +1431,6 @@ test "peer type resolution: unreachable, null, slice" { | ... | @@ -1437,7 +1431,6 @@ test "peer type resolution: unreachable, null, slice" { |
| 1437 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 1431 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1438 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1432 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1439 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1433 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1440 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1441 | 1434 | ||
| 1442 | const S = struct { | 1435 | const S = struct { |
| 1443 | fn doTheTest(num: usize, word: []const u8) !void { | 1436 | fn doTheTest(num: usize, word: []const u8) !void { |
| ... | @@ -1478,7 +1471,6 @@ test "cast compatible optional types" { | ... | @@ -1478,7 +1471,6 @@ test "cast compatible optional types" { |
| 1478 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1471 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1479 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1472 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1480 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1473 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1481 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1482 | 1474 | ||
| 1483 | var a: ?[:0]const u8 = null; | 1475 | var a: ?[:0]const u8 = null; |
| 1484 | _ = &a; | 1476 | _ = &a; |
| ... | @@ -1591,7 +1583,6 @@ test "bitcast packed struct with u0" { | ... | @@ -1591,7 +1583,6 @@ test "bitcast packed struct with u0" { |
| 1591 | 1583 | ||
| 1592 | test "optional pointer coerced to optional allowzero pointer" { | 1584 | test "optional pointer coerced to optional allowzero pointer" { |
| 1593 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1585 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1594 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1595 | 1586 | ||
| 1596 | var p: ?*u32 = undefined; | 1587 | var p: ?*u32 = undefined; |
| 1597 | var q: ?*allowzero u32 = undefined; | 1588 | var q: ?*allowzero u32 = undefined; |
| ... | @@ -1608,8 +1599,6 @@ test "optional slice coerced to allowzero many pointer" { | ... | @@ -1608,8 +1599,6 @@ test "optional slice coerced to allowzero many pointer" { |
| 1608 | } | 1599 | } |
| 1609 | 1600 | ||
| 1610 | test "optional slice passed as parameter coerced to allowzero many pointer" { | 1601 | test "optional slice passed as parameter coerced to allowzero many pointer" { |
| 1611 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1612 | |||
| 1613 | const ns = struct { | 1602 | const ns = struct { |
| 1614 | const Color = struct { | 1603 | const Color = struct { |
| 1615 | r: u8, | 1604 | r: u8, |
| ... | @@ -1832,7 +1821,6 @@ test "peer type resolution: error union and optional of same type" { | ... | @@ -1832,7 +1821,6 @@ test "peer type resolution: error union and optional of same type" { |
| 1832 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1821 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1833 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1822 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1834 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1823 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1835 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1836 | 1824 | ||
| 1837 | const E = error{Foo}; | 1825 | const E = error{Foo}; |
| 1838 | var a: E!*u8 = error.Foo; | 1826 | var a: E!*u8 = error.Foo; |
| ... | @@ -1878,7 +1866,6 @@ test "peer type resolution: three-way resolution combines error set and optional | ... | @@ -1878,7 +1866,6 @@ test "peer type resolution: three-way resolution combines error set and optional |
| 1878 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1866 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1879 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1867 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1880 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1868 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1881 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1882 | 1869 | ||
| 1883 | const E = error{Foo}; | 1870 | const E = error{Foo}; |
| 1884 | var a: E = error.Foo; | 1871 | var a: E = error.Foo; |
| ... | @@ -2104,7 +2091,6 @@ test "peer type resolution: tuple pointer and optional slice" { | ... | @@ -2104,7 +2091,6 @@ test "peer type resolution: tuple pointer and optional slice" { |
| 2104 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2091 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2105 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2092 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 2106 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2093 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2107 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 2108 | // Miscompilation on Intel's OpenCL CPU runtime. | 2094 | // Miscompilation on Intel's OpenCL CPU runtime. |
| 2109 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // flaky | 2095 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // flaky |
| 2110 | 2096 | ||
| ... | @@ -2389,7 +2375,6 @@ test "cast builtins can wrap result in error union and optional" { | ... | @@ -2389,7 +2375,6 @@ test "cast builtins can wrap result in error union and optional" { |
| 2389 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2375 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2390 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 2376 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 2391 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2377 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2392 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 2393 | 2378 | ||
| 2394 | const S = struct { | 2379 | const S = struct { |
| 2395 | const MyEnum = enum(u32) { _ }; | 2380 | const MyEnum = enum(u32) { _ }; |
test/behavior/error.zig-1| ... | @@ -124,7 +124,6 @@ test "debug info for optional error set" { | ... | @@ -124,7 +124,6 @@ test "debug info for optional error set" { |
| 124 | 124 | ||
| 125 | test "implicit cast to optional to error union to return result loc" { | 125 | test "implicit cast to optional to error union to return result loc" { |
| 126 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 126 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 127 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 128 | 127 | ||
| 129 | const S = struct { | 128 | const S = struct { |
| 130 | fn entry() !void { | 129 | fn entry() !void { |
test/behavior/eval.zig-1| ... | @@ -1548,7 +1548,6 @@ test "non-optional and optional array elements concatenated" { | ... | @@ -1548,7 +1548,6 @@ test "non-optional and optional array elements concatenated" { |
| 1548 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1548 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1549 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 1549 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1550 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1550 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1551 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1552 | 1551 | ||
| 1553 | const array = [1]u8{'A'} ++ [1]?u8{null}; | 1552 | const array = [1]u8{'A'} ++ [1]?u8{null}; |
| 1554 | var index: usize = 0; | 1553 | var index: usize = 0; |
test/behavior/fn.zig-3| ... | @@ -104,7 +104,6 @@ test "inline function call that calls optional function pointer, return pointer | ... | @@ -104,7 +104,6 @@ test "inline function call that calls optional function pointer, return pointer |
| 104 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 104 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 105 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 105 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 106 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | 106 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 107 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 108 | 107 | ||
| 109 | const S = struct { | 108 | const S = struct { |
| 110 | field: u32, | 109 | field: u32, |
| ... | @@ -259,7 +258,6 @@ test "implicit cast fn call result to optional in field result" { | ... | @@ -259,7 +258,6 @@ test "implicit cast fn call result to optional in field result" { |
| 259 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | 258 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 260 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 259 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 261 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 260 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 262 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 263 | 261 | ||
| 264 | const S = struct { | 262 | const S = struct { |
| 265 | fn entry() !void { | 263 | fn entry() !void { |
| ... | @@ -473,7 +471,6 @@ test "method call with optional and error union first param" { | ... | @@ -473,7 +471,6 @@ test "method call with optional and error union first param" { |
| 473 | test "method call with optional pointer first param" { | 471 | test "method call with optional pointer first param" { |
| 474 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 472 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 475 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 473 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 476 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 477 | 474 | ||
| 478 | const S = struct { | 475 | const S = struct { |
| 479 | x: i32 = 1234, | 476 | x: i32 = 1234, |
test/behavior/generics.zig-1| ... | @@ -444,7 +444,6 @@ test "generic function passed as comptime argument" { | ... | @@ -444,7 +444,6 @@ test "generic function passed as comptime argument" { |
| 444 | 444 | ||
| 445 | test "return type of generic function is function pointer" { | 445 | test "return type of generic function is function pointer" { |
| 446 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 446 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 447 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 448 | 447 | ||
| 449 | const S = struct { | 448 | const S = struct { |
| 450 | fn b(comptime T: type) ?*const fn () error{}!T { | 449 | fn b(comptime T: type) ?*const fn () error{}!T { |
test/behavior/if.zig-1| ... | @@ -139,7 +139,6 @@ test "if-else expression with runtime condition result location is inferred opti | ... | @@ -139,7 +139,6 @@ test "if-else expression with runtime condition result location is inferred opti |
| 139 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | 139 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 140 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 140 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 141 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 141 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 142 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 143 | 142 | ||
| 144 | const A = struct { b: u64, c: u64 }; | 143 | const A = struct { b: u64, c: u64 }; |
| 145 | var d: bool = true; | 144 | var d: bool = true; |
test/behavior/null.zig-3| ... | @@ -85,7 +85,6 @@ fn testTestNullRuntime(x: ?i32) !void { | ... | @@ -85,7 +85,6 @@ fn testTestNullRuntime(x: ?i32) !void { |
| 85 | test "optional void" { | 85 | test "optional void" { |
| 86 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | 86 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 87 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 87 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 88 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 89 | 88 | ||
| 90 | try optionalVoidImpl(); | 89 | try optionalVoidImpl(); |
| 91 | try comptime optionalVoidImpl(); | 90 | try comptime optionalVoidImpl(); |
| ... | @@ -109,7 +108,6 @@ const Empty = struct {}; | ... | @@ -109,7 +108,6 @@ const Empty = struct {}; |
| 109 | test "optional struct{}" { | 108 | test "optional struct{}" { |
| 110 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | 109 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 111 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 110 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 112 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 113 | 111 | ||
| 114 | _ = try optionalEmptyStructImpl(); | 112 | _ = try optionalEmptyStructImpl(); |
| 115 | _ = try comptime optionalEmptyStructImpl(); | 113 | _ = try comptime optionalEmptyStructImpl(); |
| ... | @@ -135,7 +133,6 @@ test "null with default unwrap" { | ... | @@ -135,7 +133,6 @@ test "null with default unwrap" { |
| 135 | 133 | ||
| 136 | test "optional pointer to 0 bit type null value at runtime" { | 134 | test "optional pointer to 0 bit type null value at runtime" { |
| 137 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 135 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 138 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 139 | 136 | ||
| 140 | const EmptyStruct = struct {}; | 137 | const EmptyStruct = struct {}; |
| 141 | var x: ?*EmptyStruct = null; | 138 | var x: ?*EmptyStruct = null; |
test/behavior/optional.zig-5| ... | @@ -29,7 +29,6 @@ pub const EmptyStruct = struct {}; | ... | @@ -29,7 +29,6 @@ pub const EmptyStruct = struct {}; |
| 29 | 29 | ||
| 30 | test "optional pointer to size zero struct" { | 30 | test "optional pointer to size zero struct" { |
| 31 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 31 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 32 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 33 | 32 | ||
| 34 | var e = EmptyStruct{}; | 33 | var e = EmptyStruct{}; |
| 35 | const o: ?*EmptyStruct = &e; | 34 | const o: ?*EmptyStruct = &e; |
| ... | @@ -60,7 +59,6 @@ fn testNullPtrsEql() !void { | ... | @@ -60,7 +59,6 @@ fn testNullPtrsEql() !void { |
| 60 | test "optional with zero-bit type" { | 59 | test "optional with zero-bit type" { |
| 61 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; | 60 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; |
| 62 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | 61 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 63 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 64 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | 62 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 65 | 63 | ||
| 66 | const S = struct { | 64 | const S = struct { |
| ... | @@ -241,7 +239,6 @@ test "compare optionals with modified payloads" { | ... | @@ -241,7 +239,6 @@ test "compare optionals with modified payloads" { |
| 241 | test "unwrap function call with optional pointer return value" { | 239 | test "unwrap function call with optional pointer return value" { |
| 242 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 240 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 243 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 241 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 244 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 245 | 242 | ||
| 246 | const S = struct { | 243 | const S = struct { |
| 247 | fn entry() !void { | 244 | fn entry() !void { |
| ... | @@ -373,7 +370,6 @@ test "0-bit child type coerced to optional return ptr result location" { | ... | @@ -373,7 +370,6 @@ test "0-bit child type coerced to optional return ptr result location" { |
| 373 | test "0-bit child type coerced to optional" { | 370 | test "0-bit child type coerced to optional" { |
| 374 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 371 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 375 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | 372 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 376 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 377 | 373 | ||
| 378 | const S = struct { | 374 | const S = struct { |
| 379 | fn doTheTest() !void { | 375 | fn doTheTest() !void { |
| ... | @@ -638,7 +634,6 @@ test "result location initialization of optional with OPV payload" { | ... | @@ -638,7 +634,6 @@ test "result location initialization of optional with OPV payload" { |
| 638 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 634 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 639 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 635 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 640 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 636 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 641 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 642 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | 637 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 643 | 638 | ||
| 644 | const S = struct { | 639 | const S = struct { |
test/behavior/pointers.zig-2| ... | @@ -174,7 +174,6 @@ test "implicit cast error unions with non-optional to optional pointer" { | ... | @@ -174,7 +174,6 @@ test "implicit cast error unions with non-optional to optional pointer" { |
| 174 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 174 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 175 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 175 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 176 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | 176 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 177 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 178 | 177 | ||
| 179 | const S = struct { | 178 | const S = struct { |
| 180 | fn doTheTest() !void { | 179 | fn doTheTest() !void { |
| ... | @@ -222,7 +221,6 @@ test "assign null directly to C pointer and test null equality" { | ... | @@ -222,7 +221,6 @@ test "assign null directly to C pointer and test null equality" { |
| 222 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 221 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 223 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 222 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 224 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 223 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 225 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 226 | 224 | ||
| 227 | var x: [*c]i32 = null; | 225 | var x: [*c]i32 = null; |
| 228 | _ = &x; | 226 | _ = &x; |
test/behavior/ptrfromint.zig-1| ... | @@ -34,7 +34,6 @@ test "@ptrFromInt creates null pointer" { | ... | @@ -34,7 +34,6 @@ test "@ptrFromInt creates null pointer" { |
| 34 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | 34 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 35 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 35 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 36 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 36 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 37 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 38 | 37 | ||
| 39 | const ptr = @as(?*u32, @ptrFromInt(0)); | 38 | const ptr = @as(?*u32, @ptrFromInt(0)); |
| 40 | try expectEqual(@as(?*u32, null), ptr); | 39 | try expectEqual(@as(?*u32, null), ptr); |
test/behavior/sizeof_and_typeof.zig-1| ... | @@ -328,7 +328,6 @@ test "peer type resolution with @TypeOf doesn't trigger dependency loop check" { | ... | @@ -328,7 +328,6 @@ test "peer type resolution with @TypeOf doesn't trigger dependency loop check" { |
| 328 | if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO | 328 | if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO |
| 329 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 329 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 330 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 330 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 331 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 332 | 331 | ||
| 333 | const T = struct { | 332 | const T = struct { |
| 334 | next: @TypeOf(null, @as(*const @This(), undefined)), | 333 | next: @TypeOf(null, @as(*const @This(), undefined)), |
test/behavior/slice.zig-1| ... | @@ -246,7 +246,6 @@ fn sliceFromLenToLen(a_slice: []u8, start: usize, end: usize) []u8 { | ... | @@ -246,7 +246,6 @@ fn sliceFromLenToLen(a_slice: []u8, start: usize, end: usize) []u8 { |
| 246 | test "C pointer" { | 246 | test "C pointer" { |
| 247 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 247 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 248 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 248 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 249 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 250 | 249 | ||
| 251 | var buf: [*c]const u8 = "kjdhfkjdhfdkjhfkfjhdfkjdhfkdjhfdkjhf"; | 250 | var buf: [*c]const u8 = "kjdhfkjdhfdkjhfkfjhdfkjdhfkdjhfdkjhf"; |
| 252 | var len: u32 = 10; | 251 | var len: u32 = 10; |
test/behavior/struct.zig-3| ... | @@ -1873,8 +1873,6 @@ test "initializer takes a pointer to a variable inside its struct" { | ... | @@ -1873,8 +1873,6 @@ test "initializer takes a pointer to a variable inside its struct" { |
| 1873 | } | 1873 | } |
| 1874 | 1874 | ||
| 1875 | test "circular dependency through pointer field of a struct" { | 1875 | test "circular dependency through pointer field of a struct" { |
| 1876 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1877 | |||
| 1878 | const S = struct { | 1876 | const S = struct { |
| 1879 | const StructInner = extern struct { | 1877 | const StructInner = extern struct { |
| 1880 | outer: StructOuter = std.mem.zeroes(StructOuter), | 1878 | outer: StructOuter = std.mem.zeroes(StructOuter), |
| ... | @@ -2151,7 +2149,6 @@ test "initiate global variable with runtime value" { | ... | @@ -2151,7 +2149,6 @@ test "initiate global variable with runtime value" { |
| 2151 | test "struct containing optional pointer to array of @This()" { | 2149 | test "struct containing optional pointer to array of @This()" { |
| 2152 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | 2150 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
| 2153 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | 2151 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 2154 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 2155 | 2152 | ||
| 2156 | const S = struct { | 2153 | const S = struct { |
| 2157 | x: ?*const [1]@This(), | 2154 | x: ?*const [1]@This(), |
test/behavior/struct_contains_null_ptr_itself.zig-1| ... | @@ -5,7 +5,6 @@ const builtin = @import("builtin"); | ... | @@ -5,7 +5,6 @@ const builtin = @import("builtin"); |
| 5 | test "struct contains null pointer which contains original struct" { | 5 | test "struct contains null pointer which contains original struct" { |
| 6 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 6 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 7 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 7 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 8 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 9 | 8 | ||
| 10 | var x: ?*NodeLineComment = null; | 9 | var x: ?*NodeLineComment = null; |
| 11 | _ = &x; | 10 | _ = &x; |
test/behavior/this.zig-1| ... | @@ -50,7 +50,6 @@ test "this used as optional function parameter" { | ... | @@ -50,7 +50,6 @@ test "this used as optional function parameter" { |
| 50 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | 50 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 51 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 51 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 52 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | 52 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 53 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 54 | 53 | ||
| 55 | var global: State = undefined; | 54 | var global: State = undefined; |
| 56 | global.enter = prev; | 55 | global.enter = prev; |
test/behavior/type.zig-1| ... | @@ -260,7 +260,6 @@ test "Type.Struct" { | ... | @@ -260,7 +260,6 @@ test "Type.Struct" { |
| 260 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 260 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 261 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 261 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 262 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 262 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 263 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 264 | 263 | ||
| 265 | const A = @Type(@typeInfo(struct { x: u8, y: u32 })); | 264 | const A = @Type(@typeInfo(struct { x: u8, y: u32 })); |
| 266 | const infoA = @typeInfo(A).Struct; | 265 | const infoA = @typeInfo(A).Struct; |
test/behavior/union.zig-1| ... | @@ -2145,7 +2145,6 @@ test "pass register-sized field as non-register-sized union" { | ... | @@ -2145,7 +2145,6 @@ test "pass register-sized field as non-register-sized union" { |
| 2145 | 2145 | ||
| 2146 | test "circular dependency through pointer field of a union" { | 2146 | test "circular dependency through pointer field of a union" { |
| 2147 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | 2147 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 2148 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 2149 | 2148 | ||
| 2150 | const S = struct { | 2149 | const S = struct { |
| 2151 | const UnionInner = extern struct { | 2150 | const UnionInner = extern struct { |
test/behavior/void.zig-1| ... | @@ -37,7 +37,6 @@ test "void optional" { | ... | @@ -37,7 +37,6 @@ test "void optional" { |
| 37 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | 37 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 38 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 38 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 39 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 39 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 40 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 41 | 40 | ||
| 42 | var x: ?void = {}; | 41 | var x: ?void = {}; |
| 43 | _ = &x; | 42 | _ = &x; |