authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-05-25 22:52:26-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-06-13 02:22:33-07:00
loga270c6f8c82bc81eecf37cc06a326e46ed44fb8b
tree6ee1ab61e42d94d92eaeb62ee7b371d64de2e9a7
parentd69c48370a0381c7dce463c68b2097dd8fa67eb7
signaturelock-open Commit is signed but in an unrecognized format.

riscv: implement optional logic


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}
15471547
1548/// Truncates the value in the register in place.
1549/// Clobbers any remaining bits.
1550fn 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
1548fn symbolIndex(func: *Func) !u32 {1600fn 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}
28692921
2870fn airOptionalPayload(func: *Func, inst: Air.Inst.Index) !void {2922fn 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}
28752944
...@@ -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}
30233092
3024fn airWrapOptional(func: *Func, inst: Air.Inst.Index) !void {3093fn 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 };
30293099
3030 // Optional with a zero-bit payload type is just a boolean true3100 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;
30333104
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}
44374530
4531fn 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
4438fn airIsNull(func: *Func, inst: Air.Inst.Index) !void {4615fn 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}
44464622
4447fn airIsNullPtr(func: *Func, inst: Air.Inst.Index) !void {4623fn 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}
44644629
4465fn 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 default4632 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}
44714634
4472fn airIsNonNull(func: *Func, inst: Air.Inst.Index) !void {4635fn 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}
44804641
4481fn 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 default4644 .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}
44874655
4488fn airIsNonNullPtr(func: *Func, inst: Air.Inst.Index) !void {4656fn 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}
45054667
4506fn airIsErr(func: *Func, inst: Air.Inst.Index) !void {4668fn 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 };
51155277
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 }
232232
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;
235235
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}
604604
605test "@alignCast null" {605test "@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; // TODO607 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
609608
test/behavior/basic.zig-2
...@@ -483,7 +483,6 @@ fn testStructInFn() !void {...@@ -483,7 +483,6 @@ fn testStructInFn() !void {
483483
484test "fn call returning scalar optional in equality expression" {484test "fn call returning scalar optional in equality expression" {
485 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO485 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}
489488
...@@ -494,7 +493,6 @@ fn getNull() ?*i32 {...@@ -494,7 +493,6 @@ fn getNull() ?*i32 {
494test "global variable assignment with optional unwrapping with var initialized to undefined" {493test "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; // TODO495 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
497 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
498496
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 {
186test "implicitly cast indirect pointer to maybe-indirect pointer" {186test "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; // TODO188 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
189 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
190189
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; // TODO248 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
250 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
251249
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; // TODO1183 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1186 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1184 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1187 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
11881185
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" {
1198test "return null from fn () anyerror!?&T" {1195test "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; // TODO1197 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1201 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
12021198
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; // TODO1286 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1291 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1287 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1292 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
12931288
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; // TODO1357 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1363 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1358 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1364 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
13651359
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; // TODO1432 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1439 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1433 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1440 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
14411434
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; // TODO1471 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1479 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1472 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1480 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1473 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1481 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
14821474
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" {
15911583
1592test "optional pointer coerced to optional allowzero pointer" {1584test "optional pointer coerced to optional allowzero pointer" {
1593 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1585 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1594 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
15951586
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}
16091600
1610test "optional slice passed as parameter coerced to allowzero many pointer" {1601test "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; // TODO1821 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1833 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1822 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1834 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1823 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1835 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
18361824
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; // TODO1866 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1879 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1867 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1880 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1868 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1881 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
18821869
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; // TODO2091 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2105 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2092 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2106 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2093 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; // flaky2095 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // flaky
21102096
...@@ -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; // TODO2375 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2390 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2376 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2391 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2377 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2392 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
23932378
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" {
124124
125test "implicit cast to optional to error union to return result loc" {125test "implicit cast to optional to error union to return result loc" {
126 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO126 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
127 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
128127
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; // TODO1548 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1549 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1549 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1550 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1550 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1551 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
15521551
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; // TODO105 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;
108107
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; // TODO260 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
262 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
263261
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" {
473test "method call with optional pointer first param" {471test "method call with optional pointer first param" {
474 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO472 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
475 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO473 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
476 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
477474
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" {
444444
445test "return type of generic function is function pointer" {445test "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;
448447
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; // TODO141 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
142 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
143142
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 {
85test "optional void" {85test "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; // TODO87 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
8988
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 {};
109test "optional struct{}" {108test "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; // TODO110 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
112 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
113111
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" {
135133
136test "optional pointer to 0 bit type null value at runtime" {134test "optional pointer to 0 bit type null value at runtime" {
137 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO135 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
138 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
139136
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 {};
2929
30test "optional pointer to size zero struct" {30test "optional pointer to size zero struct" {
31 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO31 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
32 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
3332
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 {
60test "optional with zero-bit type" {59test "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;
6563
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" {
241test "unwrap function call with optional pointer return value" {239test "unwrap function call with optional pointer return value" {
242 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO240 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
243 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO241 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
244 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
245242
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" {
373test "0-bit child type coerced to optional" {370test "0-bit child type coerced to optional" {
374 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO371 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;
377373
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; // TODO634 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
639 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO635 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
640 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO636 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;
643638
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; // TODO174 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
175 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO175 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;
178177
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; // TODO221 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
223 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO222 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
224 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO223 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
225 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
226224
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; // TODO36 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
37 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
3837
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; // TODO328 if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
329 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO329 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
330 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO330 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
331 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
332331
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 {
246test "C pointer" {246test "C pointer" {
247 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO247 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
248 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO248 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
249 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
250249
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}
18741874
1875test "circular dependency through pointer field of a struct" {1875test "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" {
2151test "struct containing optional pointer to array of @This()" {2149test "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;
21552152
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");
5test "struct contains null pointer which contains original struct" {5test "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; // TODO7 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
8 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
98
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; // TODO51 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;
5453
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; // TODO260 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
261 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO261 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
262 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO262 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
263 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
264263
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" {
21452145
2146test "circular dependency through pointer field of a union" {2146test "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;
21492148
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; // TODO39 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
40 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
4140
42 var x: ?void = {};41 var x: ?void = {};
43 _ = &x;42 _ = &x;