mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
Merge pull request #20070 from Rexicon226/riscv
more RISC-V backend progress
This commit is contained in:
commit
a154d8da8e
74 changed files with 4768 additions and 3112 deletions
|
|
@ -12,10 +12,8 @@ var cmdline_buffer: [4096]u8 = undefined;
|
|||
var fba = std.heap.FixedBufferAllocator.init(&cmdline_buffer);
|
||||
|
||||
pub fn main() void {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return mainExtraSimple() catch @panic("test failure");
|
||||
|
||||
if (builtin.zig_backend == .stage2_aarch64) {
|
||||
return mainSimple() catch @panic("test failure");
|
||||
if (builtin.zig_backend == .stage2_riscv64) {
|
||||
return mainSimple() catch @panic("test failure\n");
|
||||
}
|
||||
|
||||
const args = std.process.argsAlloc(fba.allocator()) catch
|
||||
|
|
@ -221,20 +219,30 @@ pub fn log(
|
|||
/// Simpler main(), exercising fewer language features, so that
|
||||
/// work-in-progress backends can handle it.
|
||||
pub fn mainSimple() anyerror!void {
|
||||
const enable_print = false;
|
||||
const print_all = false;
|
||||
// is the backend capable of printing to stderr?
|
||||
const enable_print = switch (builtin.zig_backend) {
|
||||
.stage2_riscv64 => true,
|
||||
else => false,
|
||||
};
|
||||
// is the backend capable of using std.fmt.format to print a summary at the end?
|
||||
const print_summary = switch (builtin.zig_backend) {
|
||||
else => false,
|
||||
};
|
||||
|
||||
var passed: u64 = 0;
|
||||
var skipped: u64 = 0;
|
||||
var failed: u64 = 0;
|
||||
const stderr = if (enable_print) std.io.getStdErr() else {};
|
||||
|
||||
// we don't want to bring in File and Writer if the backend doesn't support it
|
||||
const stderr = if (comptime enable_print) std.io.getStdErr() else {};
|
||||
|
||||
for (builtin.test_functions) |test_fn| {
|
||||
if (enable_print and print_all) {
|
||||
if (enable_print) {
|
||||
stderr.writeAll(test_fn.name) catch {};
|
||||
stderr.writeAll("... ") catch {};
|
||||
}
|
||||
test_fn.func() catch |err| {
|
||||
if (enable_print and !print_all) {
|
||||
if (enable_print) {
|
||||
stderr.writeAll(test_fn.name) catch {};
|
||||
stderr.writeAll("... ") catch {};
|
||||
}
|
||||
|
|
@ -248,27 +256,11 @@ pub fn mainSimple() anyerror!void {
|
|||
skipped += 1;
|
||||
continue;
|
||||
};
|
||||
if (enable_print and print_all) stderr.writeAll("PASS\n") catch {};
|
||||
if (enable_print) stderr.writeAll("PASS\n") catch {};
|
||||
passed += 1;
|
||||
}
|
||||
if (enable_print) {
|
||||
if (enable_print and print_summary) {
|
||||
stderr.writer().print("{} passed, {} skipped, {} failed\n", .{ passed, skipped, failed }) catch {};
|
||||
if (failed != 0) std.process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn mainExtraSimple() !void {
|
||||
var fail_count: u8 = 0;
|
||||
|
||||
for (builtin.test_functions) |test_fn| {
|
||||
test_fn.func() catch |err| {
|
||||
if (err != error.SkipZigTest) {
|
||||
fail_count += 1;
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
};
|
||||
}
|
||||
|
||||
if (fail_count != 0) std.process.exit(1);
|
||||
if (failed != 0) std.process.exit(1);
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -42,6 +42,12 @@ pub fn emitMir(emit: *Emit) Error!void {
|
|||
.enc = std.meta.activeTag(lowered_inst.encoding.data),
|
||||
}),
|
||||
.load_symbol_reloc => |symbol| {
|
||||
const is_obj_or_static_lib = switch (emit.lower.output_mode) {
|
||||
.Exe => false,
|
||||
.Obj => true,
|
||||
.Lib => emit.lower.link_mode == .static,
|
||||
};
|
||||
|
||||
if (emit.lower.bin_file.cast(link.File.Elf)) |elf_file| {
|
||||
const atom_ptr = elf_file.symbol(symbol.atom_index).atom(elf_file).?;
|
||||
const sym_index = elf_file.zigObjectPtr().?.symbol(symbol.sym_index);
|
||||
|
|
@ -50,7 +56,7 @@ pub fn emitMir(emit: *Emit) Error!void {
|
|||
var hi_r_type: u32 = @intFromEnum(std.elf.R_RISCV.HI20);
|
||||
var lo_r_type: u32 = @intFromEnum(std.elf.R_RISCV.LO12_I);
|
||||
|
||||
if (sym.flags.needs_zig_got) {
|
||||
if (sym.flags.needs_zig_got and !is_obj_or_static_lib) {
|
||||
_ = try sym.getOrCreateZigGotEntry(sym_index, elf_file);
|
||||
|
||||
hi_r_type = Elf.R_ZIG_GOT_HI20;
|
||||
|
|
@ -70,6 +76,19 @@ pub fn emitMir(emit: *Emit) Error!void {
|
|||
});
|
||||
} else return emit.fail("TODO: load_symbol_reloc non-ELF", .{});
|
||||
},
|
||||
.call_extern_fn_reloc => |symbol| {
|
||||
if (emit.lower.bin_file.cast(link.File.Elf)) |elf_file| {
|
||||
const atom_ptr = elf_file.symbol(symbol.atom_index).atom(elf_file).?;
|
||||
|
||||
const r_type: u32 = @intFromEnum(std.elf.R_RISCV.CALL_PLT);
|
||||
|
||||
try atom_ptr.addReloc(elf_file, .{
|
||||
.r_offset = start_offset,
|
||||
.r_info = (@as(u64, @intCast(symbol.sym_index)) << 32) | r_type,
|
||||
.r_addend = 0,
|
||||
});
|
||||
} else return emit.fail("TODO: call_extern_fn_reloc non-ELF", .{});
|
||||
},
|
||||
};
|
||||
}
|
||||
std.debug.assert(lowered_relocs.len == 0);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,71 @@
|
|||
mnemonic: Mnemonic,
|
||||
data: Data,
|
||||
|
||||
const OpCode = enum(u7) {
|
||||
OP = 0b0110011,
|
||||
OP_IMM = 0b0010011,
|
||||
OP_IMM_32 = 0b0011011,
|
||||
OP_32 = 0b0111011,
|
||||
|
||||
BRANCH = 0b1100011,
|
||||
LOAD = 0b0000011,
|
||||
STORE = 0b0100011,
|
||||
SYSTEM = 0b1110011,
|
||||
|
||||
OP_FP = 0b1010011,
|
||||
LOAD_FP = 0b0000111,
|
||||
STORE_FP = 0b0100111,
|
||||
|
||||
JALR = 0b1100111,
|
||||
AUIPC = 0b0010111,
|
||||
LUI = 0b0110111,
|
||||
JAL = 0b1101111,
|
||||
NONE = 0b0000000,
|
||||
};
|
||||
|
||||
const Fmt = enum(u2) {
|
||||
/// 32-bit single-precision
|
||||
S = 0b00,
|
||||
/// 64-bit double-precision
|
||||
D = 0b01,
|
||||
_reserved = 0b10,
|
||||
/// 128-bit quad-precision
|
||||
Q = 0b11,
|
||||
};
|
||||
|
||||
const Enc = struct {
|
||||
opcode: OpCode,
|
||||
|
||||
data: union(enum) {
|
||||
/// funct3 + funct7
|
||||
ff: struct {
|
||||
funct3: u3,
|
||||
funct7: u7,
|
||||
},
|
||||
/// funct5 + rm + fmt
|
||||
fmt: struct {
|
||||
funct5: u5,
|
||||
rm: u3,
|
||||
fmt: Fmt,
|
||||
},
|
||||
/// funct3
|
||||
f: struct {
|
||||
funct3: u3,
|
||||
},
|
||||
/// typ + funct3 + has_5
|
||||
sh: struct {
|
||||
typ: u6,
|
||||
funct3: u3,
|
||||
has_5: bool,
|
||||
},
|
||||
/// U-type
|
||||
none,
|
||||
},
|
||||
};
|
||||
|
||||
pub const Mnemonic = enum {
|
||||
// base mnemonics
|
||||
|
||||
// I Type
|
||||
ld,
|
||||
lw,
|
||||
|
|
@ -10,18 +74,25 @@ pub const Mnemonic = enum {
|
|||
lhu,
|
||||
lb,
|
||||
lbu,
|
||||
|
||||
sltiu,
|
||||
xori,
|
||||
andi,
|
||||
|
||||
slli,
|
||||
srli,
|
||||
srai,
|
||||
|
||||
slliw,
|
||||
srliw,
|
||||
sraiw,
|
||||
|
||||
addi,
|
||||
jalr,
|
||||
|
||||
// U Type
|
||||
lui,
|
||||
auipc,
|
||||
|
||||
// S Type
|
||||
sd,
|
||||
|
|
@ -37,64 +108,265 @@ pub const Mnemonic = enum {
|
|||
|
||||
// R Type
|
||||
add,
|
||||
@"and",
|
||||
addw,
|
||||
sub,
|
||||
subw,
|
||||
@"and",
|
||||
@"or",
|
||||
slt,
|
||||
mul,
|
||||
sltu,
|
||||
xor,
|
||||
|
||||
sll,
|
||||
srl,
|
||||
sra,
|
||||
|
||||
sllw,
|
||||
srlw,
|
||||
sraw,
|
||||
|
||||
// System
|
||||
ecall,
|
||||
ebreak,
|
||||
unimp,
|
||||
|
||||
// M extension
|
||||
mul,
|
||||
mulw,
|
||||
|
||||
mulh,
|
||||
mulhu,
|
||||
mulhsu,
|
||||
|
||||
div,
|
||||
divu,
|
||||
|
||||
divw,
|
||||
divuw,
|
||||
|
||||
rem,
|
||||
remu,
|
||||
|
||||
remw,
|
||||
remuw,
|
||||
|
||||
// F extension (32-bit float)
|
||||
fadds,
|
||||
fsubs,
|
||||
fmuls,
|
||||
fdivs,
|
||||
|
||||
fmins,
|
||||
fmaxs,
|
||||
|
||||
fsqrts,
|
||||
|
||||
flw,
|
||||
fsw,
|
||||
|
||||
feqs,
|
||||
flts,
|
||||
fles,
|
||||
|
||||
fsgnjns,
|
||||
fsgnjxs,
|
||||
|
||||
// D extension (64-bit float)
|
||||
faddd,
|
||||
fsubd,
|
||||
fmuld,
|
||||
fdivd,
|
||||
|
||||
fmind,
|
||||
fmaxd,
|
||||
|
||||
fsqrtd,
|
||||
|
||||
fld,
|
||||
fsd,
|
||||
|
||||
feqd,
|
||||
fltd,
|
||||
fled,
|
||||
|
||||
fsgnjnd,
|
||||
fsgnjxd,
|
||||
|
||||
pub fn encoding(mnem: Mnemonic) Enc {
|
||||
return switch (mnem) {
|
||||
// zig fmt: off
|
||||
.add => .{ .opcode = 0b0110011, .funct3 = 0b000, .funct7 = 0b0000000 },
|
||||
.sltu => .{ .opcode = 0b0110011, .funct3 = 0b011, .funct7 = 0b0000000 },
|
||||
.@"and" => .{ .opcode = 0b0110011, .funct3 = 0b111, .funct7 = 0b0000000 },
|
||||
.sub => .{ .opcode = 0b0110011, .funct3 = 0b000, .funct7 = 0b0100000 },
|
||||
|
||||
.ld => .{ .opcode = 0b0000011, .funct3 = 0b011, .funct7 = null },
|
||||
.lw => .{ .opcode = 0b0000011, .funct3 = 0b010, .funct7 = null },
|
||||
.lwu => .{ .opcode = 0b0000011, .funct3 = 0b110, .funct7 = null },
|
||||
.lh => .{ .opcode = 0b0000011, .funct3 = 0b001, .funct7 = null },
|
||||
.lhu => .{ .opcode = 0b0000011, .funct3 = 0b101, .funct7 = null },
|
||||
.lb => .{ .opcode = 0b0000011, .funct3 = 0b000, .funct7 = null },
|
||||
.lbu => .{ .opcode = 0b0000011, .funct3 = 0b100, .funct7 = null },
|
||||
// OP
|
||||
|
||||
.sltiu => .{ .opcode = 0b0010011, .funct3 = 0b011, .funct7 = null },
|
||||
.add => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0000000 } } },
|
||||
.sub => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0100000 } } },
|
||||
|
||||
.addi => .{ .opcode = 0b0010011, .funct3 = 0b000, .funct7 = null },
|
||||
.andi => .{ .opcode = 0b0010011, .funct3 = 0b111, .funct7 = null },
|
||||
.xori => .{ .opcode = 0b0010011, .funct3 = 0b100, .funct7 = null },
|
||||
.jalr => .{ .opcode = 0b1100111, .funct3 = 0b000, .funct7 = null },
|
||||
.slli => .{ .opcode = 0b0010011, .funct3 = 0b001, .funct7 = null },
|
||||
.srli => .{ .opcode = 0b0010011, .funct3 = 0b101, .funct7 = null },
|
||||
.srai => .{ .opcode = 0b0010011, .funct3 = 0b101, .funct7 = null, .offset = 1 << 10 },
|
||||
.@"and" => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b111, .funct7 = 0b0000000 } } },
|
||||
.@"or" => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b110, .funct7 = 0b0000000 } } },
|
||||
.xor => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b100, .funct7 = 0b0000000 } } },
|
||||
|
||||
.lui => .{ .opcode = 0b0110111, .funct3 = null, .funct7 = null },
|
||||
.sltu => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b011, .funct7 = 0b0000000 } } },
|
||||
.slt => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b010, .funct7 = 0b0000000 } } },
|
||||
|
||||
.sd => .{ .opcode = 0b0100011, .funct3 = 0b011, .funct7 = null },
|
||||
.sw => .{ .opcode = 0b0100011, .funct3 = 0b010, .funct7 = null },
|
||||
.sh => .{ .opcode = 0b0100011, .funct3 = 0b001, .funct7 = null },
|
||||
.sb => .{ .opcode = 0b0100011, .funct3 = 0b000, .funct7 = null },
|
||||
.mul => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0000001 } } },
|
||||
.mulh => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b001, .funct7 = 0b0000001 } } },
|
||||
.mulhsu => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b010, .funct7 = 0b0000001 } } },
|
||||
.mulhu => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b011, .funct7 = 0b0000001 } } },
|
||||
|
||||
.div => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b100, .funct7 = 0b0000001 } } },
|
||||
.divu => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b101, .funct7 = 0b0000001 } } },
|
||||
|
||||
.jal => .{ .opcode = 0b1101111, .funct3 = null, .funct7 = null },
|
||||
.rem => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b110, .funct7 = 0b0000001 } } },
|
||||
.remu => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b111, .funct7 = 0b0000001 } } },
|
||||
|
||||
.beq => .{ .opcode = 0b1100011, .funct3 = 0b000, .funct7 = null },
|
||||
.sll => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b001, .funct7 = 0b0000000 } } },
|
||||
.srl => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b101, .funct7 = 0b0000000 } } },
|
||||
.sra => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b101, .funct7 = 0b0100000 } } },
|
||||
|
||||
.slt => .{ .opcode = 0b0110011, .funct3 = 0b010, .funct7 = 0b0000000 },
|
||||
|
||||
.xor => .{ .opcode = 0b0110011, .funct3 = 0b100, .funct7 = 0b0000000 },
|
||||
// OP_IMM
|
||||
|
||||
.addi => .{ .opcode = .OP_IMM, .data = .{ .f = .{ .funct3 = 0b000 } } },
|
||||
.andi => .{ .opcode = .OP_IMM, .data = .{ .f = .{ .funct3 = 0b111 } } },
|
||||
.xori => .{ .opcode = .OP_IMM, .data = .{ .f = .{ .funct3 = 0b100 } } },
|
||||
|
||||
.sltiu => .{ .opcode = .OP_IMM, .data = .{ .f = .{ .funct3 = 0b011 } } },
|
||||
|
||||
.slli => .{ .opcode = .OP_IMM, .data = .{ .sh = .{ .typ = 0b000000, .funct3 = 0b001, .has_5 = true } } },
|
||||
.srli => .{ .opcode = .OP_IMM, .data = .{ .sh = .{ .typ = 0b000000, .funct3 = 0b101, .has_5 = true } } },
|
||||
.srai => .{ .opcode = .OP_IMM, .data = .{ .sh = .{ .typ = 0b010000, .funct3 = 0b101, .has_5 = true } } },
|
||||
|
||||
|
||||
// OP_IMM_32
|
||||
|
||||
.slliw => .{ .opcode = .OP_IMM_32, .data = .{ .sh = .{ .typ = 0b000000, .funct3 = 0b001, .has_5 = false } } },
|
||||
.srliw => .{ .opcode = .OP_IMM_32, .data = .{ .sh = .{ .typ = 0b000000, .funct3 = 0b101, .has_5 = false } } },
|
||||
.sraiw => .{ .opcode = .OP_IMM_32, .data = .{ .sh = .{ .typ = 0b010000, .funct3 = 0b101, .has_5 = false } } },
|
||||
|
||||
|
||||
// OP_32
|
||||
|
||||
.addw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0000000 } } },
|
||||
.subw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0100000 } } },
|
||||
.mulw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0000001 } } },
|
||||
|
||||
.divw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b100, .funct7 = 0b0000001 } } },
|
||||
.divuw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b101, .funct7 = 0b0000001 } } },
|
||||
|
||||
.remw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b110, .funct7 = 0b0000001 } } },
|
||||
.remuw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b111, .funct7 = 0b0000001 } } },
|
||||
|
||||
.sllw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b001, .funct7 = 0b0000000 } } },
|
||||
.srlw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b101, .funct7 = 0b0000000 } } },
|
||||
.sraw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b101, .funct7 = 0b0100000 } } },
|
||||
|
||||
|
||||
// OP_FP
|
||||
|
||||
.fadds => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00000, .fmt = .S, .rm = 0b111 } } },
|
||||
.faddd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00000, .fmt = .D, .rm = 0b111 } } },
|
||||
|
||||
.fsubs => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00001, .fmt = .S, .rm = 0b111 } } },
|
||||
.fsubd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00001, .fmt = .D, .rm = 0b111 } } },
|
||||
|
||||
.fmuls => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00010, .fmt = .S, .rm = 0b111 } } },
|
||||
.fmuld => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00010, .fmt = .D, .rm = 0b111 } } },
|
||||
|
||||
.fdivs => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00011, .fmt = .S, .rm = 0b111 } } },
|
||||
.fdivd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00011, .fmt = .D, .rm = 0b111 } } },
|
||||
|
||||
.fmins => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00101, .fmt = .S, .rm = 0b000 } } },
|
||||
.fmind => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00101, .fmt = .D, .rm = 0b000 } } },
|
||||
|
||||
.fmaxs => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00101, .fmt = .S, .rm = 0b001 } } },
|
||||
.fmaxd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00101, .fmt = .D, .rm = 0b001 } } },
|
||||
|
||||
.fsqrts => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b01011, .fmt = .S, .rm = 0b111 } } },
|
||||
.fsqrtd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b01011, .fmt = .D, .rm = 0b111 } } },
|
||||
|
||||
.fles => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .S, .rm = 0b000 } } },
|
||||
.fled => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .D, .rm = 0b000 } } },
|
||||
|
||||
.flts => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .S, .rm = 0b001 } } },
|
||||
.fltd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .D, .rm = 0b001 } } },
|
||||
|
||||
.feqs => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .S, .rm = 0b010 } } },
|
||||
.feqd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .D, .rm = 0b010 } } },
|
||||
|
||||
.fsgnjns => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00100, .fmt = .S, .rm = 0b000 } } },
|
||||
.fsgnjnd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00100, .fmt = .D, .rm = 0b000 } } },
|
||||
|
||||
.fsgnjxs => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00100, .fmt = .S, .rm = 0b0010} } },
|
||||
.fsgnjxd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00100, .fmt = .D, .rm = 0b0010} } },
|
||||
|
||||
|
||||
// LOAD
|
||||
|
||||
.lb => .{ .opcode = .LOAD, .data = .{ .f = .{ .funct3 = 0b000 } } },
|
||||
.lh => .{ .opcode = .LOAD, .data = .{ .f = .{ .funct3 = 0b001 } } },
|
||||
.lw => .{ .opcode = .LOAD, .data = .{ .f = .{ .funct3 = 0b010 } } },
|
||||
.ld => .{ .opcode = .LOAD, .data = .{ .f = .{ .funct3 = 0b011 } } },
|
||||
.lbu => .{ .opcode = .LOAD, .data = .{ .f = .{ .funct3 = 0b100 } } },
|
||||
.lhu => .{ .opcode = .LOAD, .data = .{ .f = .{ .funct3 = 0b101 } } },
|
||||
.lwu => .{ .opcode = .LOAD, .data = .{ .f = .{ .funct3 = 0b110 } } },
|
||||
|
||||
|
||||
// STORE
|
||||
|
||||
.sb => .{ .opcode = .STORE, .data = .{ .f = .{ .funct3 = 0b000 } } },
|
||||
.sh => .{ .opcode = .STORE, .data = .{ .f = .{ .funct3 = 0b001 } } },
|
||||
.sw => .{ .opcode = .STORE, .data = .{ .f = .{ .funct3 = 0b010 } } },
|
||||
.sd => .{ .opcode = .STORE, .data = .{ .f = .{ .funct3 = 0b011 } } },
|
||||
|
||||
|
||||
// LOAD_FP
|
||||
|
||||
.flw => .{ .opcode = .LOAD_FP, .data = .{ .f = .{ .funct3 = 0b010 } } },
|
||||
.fld => .{ .opcode = .LOAD_FP, .data = .{ .f = .{ .funct3 = 0b011 } } },
|
||||
|
||||
|
||||
// STORE_FP
|
||||
|
||||
.fsw => .{ .opcode = .STORE_FP, .data = .{ .f = .{ .funct3 = 0b010 } } },
|
||||
.fsd => .{ .opcode = .STORE_FP, .data = .{ .f = .{ .funct3 = 0b011 } } },
|
||||
|
||||
|
||||
// JALR
|
||||
|
||||
.jalr => .{ .opcode = .JALR, .data = .{ .f = .{ .funct3 = 0b000 } } },
|
||||
|
||||
|
||||
// LUI
|
||||
|
||||
.lui => .{ .opcode = .LUI, .data = .{ .none = {} } },
|
||||
|
||||
|
||||
// AUIPC
|
||||
|
||||
.auipc => .{ .opcode = .AUIPC, .data = .{ .none = {} } },
|
||||
|
||||
|
||||
// JAL
|
||||
|
||||
.jal => .{ .opcode = .JAL, .data = .{ .none = {} } },
|
||||
|
||||
|
||||
// BRANCH
|
||||
|
||||
.beq => .{ .opcode = .BRANCH, .data = .{ .f = .{ .funct3 = 0b000 } } },
|
||||
|
||||
|
||||
// SYSTEM
|
||||
|
||||
.ecall => .{ .opcode = .SYSTEM, .data = .{ .f = .{ .funct3 = 0b000 } } },
|
||||
.ebreak => .{ .opcode = .SYSTEM, .data = .{ .f = .{ .funct3 = 0b000 } } },
|
||||
|
||||
|
||||
// NONE
|
||||
|
||||
.unimp => .{ .opcode = .NONE, .data = .{ .f = .{ .funct3 = 0b000 } } },
|
||||
|
||||
.mul => .{ .opcode = 0b0110011, .funct3 = 0b000, .funct7 = 0b0000001 },
|
||||
|
||||
.ecall => .{ .opcode = 0b1110011, .funct3 = 0b000, .funct7 = null },
|
||||
.ebreak => .{ .opcode = 0b1110011, .funct3 = 0b000, .funct7 = null },
|
||||
.unimp => .{ .opcode = 0b0000000, .funct3 = 0b000, .funct7 = null },
|
||||
// zig fmt: on
|
||||
};
|
||||
}
|
||||
|
|
@ -102,6 +374,7 @@ pub const Mnemonic = enum {
|
|||
|
||||
pub const InstEnc = enum {
|
||||
R,
|
||||
R4,
|
||||
I,
|
||||
S,
|
||||
B,
|
||||
|
|
@ -114,6 +387,19 @@ pub const InstEnc = enum {
|
|||
pub fn fromMnemonic(mnem: Mnemonic) InstEnc {
|
||||
return switch (mnem) {
|
||||
.addi,
|
||||
.jalr,
|
||||
.sltiu,
|
||||
.xori,
|
||||
.andi,
|
||||
|
||||
.slli,
|
||||
.srli,
|
||||
.srai,
|
||||
|
||||
.slliw,
|
||||
.srliw,
|
||||
.sraiw,
|
||||
|
||||
.ld,
|
||||
.lw,
|
||||
.lwu,
|
||||
|
|
@ -121,22 +407,22 @@ pub const InstEnc = enum {
|
|||
.lhu,
|
||||
.lb,
|
||||
.lbu,
|
||||
.jalr,
|
||||
.sltiu,
|
||||
.xori,
|
||||
.andi,
|
||||
.slli,
|
||||
.srli,
|
||||
.srai,
|
||||
|
||||
.flw,
|
||||
.fld,
|
||||
=> .I,
|
||||
|
||||
.lui,
|
||||
.auipc,
|
||||
=> .U,
|
||||
|
||||
.sd,
|
||||
.sw,
|
||||
.sh,
|
||||
.sb,
|
||||
|
||||
.fsd,
|
||||
.fsw,
|
||||
=> .S,
|
||||
|
||||
.jal,
|
||||
|
|
@ -147,11 +433,76 @@ pub const InstEnc = enum {
|
|||
|
||||
.slt,
|
||||
.sltu,
|
||||
.mul,
|
||||
|
||||
.sll,
|
||||
.srl,
|
||||
.sra,
|
||||
|
||||
.sllw,
|
||||
.srlw,
|
||||
.sraw,
|
||||
|
||||
.div,
|
||||
.divu,
|
||||
.divw,
|
||||
.divuw,
|
||||
|
||||
.rem,
|
||||
.remu,
|
||||
.remw,
|
||||
.remuw,
|
||||
|
||||
.xor,
|
||||
.add,
|
||||
.sub,
|
||||
.@"and",
|
||||
.@"or",
|
||||
|
||||
.add,
|
||||
.addw,
|
||||
|
||||
.sub,
|
||||
.subw,
|
||||
|
||||
.mul,
|
||||
.mulw,
|
||||
.mulh,
|
||||
.mulhu,
|
||||
.mulhsu,
|
||||
|
||||
.fadds,
|
||||
.faddd,
|
||||
|
||||
.fsubs,
|
||||
.fsubd,
|
||||
|
||||
.fmuls,
|
||||
.fmuld,
|
||||
|
||||
.fdivs,
|
||||
.fdivd,
|
||||
|
||||
.fmins,
|
||||
.fmind,
|
||||
|
||||
.fmaxs,
|
||||
.fmaxd,
|
||||
|
||||
.fsqrts,
|
||||
.fsqrtd,
|
||||
|
||||
.fles,
|
||||
.fled,
|
||||
|
||||
.flts,
|
||||
.fltd,
|
||||
|
||||
.feqs,
|
||||
.feqd,
|
||||
|
||||
.fsgnjns,
|
||||
.fsgnjnd,
|
||||
|
||||
.fsgnjxs,
|
||||
.fsgnjxd,
|
||||
=> .R,
|
||||
|
||||
.ecall,
|
||||
|
|
@ -161,16 +512,17 @@ pub const InstEnc = enum {
|
|||
};
|
||||
}
|
||||
|
||||
pub fn opsList(enc: InstEnc) [3]std.meta.FieldEnum(Operand) {
|
||||
pub fn opsList(enc: InstEnc) [4]std.meta.FieldEnum(Operand) {
|
||||
return switch (enc) {
|
||||
// zig fmt: off
|
||||
.R => .{ .reg, .reg, .reg, },
|
||||
.I => .{ .reg, .reg, .imm, },
|
||||
.S => .{ .reg, .reg, .imm, },
|
||||
.B => .{ .reg, .reg, .imm, },
|
||||
.U => .{ .reg, .imm, .none, },
|
||||
.J => .{ .reg, .imm, .none, },
|
||||
.system => .{ .none, .none, .none, },
|
||||
.R => .{ .reg, .reg, .reg, .none },
|
||||
.R4 => .{ .reg, .reg, .reg, .reg },
|
||||
.I => .{ .reg, .reg, .imm, .none },
|
||||
.S => .{ .reg, .reg, .imm, .none },
|
||||
.B => .{ .reg, .reg, .imm, .none },
|
||||
.U => .{ .reg, .imm, .none, .none },
|
||||
.J => .{ .reg, .imm, .none, .none },
|
||||
.system => .{ .none, .none, .none, .none },
|
||||
// zig fmt: on
|
||||
};
|
||||
}
|
||||
|
|
@ -185,6 +537,15 @@ pub const Data = union(InstEnc) {
|
|||
rs2: u5,
|
||||
funct7: u7,
|
||||
},
|
||||
R4: packed struct {
|
||||
opcode: u7,
|
||||
rd: u5,
|
||||
funct3: u3,
|
||||
rs1: u5,
|
||||
rs2: u5,
|
||||
funct2: u2,
|
||||
rs3: u5,
|
||||
},
|
||||
I: packed struct {
|
||||
opcode: u7,
|
||||
rd: u5,
|
||||
|
|
@ -227,19 +588,21 @@ pub const Data = union(InstEnc) {
|
|||
|
||||
pub fn toU32(self: Data) u32 {
|
||||
return switch (self) {
|
||||
.R => |v| @as(u32, @bitCast(v)),
|
||||
.I => |v| @as(u32, @bitCast(v)),
|
||||
.S => |v| @as(u32, @bitCast(v)),
|
||||
.B => |v| @as(u32, @intCast(v.opcode)) + (@as(u32, @intCast(v.imm11)) << 7) + (@as(u32, @intCast(v.imm1_4)) << 8) + (@as(u32, @intCast(v.funct3)) << 12) + (@as(u32, @intCast(v.rs1)) << 15) + (@as(u32, @intCast(v.rs2)) << 20) + (@as(u32, @intCast(v.imm5_10)) << 25) + (@as(u32, @intCast(v.imm12)) << 31),
|
||||
.U => |v| @as(u32, @bitCast(v)),
|
||||
.J => |v| @as(u32, @bitCast(v)),
|
||||
// zig fmt: off
|
||||
.R => |v| @bitCast(v),
|
||||
.R4 => |v| @bitCast(v),
|
||||
.I => |v| @bitCast(v),
|
||||
.S => |v| @bitCast(v),
|
||||
.B => |v| @as(u32, @intCast(v.opcode)) + (@as(u32, @intCast(v.imm11)) << 7) + (@as(u32, @intCast(v.imm1_4)) << 8) + (@as(u32, @intCast(v.funct3)) << 12) + (@as(u32, @intCast(v.rs1)) << 15) + (@as(u32, @intCast(v.rs2)) << 20) + (@as(u32, @intCast(v.imm5_10)) << 25) + (@as(u32, @intCast(v.imm12)) << 31),
|
||||
.U => |v| @bitCast(v),
|
||||
.J => |v| @bitCast(v),
|
||||
.system => unreachable,
|
||||
// zig fmt: on
|
||||
};
|
||||
}
|
||||
|
||||
pub fn construct(mnem: Mnemonic, ops: []const Operand) !Data {
|
||||
const inst_enc = InstEnc.fromMnemonic(mnem);
|
||||
|
||||
const enc = mnem.encoding();
|
||||
|
||||
// special mnemonics
|
||||
|
|
@ -251,17 +614,17 @@ pub const Data = union(InstEnc) {
|
|||
assert(ops.len == 0);
|
||||
return .{
|
||||
.I = .{
|
||||
.rd = Register.zero.id(),
|
||||
.rs1 = Register.zero.id(),
|
||||
.rd = Register.zero.encodeId(),
|
||||
.rs1 = Register.zero.encodeId(),
|
||||
.imm0_11 = switch (mnem) {
|
||||
.ecall => 0x000,
|
||||
.ebreak => 0x001,
|
||||
.unimp => 0,
|
||||
.unimp => 0x000,
|
||||
else => unreachable,
|
||||
},
|
||||
|
||||
.opcode = enc.opcode,
|
||||
.funct3 = enc.funct3.?,
|
||||
.opcode = @intFromEnum(enc.opcode),
|
||||
.funct3 = enc.data.f.funct3,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
@ -272,14 +635,26 @@ pub const Data = union(InstEnc) {
|
|||
.R => {
|
||||
assert(ops.len == 3);
|
||||
return .{
|
||||
.R = .{
|
||||
.rd = ops[0].reg.id(),
|
||||
.rs1 = ops[1].reg.id(),
|
||||
.rs2 = ops[2].reg.id(),
|
||||
.R = switch (enc.data) {
|
||||
.ff => |ff| .{
|
||||
.rd = ops[0].reg.encodeId(),
|
||||
.rs1 = ops[1].reg.encodeId(),
|
||||
.rs2 = ops[2].reg.encodeId(),
|
||||
|
||||
.opcode = enc.opcode,
|
||||
.funct3 = enc.funct3.?,
|
||||
.funct7 = enc.funct7.?,
|
||||
.opcode = @intFromEnum(enc.opcode),
|
||||
.funct3 = ff.funct3,
|
||||
.funct7 = ff.funct7,
|
||||
},
|
||||
.fmt => |fmt| .{
|
||||
.rd = ops[0].reg.encodeId(),
|
||||
.rs1 = ops[1].reg.encodeId(),
|
||||
.rs2 = ops[2].reg.encodeId(),
|
||||
|
||||
.opcode = @intFromEnum(enc.opcode),
|
||||
.funct3 = fmt.rm,
|
||||
.funct7 = (@as(u7, fmt.funct5) << 2) | @intFromEnum(fmt.fmt),
|
||||
},
|
||||
else => unreachable,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
@ -290,25 +665,37 @@ pub const Data = union(InstEnc) {
|
|||
return .{
|
||||
.S = .{
|
||||
.imm0_4 = @truncate(umm),
|
||||
.rs1 = ops[0].reg.id(),
|
||||
.rs2 = ops[1].reg.id(),
|
||||
.rs1 = ops[0].reg.encodeId(),
|
||||
.rs2 = ops[1].reg.encodeId(),
|
||||
.imm5_11 = @truncate(umm >> 5),
|
||||
|
||||
.opcode = enc.opcode,
|
||||
.funct3 = enc.funct3.?,
|
||||
.opcode = @intFromEnum(enc.opcode),
|
||||
.funct3 = enc.data.f.funct3,
|
||||
},
|
||||
};
|
||||
},
|
||||
.I => {
|
||||
assert(ops.len == 3);
|
||||
return .{
|
||||
.I = .{
|
||||
.rd = ops[0].reg.id(),
|
||||
.rs1 = ops[1].reg.id(),
|
||||
.imm0_11 = ops[2].imm.asBits(u12) + enc.offset,
|
||||
.I = switch (enc.data) {
|
||||
.f => |f| .{
|
||||
.rd = ops[0].reg.encodeId(),
|
||||
.rs1 = ops[1].reg.encodeId(),
|
||||
.imm0_11 = ops[2].imm.asBits(u12),
|
||||
|
||||
.opcode = enc.opcode,
|
||||
.funct3 = enc.funct3.?,
|
||||
.opcode = @intFromEnum(enc.opcode),
|
||||
.funct3 = f.funct3,
|
||||
},
|
||||
.sh => |sh| .{
|
||||
.rd = ops[0].reg.encodeId(),
|
||||
.rs1 = ops[1].reg.encodeId(),
|
||||
.imm0_11 = (@as(u12, sh.typ) << 6) |
|
||||
if (sh.has_5) ops[2].imm.asBits(u6) else (@as(u6, 0) | ops[2].imm.asBits(u5)),
|
||||
|
||||
.opcode = @intFromEnum(enc.opcode),
|
||||
.funct3 = sh.funct3,
|
||||
},
|
||||
else => unreachable,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
@ -316,10 +703,10 @@ pub const Data = union(InstEnc) {
|
|||
assert(ops.len == 2);
|
||||
return .{
|
||||
.U = .{
|
||||
.rd = ops[0].reg.id(),
|
||||
.rd = ops[0].reg.encodeId(),
|
||||
.imm12_31 = ops[1].imm.asBits(u20),
|
||||
|
||||
.opcode = enc.opcode,
|
||||
.opcode = @intFromEnum(enc.opcode),
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
@ -331,13 +718,13 @@ pub const Data = union(InstEnc) {
|
|||
|
||||
return .{
|
||||
.J = .{
|
||||
.rd = ops[0].reg.id(),
|
||||
.rd = ops[0].reg.encodeId(),
|
||||
.imm1_10 = @truncate(umm >> 1),
|
||||
.imm11 = @truncate(umm >> 11),
|
||||
.imm12_19 = @truncate(umm >> 12),
|
||||
.imm20 = @truncate(umm >> 20),
|
||||
|
||||
.opcode = enc.opcode,
|
||||
.opcode = @intFromEnum(enc.opcode),
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
@ -349,15 +736,15 @@ pub const Data = union(InstEnc) {
|
|||
|
||||
return .{
|
||||
.B = .{
|
||||
.rs1 = ops[0].reg.id(),
|
||||
.rs2 = ops[1].reg.id(),
|
||||
.rs1 = ops[0].reg.encodeId(),
|
||||
.rs2 = ops[1].reg.encodeId(),
|
||||
.imm1_4 = @truncate(umm >> 1),
|
||||
.imm5_10 = @truncate(umm >> 5),
|
||||
.imm11 = @truncate(umm >> 11),
|
||||
.imm12 = @truncate(umm >> 12),
|
||||
|
||||
.opcode = enc.opcode,
|
||||
.funct3 = enc.funct3.?,
|
||||
.opcode = @intFromEnum(enc.opcode),
|
||||
.funct3 = enc.data.f.funct3,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
@ -376,13 +763,6 @@ pub fn findByMnemonic(mnem: Mnemonic, ops: []const Operand) !?Encoding {
|
|||
};
|
||||
}
|
||||
|
||||
const Enc = struct {
|
||||
opcode: u7,
|
||||
funct3: ?u3,
|
||||
funct7: ?u7,
|
||||
offset: u12 = 0,
|
||||
};
|
||||
|
||||
fn verifyOps(mnem: Mnemonic, ops: []const Operand) bool {
|
||||
const inst_enc = InstEnc.fromMnemonic(mnem);
|
||||
const list = std.mem.sliceTo(&inst_enc.opsList(), .none);
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ result_relocs_len: u8 = undefined,
|
|||
result_insts: [
|
||||
@max(
|
||||
1, // non-pseudo instruction
|
||||
abi.callee_preserved_regs.len, // spill / restore regs,
|
||||
abi.Registers.all_preserved.len, // spill / restore regs,
|
||||
)
|
||||
]Instruction = undefined,
|
||||
result_relocs: [1]Reloc = undefined,
|
||||
|
|
@ -32,8 +32,10 @@ pub const Reloc = struct {
|
|||
const Target = union(enum) {
|
||||
inst: Mir.Inst.Index,
|
||||
|
||||
/// Relocs the lowered_inst_index and the next one.
|
||||
/// Relocs the lowered_inst_index and the next instruction.
|
||||
load_symbol_reloc: bits.Symbol,
|
||||
/// Relocs the lowered_inst_index and the next instruction.
|
||||
call_extern_fn_reloc: bits.Symbol,
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -42,6 +44,8 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
|
|||
insts: []const Instruction,
|
||||
relocs: []const Reloc,
|
||||
} {
|
||||
const zcu = lower.bin_file.comp.module.?;
|
||||
|
||||
lower.result_insts = undefined;
|
||||
lower.result_relocs = undefined;
|
||||
errdefer lower.result_insts = undefined;
|
||||
|
|
@ -69,11 +73,25 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
|
|||
|
||||
switch (inst.ops) {
|
||||
.pseudo_load_rm => {
|
||||
const tag: Encoding.Mnemonic = switch (rm.m.mod.rm.size) {
|
||||
.byte => .lb,
|
||||
.hword => .lh,
|
||||
.word => .lw,
|
||||
.dword => .ld,
|
||||
const dest_reg = rm.r;
|
||||
const dest_reg_class = dest_reg.class();
|
||||
const float = dest_reg_class == .float;
|
||||
|
||||
const src_size = rm.m.mod.size;
|
||||
const unsigned = rm.m.mod.unsigned;
|
||||
|
||||
const tag: Encoding.Mnemonic = if (!float)
|
||||
switch (src_size) {
|
||||
.byte => if (unsigned) .lbu else .lb,
|
||||
.hword => if (unsigned) .lhu else .lh,
|
||||
.word => if (unsigned) .lwu else .lw,
|
||||
.dword => .ld,
|
||||
}
|
||||
else switch (src_size) {
|
||||
.byte => unreachable, // Zig does not support 8-bit floats
|
||||
.hword => return lower.fail("TODO: lowerMir pseudo_load_rm support 16-bit floats", .{}),
|
||||
.word => .flw,
|
||||
.dword => .fld,
|
||||
};
|
||||
|
||||
try lower.emit(tag, &.{
|
||||
|
|
@ -83,11 +101,25 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
|
|||
});
|
||||
},
|
||||
.pseudo_store_rm => {
|
||||
const tag: Encoding.Mnemonic = switch (rm.m.mod.rm.size) {
|
||||
.byte => .sb,
|
||||
.hword => .sh,
|
||||
.word => .sw,
|
||||
.dword => .sd,
|
||||
const src_reg = rm.r;
|
||||
const src_reg_class = src_reg.class();
|
||||
const float = src_reg_class == .float;
|
||||
|
||||
// TODO: do we actually need this? are all stores not usize?
|
||||
const dest_size = rm.m.mod.size;
|
||||
|
||||
const tag: Encoding.Mnemonic = if (!float)
|
||||
switch (dest_size) {
|
||||
.byte => .sb,
|
||||
.hword => .sh,
|
||||
.word => .sw,
|
||||
.dword => .sd,
|
||||
}
|
||||
else switch (dest_size) {
|
||||
.byte => unreachable, // Zig does not support 8-bit floats
|
||||
.hword => return lower.fail("TODO: lowerMir pseudo_load_rm support 16-bit floats", .{}),
|
||||
.word => .fsw,
|
||||
.dword => .fsd,
|
||||
};
|
||||
|
||||
try lower.emit(tag, &.{
|
||||
|
|
@ -103,11 +135,27 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
|
|||
.pseudo_mv => {
|
||||
const rr = inst.data.rr;
|
||||
|
||||
try lower.emit(.addi, &.{
|
||||
.{ .reg = rr.rd },
|
||||
.{ .reg = rr.rs },
|
||||
.{ .imm = Immediate.s(0) },
|
||||
});
|
||||
const dst_class = rr.rd.class();
|
||||
const src_class = rr.rs.class();
|
||||
|
||||
assert(dst_class == src_class);
|
||||
|
||||
switch (dst_class) {
|
||||
.float => {
|
||||
try lower.emit(if (lower.hasFeature(.d)) .fsgnjnd else .fsgnjns, &.{
|
||||
.{ .reg = rr.rd },
|
||||
.{ .reg = rr.rs },
|
||||
.{ .reg = rr.rs },
|
||||
});
|
||||
},
|
||||
.int => {
|
||||
try lower.emit(.addi, &.{
|
||||
.{ .reg = rr.rd },
|
||||
.{ .reg = rr.rs },
|
||||
.{ .imm = Immediate.s(0) },
|
||||
});
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
.pseudo_ret => {
|
||||
|
|
@ -131,25 +179,31 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
|
|||
.pseudo_load_symbol => {
|
||||
const payload = inst.data.payload;
|
||||
const data = lower.mir.extraData(Mir.LoadSymbolPayload, payload).data;
|
||||
const dst_reg: bits.Register = @enumFromInt(data.register);
|
||||
assert(dst_reg.class() == .int);
|
||||
|
||||
try lower.emit(.lui, &.{
|
||||
.{ .reg = @enumFromInt(data.register) },
|
||||
.{ .imm = lower.reloc(.{ .load_symbol_reloc = .{
|
||||
.atom_index = data.atom_index,
|
||||
.sym_index = data.sym_index,
|
||||
} }) },
|
||||
.{ .reg = dst_reg },
|
||||
.{ .imm = lower.reloc(.{
|
||||
.load_symbol_reloc = .{
|
||||
.atom_index = data.atom_index,
|
||||
.sym_index = data.sym_index,
|
||||
},
|
||||
}) },
|
||||
});
|
||||
|
||||
// the above reloc implies this one
|
||||
try lower.emit(.addi, &.{
|
||||
.{ .reg = @enumFromInt(data.register) },
|
||||
.{ .reg = @enumFromInt(data.register) },
|
||||
.{ .reg = dst_reg },
|
||||
.{ .reg = dst_reg },
|
||||
.{ .imm = Immediate.s(0) },
|
||||
});
|
||||
},
|
||||
|
||||
.pseudo_lea_rm => {
|
||||
const rm = inst.data.rm;
|
||||
assert(rm.r.class() == .int);
|
||||
|
||||
const frame = rm.m.toFrameLoc(lower.mir);
|
||||
|
||||
try lower.emit(.addi, &.{
|
||||
|
|
@ -159,6 +213,26 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
|
|||
});
|
||||
},
|
||||
|
||||
.pseudo_fabs => {
|
||||
const fabs = inst.data.fabs;
|
||||
assert(fabs.rs.class() == .float and fabs.rd.class() == .float);
|
||||
|
||||
const mnem: Encoding.Mnemonic = switch (fabs.bits) {
|
||||
16 => return lower.fail("TODO: airAbs Float 16", .{}),
|
||||
32 => .fsgnjxs,
|
||||
64 => .fsgnjxd,
|
||||
80 => return lower.fail("TODO: airAbs Float 80", .{}),
|
||||
128 => return lower.fail("TODO: airAbs Float 128", .{}),
|
||||
else => unreachable,
|
||||
};
|
||||
|
||||
try lower.emit(mnem, &.{
|
||||
.{ .reg = fabs.rs },
|
||||
.{ .reg = fabs.rd },
|
||||
.{ .reg = fabs.rd },
|
||||
});
|
||||
},
|
||||
|
||||
.pseudo_compare => {
|
||||
const compare = inst.data.compare;
|
||||
const op = compare.op;
|
||||
|
|
@ -167,78 +241,142 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
|
|||
const rs1 = compare.rs1;
|
||||
const rs2 = compare.rs2;
|
||||
|
||||
switch (op) {
|
||||
.eq => {
|
||||
try lower.emit(.xor, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
const class = rs1.class();
|
||||
const ty = compare.ty;
|
||||
const size = std.math.ceilPowerOfTwo(u64, ty.bitSize(zcu)) catch {
|
||||
return lower.fail("pseudo_compare size {}", .{ty.bitSize(zcu)});
|
||||
};
|
||||
|
||||
try lower.emit(.sltiu, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rd },
|
||||
.{ .imm = Immediate.s(1) },
|
||||
});
|
||||
},
|
||||
.neq => {
|
||||
try lower.emit(.xor, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
const is_unsigned = ty.isUnsignedInt(zcu);
|
||||
|
||||
try lower.emit(.sltu, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = .zero },
|
||||
.{ .reg = rd },
|
||||
});
|
||||
},
|
||||
.gt => {
|
||||
try lower.emit(.sltu, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
},
|
||||
.gte => {
|
||||
try lower.emit(.sltu, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
const less_than: Encoding.Mnemonic = if (is_unsigned) .sltu else .slt;
|
||||
|
||||
try lower.emit(.xori, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rd },
|
||||
.{ .imm = Immediate.s(1) },
|
||||
});
|
||||
},
|
||||
.lt => {
|
||||
try lower.emit(.slt, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
},
|
||||
.lte => {
|
||||
try lower.emit(.slt, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs2 },
|
||||
.{ .reg = rs1 },
|
||||
});
|
||||
switch (class) {
|
||||
.int => switch (op) {
|
||||
.eq => {
|
||||
try lower.emit(.xor, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
|
||||
try lower.emit(.xori, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rd },
|
||||
.{ .imm = Immediate.s(1) },
|
||||
});
|
||||
try lower.emit(.sltiu, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rd },
|
||||
.{ .imm = Immediate.s(1) },
|
||||
});
|
||||
},
|
||||
.neq => {
|
||||
try lower.emit(.xor, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
|
||||
try lower.emit(.sltu, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = .zero },
|
||||
.{ .reg = rd },
|
||||
});
|
||||
},
|
||||
.gt => {
|
||||
try lower.emit(less_than, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
},
|
||||
.gte => {
|
||||
try lower.emit(less_than, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
|
||||
try lower.emit(.xori, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rd },
|
||||
.{ .imm = Immediate.s(1) },
|
||||
});
|
||||
},
|
||||
.lt => {
|
||||
try lower.emit(less_than, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
},
|
||||
.lte => {
|
||||
try lower.emit(less_than, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs2 },
|
||||
.{ .reg = rs1 },
|
||||
});
|
||||
|
||||
try lower.emit(.xori, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rd },
|
||||
.{ .imm = Immediate.s(1) },
|
||||
});
|
||||
},
|
||||
},
|
||||
.float => switch (op) {
|
||||
// eq
|
||||
.eq => {
|
||||
try lower.emit(if (size == 64) .feqd else .feqs, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
},
|
||||
// !(eq)
|
||||
.neq => {
|
||||
try lower.emit(if (size == 64) .feqd else .feqs, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
try lower.emit(.xori, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rd },
|
||||
.{ .imm = Immediate.s(1) },
|
||||
});
|
||||
},
|
||||
.lt => {
|
||||
try lower.emit(if (size == 64) .fltd else .flts, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
},
|
||||
.lte => {
|
||||
try lower.emit(if (size == 64) .fled else .fles, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs1 },
|
||||
.{ .reg = rs2 },
|
||||
});
|
||||
},
|
||||
.gt => {
|
||||
try lower.emit(if (size == 64) .fltd else .flts, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs2 },
|
||||
.{ .reg = rs1 },
|
||||
});
|
||||
},
|
||||
.gte => {
|
||||
try lower.emit(if (size == 64) .fled else .fles, &.{
|
||||
.{ .reg = rd },
|
||||
.{ .reg = rs2 },
|
||||
.{ .reg = rs1 },
|
||||
});
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
.pseudo_not => {
|
||||
const rr = inst.data.rr;
|
||||
assert(rr.rs.class() == .int and rr.rd.class() == .int);
|
||||
|
||||
try lower.emit(.xori, &.{
|
||||
.{ .reg = rr.rd },
|
||||
|
|
@ -247,6 +385,26 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
|
|||
});
|
||||
},
|
||||
|
||||
.pseudo_extern_fn_reloc => {
|
||||
const inst_reloc = inst.data.reloc;
|
||||
|
||||
try lower.emit(.auipc, &.{
|
||||
.{ .reg = .ra },
|
||||
.{ .imm = lower.reloc(
|
||||
.{ .call_extern_fn_reloc = .{
|
||||
.atom_index = inst_reloc.atom_index,
|
||||
.sym_index = inst_reloc.sym_index,
|
||||
} },
|
||||
) },
|
||||
});
|
||||
|
||||
try lower.emit(.jalr, &.{
|
||||
.{ .reg = .ra },
|
||||
.{ .reg = .ra },
|
||||
.{ .imm = Immediate.s(0) },
|
||||
});
|
||||
},
|
||||
|
||||
else => return lower.fail("TODO lower: psuedo {s}", .{@tagName(inst.ops)}),
|
||||
},
|
||||
}
|
||||
|
|
@ -314,16 +472,19 @@ fn pushPopRegList(lower: *Lower, comptime spilling: bool, reg_list: Mir.Register
|
|||
var reg_i: u31 = 0;
|
||||
while (it.next()) |i| {
|
||||
const frame = lower.mir.frame_locs.get(@intFromEnum(bits.FrameIndex.spill_frame));
|
||||
const reg = abi.Registers.all_preserved[i];
|
||||
const reg_class = reg.class();
|
||||
const is_float_reg = reg_class == .float;
|
||||
|
||||
if (spilling) {
|
||||
try lower.emit(.sd, &.{
|
||||
try lower.emit(if (is_float_reg) .fsd else .sd, &.{
|
||||
.{ .reg = frame.base },
|
||||
.{ .reg = abi.callee_preserved_regs[i] },
|
||||
.{ .reg = abi.Registers.all_preserved[i] },
|
||||
.{ .imm = Immediate.s(frame.disp + reg_i) },
|
||||
});
|
||||
} else {
|
||||
try lower.emit(.ld, &.{
|
||||
.{ .reg = abi.callee_preserved_regs[i] },
|
||||
try lower.emit(if (is_float_reg) .fld else .ld, &.{
|
||||
.{ .reg = abi.Registers.all_preserved[i] },
|
||||
.{ .reg = frame.base },
|
||||
.{ .imm = Immediate.s(frame.disp + reg_i) },
|
||||
});
|
||||
|
|
@ -340,6 +501,12 @@ pub fn fail(lower: *Lower, comptime format: []const u8, args: anytype) Error {
|
|||
return error.LowerFail;
|
||||
}
|
||||
|
||||
fn hasFeature(lower: *Lower, feature: std.Target.riscv.Feature) bool {
|
||||
const target = lower.bin_file.comp.module.?.getTarget();
|
||||
const features = target.cpu.features;
|
||||
return std.Target.riscv.featureSetHas(features, feature);
|
||||
}
|
||||
|
||||
const Lower = @This();
|
||||
|
||||
const abi = @import("abi.zig");
|
||||
|
|
|
|||
|
|
@ -20,90 +20,119 @@ pub const Inst = struct {
|
|||
pub const Index = u32;
|
||||
|
||||
pub const Tag = enum(u16) {
|
||||
/// Add immediate. Uses i_type payload.
|
||||
addi,
|
||||
|
||||
/// Add immediate and produce a sign-extended result.
|
||||
///
|
||||
/// Uses i-type payload.
|
||||
// base extension
|
||||
addi,
|
||||
addiw,
|
||||
|
||||
jalr,
|
||||
lui,
|
||||
mv,
|
||||
|
||||
@"and",
|
||||
andi,
|
||||
|
||||
xor,
|
||||
@"or",
|
||||
|
||||
ebreak,
|
||||
ecall,
|
||||
unimp,
|
||||
|
||||
/// OR instruction. Uses r_type payload.
|
||||
@"or",
|
||||
|
||||
/// Addition
|
||||
add,
|
||||
/// Subtraction
|
||||
addw,
|
||||
sub,
|
||||
/// Multiply, uses r_type. Needs the M extension.
|
||||
mul,
|
||||
|
||||
/// Absolute Value, uses i_type payload.
|
||||
abs,
|
||||
subw,
|
||||
|
||||
sltu,
|
||||
slt,
|
||||
|
||||
/// Immediate Logical Right Shift, uses i_type payload
|
||||
srli,
|
||||
/// Immediate Logical Left Shift, uses i_type payload
|
||||
slli,
|
||||
/// Immediate Arithmetic Right Shift, uses i_type payload.
|
||||
srli,
|
||||
srai,
|
||||
/// Register Logical Left Shift, uses r_type payload
|
||||
sllw,
|
||||
/// Register Logical Right Shit, uses r_type payload
|
||||
srlw,
|
||||
|
||||
/// Jumps, but stores the address of the instruction following the
|
||||
/// jump in `rd`.
|
||||
///
|
||||
/// Uses j_type payload.
|
||||
slliw,
|
||||
srliw,
|
||||
sraiw,
|
||||
|
||||
sll,
|
||||
srl,
|
||||
sra,
|
||||
|
||||
sllw,
|
||||
srlw,
|
||||
sraw,
|
||||
|
||||
jal,
|
||||
|
||||
/// Immediate AND, uses i_type payload
|
||||
andi,
|
||||
|
||||
/// Branch if equal, Uses b_type
|
||||
beq,
|
||||
/// Branch if not equal, Uses b_type
|
||||
bne,
|
||||
|
||||
/// Boolean NOT, Uses rr payload
|
||||
not,
|
||||
|
||||
/// Generates a NO-OP, uses nop payload
|
||||
nop,
|
||||
|
||||
/// Load double (64 bits), uses i_type payload
|
||||
ld,
|
||||
/// Load word (32 bits), uses i_type payload
|
||||
lw,
|
||||
/// Load half (16 bits), uses i_type payload
|
||||
lh,
|
||||
/// Load byte (8 bits), uses i_type payload
|
||||
lb,
|
||||
|
||||
/// Store double (64 bits), uses s_type payload
|
||||
sd,
|
||||
/// Store word (32 bits), uses s_type payload
|
||||
sw,
|
||||
/// Store half (16 bits), uses s_type payload
|
||||
sh,
|
||||
/// Store byte (8 bits), uses s_type payload
|
||||
sb,
|
||||
|
||||
// M extension
|
||||
mul,
|
||||
mulw,
|
||||
|
||||
div,
|
||||
divu,
|
||||
divw,
|
||||
divuw,
|
||||
|
||||
rem,
|
||||
remu,
|
||||
remw,
|
||||
remuw,
|
||||
|
||||
// F extension (32-bit float)
|
||||
fadds,
|
||||
fsubs,
|
||||
fmuls,
|
||||
fdivs,
|
||||
|
||||
fabss,
|
||||
|
||||
fmins,
|
||||
fmaxs,
|
||||
|
||||
fsqrts,
|
||||
|
||||
flw,
|
||||
fsw,
|
||||
|
||||
feqs,
|
||||
flts,
|
||||
fles,
|
||||
|
||||
// D extension (64-bit float)
|
||||
faddd,
|
||||
fsubd,
|
||||
fmuld,
|
||||
fdivd,
|
||||
|
||||
fabsd,
|
||||
|
||||
fmind,
|
||||
fmaxd,
|
||||
|
||||
fsqrtd,
|
||||
|
||||
fld,
|
||||
fsd,
|
||||
|
||||
feqd,
|
||||
fltd,
|
||||
fled,
|
||||
|
||||
/// A pseudo-instruction. Used for anything that isn't 1:1 with an
|
||||
/// assembly instruction.
|
||||
pseudo,
|
||||
|
|
@ -192,6 +221,12 @@ pub const Inst = struct {
|
|||
rs: Register,
|
||||
},
|
||||
|
||||
fabs: struct {
|
||||
rd: Register,
|
||||
rs: Register,
|
||||
bits: u16,
|
||||
},
|
||||
|
||||
compare: struct {
|
||||
rd: Register,
|
||||
rs1: Register,
|
||||
|
|
@ -204,6 +239,12 @@ pub const Inst = struct {
|
|||
lt,
|
||||
lte,
|
||||
},
|
||||
ty: Type,
|
||||
},
|
||||
|
||||
reloc: struct {
|
||||
atom_index: u32,
|
||||
sym_index: u32,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -217,10 +258,7 @@ pub const Inst = struct {
|
|||
|
||||
/// Two registers + immediate, uses the i_type payload.
|
||||
rri,
|
||||
/// Two registers + Two Immediates
|
||||
rrii,
|
||||
|
||||
/// Two registers + another instruction.
|
||||
//extern_fn_reloc/ Two registers + another instruction.
|
||||
rr_inst,
|
||||
|
||||
/// Register + Memory
|
||||
|
|
@ -268,6 +306,9 @@ pub const Inst = struct {
|
|||
/// Jumps. Uses `inst` payload.
|
||||
pseudo_j,
|
||||
|
||||
/// Floating point absolute value.
|
||||
pseudo_fabs,
|
||||
|
||||
/// Dead inst, ignored by the emitter.
|
||||
pseudo_dead,
|
||||
|
||||
|
|
@ -286,6 +327,9 @@ pub const Inst = struct {
|
|||
|
||||
pseudo_compare,
|
||||
pseudo_not,
|
||||
|
||||
/// Generates an auipc + jalr pair, with a R_RISCV_CALL_PLT reloc
|
||||
pseudo_extern_fn_reloc,
|
||||
};
|
||||
|
||||
// Make sure we don't accidentally make instructions bigger than expected.
|
||||
|
|
@ -387,6 +431,8 @@ pub const RegisterList = struct {
|
|||
const Mir = @This();
|
||||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
const Type = @import("../../type.zig").Type;
|
||||
|
||||
const assert = std.debug.assert;
|
||||
|
||||
const bits = @import("bits.zig");
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ const InternPool = @import("../../InternPool.zig");
|
|||
const Module = @import("../../Module.zig");
|
||||
const assert = std.debug.assert;
|
||||
|
||||
pub const Class = enum { memory, byval, integer, double_integer, fields, none };
|
||||
pub const Class = enum { memory, byval, integer, double_integer, fields };
|
||||
|
||||
pub fn classifyType(ty: Type, mod: *Module) Class {
|
||||
const target = mod.getTarget();
|
||||
|
|
@ -93,11 +93,13 @@ pub fn classifyType(ty: Type, mod: *Module) Class {
|
|||
}
|
||||
}
|
||||
|
||||
pub const SystemClass = enum { integer, float, memory, none };
|
||||
|
||||
/// There are a maximum of 8 possible return slots. Returned values are in
|
||||
/// the beginning of the array; unused slots are filled with .none.
|
||||
pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {
|
||||
var result = [1]Class{.none} ** 8;
|
||||
const memory_class = [_]Class{
|
||||
pub fn classifySystem(ty: Type, zcu: *Module) [8]SystemClass {
|
||||
var result = [1]SystemClass{.none} ** 8;
|
||||
const memory_class = [_]SystemClass{
|
||||
.memory, .none, .none, .none,
|
||||
.none, .none, .none, .none,
|
||||
};
|
||||
|
|
@ -123,6 +125,7 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {
|
|||
return result;
|
||||
}
|
||||
result[0] = .integer;
|
||||
if (ty.optionalChild(zcu).abiSize(zcu) == 0) return result;
|
||||
result[1] = .integer;
|
||||
return result;
|
||||
},
|
||||
|
|
@ -139,6 +142,18 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {
|
|||
}
|
||||
unreachable; // support > 128 bit int arguments
|
||||
},
|
||||
.Float => {
|
||||
const target = zcu.getTarget();
|
||||
const features = target.cpu.features;
|
||||
|
||||
const float_bits = ty.floatBits(zcu.getTarget());
|
||||
const float_reg_size: u32 = if (std.Target.riscv.featureSetHas(features, .d)) 64 else 32;
|
||||
if (float_bits <= float_reg_size) {
|
||||
result[0] = .float;
|
||||
return result;
|
||||
}
|
||||
unreachable; // support split float args
|
||||
},
|
||||
.ErrorUnion => {
|
||||
const payload_ty = ty.errorUnionPayload(zcu);
|
||||
const payload_bits = payload_ty.bitSize(zcu);
|
||||
|
|
@ -149,12 +164,7 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {
|
|||
// anyerror!void can fit into one register
|
||||
if (payload_bits == 0) return result;
|
||||
|
||||
if (payload_bits <= 64) {
|
||||
result[1] = .integer;
|
||||
return result;
|
||||
}
|
||||
|
||||
std.debug.panic("TODO: classifySystem ErrorUnion > 64 bit payload", .{});
|
||||
return memory_class;
|
||||
},
|
||||
.Struct => {
|
||||
const layout = ty.containerLayout(zcu);
|
||||
|
|
@ -169,6 +179,19 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {
|
|||
|
||||
return memory_class;
|
||||
},
|
||||
.Array => {
|
||||
const ty_size = ty.abiSize(zcu);
|
||||
if (ty_size <= 8) {
|
||||
result[0] = .integer;
|
||||
return result;
|
||||
}
|
||||
if (ty_size <= 16) {
|
||||
result[0] = .integer;
|
||||
result[1] = .integer;
|
||||
return result;
|
||||
}
|
||||
return memory_class;
|
||||
},
|
||||
else => |bad_ty| std.debug.panic("classifySystem {s}", .{@tagName(bad_ty)}),
|
||||
}
|
||||
}
|
||||
|
|
@ -230,62 +253,81 @@ fn classifyStruct(
|
|||
}
|
||||
}
|
||||
|
||||
pub const callee_preserved_regs = [_]Register{
|
||||
// .s0 is ommited to be used as a frame pointer
|
||||
.s1, .s2, .s3, .s4, .s5, .s6, .s7, .s8, .s9, .s10, .s11,
|
||||
};
|
||||
|
||||
pub const function_arg_regs = [_]Register{
|
||||
.a0, .a1, .a2, .a3, .a4, .a5, .a6, .a7,
|
||||
};
|
||||
|
||||
pub const function_ret_regs = [_]Register{
|
||||
.a0, .a1,
|
||||
};
|
||||
|
||||
pub const temporary_regs = [_]Register{
|
||||
.t0, .t1, .t2, .t3, .t4, .t5, .t6,
|
||||
};
|
||||
|
||||
const allocatable_registers = callee_preserved_regs ++ function_arg_regs ++ temporary_regs;
|
||||
const allocatable_registers = Registers.Integer.all_regs ++ Registers.Float.all_regs;
|
||||
pub const RegisterManager = RegisterManagerFn(@import("CodeGen.zig"), Register, &allocatable_registers);
|
||||
|
||||
// Register classes
|
||||
const RegisterBitSet = RegisterManager.RegisterBitSet;
|
||||
pub const RegisterClass = struct {
|
||||
pub const gp: RegisterBitSet = blk: {
|
||||
var set = RegisterBitSet.initEmpty();
|
||||
set.setRangeValue(.{
|
||||
.start = 0,
|
||||
.end = callee_preserved_regs.len,
|
||||
}, true);
|
||||
break :blk set;
|
||||
|
||||
pub const RegisterClass = enum {
|
||||
int,
|
||||
float,
|
||||
};
|
||||
|
||||
pub const Registers = struct {
|
||||
pub const all_preserved = Integer.callee_preserved_regs ++ Float.callee_preserved_regs;
|
||||
|
||||
pub const Integer = struct {
|
||||
// zig fmt: off
|
||||
pub const general_purpose = initRegBitSet(0, callee_preserved_regs.len);
|
||||
pub const function_arg = initRegBitSet(callee_preserved_regs.len, function_arg_regs.len);
|
||||
pub const function_ret = initRegBitSet(callee_preserved_regs.len, function_ret_regs.len);
|
||||
pub const temporary = initRegBitSet(callee_preserved_regs.len + function_arg_regs.len, temporary_regs.len);
|
||||
// zig fmt: on
|
||||
|
||||
pub const callee_preserved_regs = [_]Register{
|
||||
// .s0 is omitted to be used as the frame pointer register
|
||||
.s1, .s2, .s3, .s4, .s5, .s6, .s7, .s8, .s9, .s10, .s11,
|
||||
};
|
||||
|
||||
pub const function_arg_regs = [_]Register{
|
||||
.a0, .a1, .a2, .a3, .a4, .a5, .a6, .a7,
|
||||
};
|
||||
|
||||
pub const function_ret_regs = [_]Register{
|
||||
.a0, .a1,
|
||||
};
|
||||
|
||||
pub const temporary_regs = [_]Register{
|
||||
.t0, .t1, .t2, .t3, .t4, .t5, .t6,
|
||||
};
|
||||
|
||||
pub const all_regs = callee_preserved_regs ++ function_arg_regs ++ temporary_regs;
|
||||
};
|
||||
|
||||
pub const fa: RegisterBitSet = blk: {
|
||||
var set = RegisterBitSet.initEmpty();
|
||||
set.setRangeValue(.{
|
||||
.start = callee_preserved_regs.len,
|
||||
.end = callee_preserved_regs.len + function_arg_regs.len,
|
||||
}, true);
|
||||
break :blk set;
|
||||
};
|
||||
pub const Float = struct {
|
||||
// zig fmt: off
|
||||
pub const general_purpose = initRegBitSet(Integer.all_regs.len, callee_preserved_regs.len);
|
||||
pub const function_arg = initRegBitSet(Integer.all_regs.len + callee_preserved_regs.len, function_arg_regs.len);
|
||||
pub const function_ret = initRegBitSet(Integer.all_regs.len + callee_preserved_regs.len, function_ret_regs.len);
|
||||
pub const temporary = initRegBitSet(Integer.all_regs.len + callee_preserved_regs.len + function_arg_regs.len, temporary_regs.len);
|
||||
// zig fmt: on
|
||||
|
||||
pub const fr: RegisterBitSet = blk: {
|
||||
var set = RegisterBitSet.initEmpty();
|
||||
set.setRangeValue(.{
|
||||
.start = callee_preserved_regs.len,
|
||||
.end = callee_preserved_regs.len + function_ret_regs.len,
|
||||
}, true);
|
||||
break :blk set;
|
||||
};
|
||||
pub const callee_preserved_regs = [_]Register{
|
||||
.fs0, .fs1, .fs2, .fs3, .fs4, .fs5, .fs6, .fs7, .fs8, .fs9, .fs10, .fs11,
|
||||
};
|
||||
|
||||
pub const tp: RegisterBitSet = blk: {
|
||||
var set = RegisterBitSet.initEmpty();
|
||||
set.setRangeValue(.{
|
||||
.start = callee_preserved_regs.len + function_arg_regs.len,
|
||||
.end = callee_preserved_regs.len + function_arg_regs.len + temporary_regs.len,
|
||||
}, true);
|
||||
break :blk set;
|
||||
pub const function_arg_regs = [_]Register{
|
||||
.fa0, .fa1, .fa2, .fa3, .fa4, .fa5, .fa6, .fa7,
|
||||
};
|
||||
|
||||
pub const function_ret_regs = [_]Register{
|
||||
.fa0, .fa1,
|
||||
};
|
||||
|
||||
pub const temporary_regs = [_]Register{
|
||||
.ft0, .ft1, .ft2, .ft3, .ft4, .ft5, .ft6, .ft7, .ft8, .ft9, .ft10, .ft11,
|
||||
};
|
||||
|
||||
pub const all_regs = callee_preserved_regs ++ function_arg_regs ++ temporary_regs;
|
||||
};
|
||||
};
|
||||
|
||||
fn initRegBitSet(start: usize, length: usize) RegisterBitSet {
|
||||
var set = RegisterBitSet.initEmpty();
|
||||
set.setRangeValue(.{
|
||||
.start = start,
|
||||
.end = start + length,
|
||||
}, true);
|
||||
return set;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,8 +2,12 @@ const std = @import("std");
|
|||
const DW = std.dwarf;
|
||||
const assert = std.debug.assert;
|
||||
const testing = std.testing;
|
||||
const Target = std.Target;
|
||||
|
||||
const Module = @import("../../Module.zig");
|
||||
const Encoding = @import("Encoding.zig");
|
||||
const Mir = @import("Mir.zig");
|
||||
const abi = @import("abi.zig");
|
||||
|
||||
pub const Memory = struct {
|
||||
base: Base,
|
||||
|
|
@ -15,12 +19,10 @@ pub const Memory = struct {
|
|||
reloc: Symbol,
|
||||
};
|
||||
|
||||
pub const Mod = union(enum(u1)) {
|
||||
rm: struct {
|
||||
size: Size,
|
||||
disp: i32 = 0,
|
||||
},
|
||||
off: i32,
|
||||
pub const Mod = struct {
|
||||
size: Size,
|
||||
unsigned: bool,
|
||||
disp: i32 = 0,
|
||||
};
|
||||
|
||||
pub const Size = enum(u4) {
|
||||
|
|
@ -35,10 +37,10 @@ pub const Memory = struct {
|
|||
|
||||
pub fn fromByteSize(size: u64) Size {
|
||||
return switch (size) {
|
||||
1 => .byte,
|
||||
2 => .hword,
|
||||
4 => .word,
|
||||
8 => .dword,
|
||||
1...1 => .byte,
|
||||
2...2 => .hword,
|
||||
3...4 => .word,
|
||||
5...8 => .dword,
|
||||
else => unreachable,
|
||||
};
|
||||
}
|
||||
|
|
@ -65,10 +67,7 @@ pub const Memory = struct {
|
|||
|
||||
/// Asserts `mem` can be represented as a `FrameLoc`.
|
||||
pub fn toFrameLoc(mem: Memory, mir: Mir) Mir.FrameLoc {
|
||||
const offset: i32 = switch (mem.mod) {
|
||||
.off => |off| off,
|
||||
.rm => |rm| rm.disp,
|
||||
};
|
||||
const offset: i32 = mem.mod.disp;
|
||||
|
||||
switch (mem.base) {
|
||||
.reg => |reg| {
|
||||
|
|
@ -91,7 +90,7 @@ pub const Memory = struct {
|
|||
|
||||
pub const Immediate = union(enum) {
|
||||
signed: i32,
|
||||
unsigned: u32,
|
||||
unsigned: u64,
|
||||
|
||||
pub fn u(x: u64) Immediate {
|
||||
return .{ .unsigned = x };
|
||||
|
|
@ -119,24 +118,6 @@ pub const Immediate = union(enum) {
|
|||
};
|
||||
}
|
||||
|
||||
pub fn asUnsigned(imm: Immediate, bit_size: u64) u64 {
|
||||
return switch (imm) {
|
||||
.signed => |x| switch (bit_size) {
|
||||
1, 8 => @as(u8, @bitCast(@as(i8, @intCast(x)))),
|
||||
16 => @as(u16, @bitCast(@as(i16, @intCast(x)))),
|
||||
32, 64 => @as(u32, @bitCast(x)),
|
||||
else => unreachable,
|
||||
},
|
||||
.unsigned => |x| switch (bit_size) {
|
||||
1, 8 => @as(u8, @intCast(x)),
|
||||
16 => @as(u16, @intCast(x)),
|
||||
32 => @as(u32, @intCast(x)),
|
||||
64 => x,
|
||||
else => unreachable,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
pub fn asBits(imm: Immediate, comptime T: type) T {
|
||||
const int_info = @typeInfo(T).Int;
|
||||
if (int_info.signedness != .unsigned) @compileError("Immediate.asBits needs unsigned T");
|
||||
|
|
@ -147,12 +128,10 @@ pub const Immediate = union(enum) {
|
|||
}
|
||||
};
|
||||
|
||||
pub const Register = enum(u6) {
|
||||
pub const Register = enum(u8) {
|
||||
// zig fmt: off
|
||||
x0, x1, x2, x3, x4, x5, x6, x7,
|
||||
x8, x9, x10, x11, x12, x13, x14, x15,
|
||||
x16, x17, x18, x19, x20, x21, x22, x23,
|
||||
x24, x25, x26, x27, x28, x29, x30, x31,
|
||||
|
||||
// base extension registers
|
||||
|
||||
zero, // zero
|
||||
ra, // return address. caller saved
|
||||
|
|
@ -166,17 +145,82 @@ pub const Register = enum(u6) {
|
|||
a2, a3, a4, a5, a6, a7, // fn args. caller saved.
|
||||
s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, // saved registers. callee saved.
|
||||
t3, t4, t5, t6, // caller saved
|
||||
|
||||
x0, x1, x2, x3, x4, x5, x6, x7,
|
||||
x8, x9, x10, x11, x12, x13, x14, x15,
|
||||
x16, x17, x18, x19, x20, x21, x22, x23,
|
||||
x24, x25, x26, x27, x28, x29, x30, x31,
|
||||
|
||||
|
||||
// F extension registers
|
||||
|
||||
ft0, ft1, ft2, ft3, ft4, ft5, ft6, ft7, // float temporaries. caller saved.
|
||||
fs0, fs1, // float saved. callee saved.
|
||||
fa0, fa1, // float arg/ret. caller saved.
|
||||
fa2, fa3, fa4, fa5, fa6, fa7, // float arg. called saved.
|
||||
fs2, fs3, fs4, fs5, fs6, fs7, fs8, fs9, fs10, fs11, // float saved. callee saved.
|
||||
ft8, ft9, ft10, ft11, // foat temporaries. calller saved.
|
||||
|
||||
// this register is accessed only through API instructions instead of directly
|
||||
// fcsr,
|
||||
|
||||
f0, f1, f2, f3, f4, f5, f6, f7,
|
||||
f8, f9, f10, f11, f12, f13, f14, f15,
|
||||
f16, f17, f18, f19, f20, f21, f22, f23,
|
||||
f24, f25, f26, f27, f28, f29, f30, f31,
|
||||
|
||||
// zig fmt: on
|
||||
|
||||
/// Returns the unique 5-bit ID of this register which is used in
|
||||
/// the machine code
|
||||
pub fn id(self: Register) u5 {
|
||||
return @as(u5, @truncate(@intFromEnum(self)));
|
||||
/// in RISC-V registers are stored as 5 bit IDs and a register can have
|
||||
/// two names. Example being `zero` and `x0` are the same register and have the
|
||||
/// same ID, but are two different entries in the enum. We store floating point
|
||||
/// registers in the same enum. RISC-V uses the same IDs for `f0` and `x0` by
|
||||
/// infering which register is being talked about given the instruction it's in.
|
||||
///
|
||||
/// The goal of this function is to return the same ID for `zero` and `x0` but two
|
||||
/// seperate IDs for `x0` and `f0`. We will assume that each register set has 32 registers
|
||||
/// and is repeated twice, once for the named version, once for the number version.
|
||||
pub fn id(reg: Register) u7 {
|
||||
const base = switch (@intFromEnum(reg)) {
|
||||
// zig fmt: off
|
||||
@intFromEnum(Register.zero) ... @intFromEnum(Register.x31) => @intFromEnum(Register.zero),
|
||||
@intFromEnum(Register.ft0) ... @intFromEnum(Register.f31) => @intFromEnum(Register.ft0),
|
||||
else => unreachable,
|
||||
// zig fmt: on
|
||||
};
|
||||
|
||||
return @intCast(base + reg.encodeId());
|
||||
}
|
||||
|
||||
pub fn encodeId(reg: Register) u5 {
|
||||
return @truncate(@intFromEnum(reg));
|
||||
}
|
||||
|
||||
pub fn dwarfLocOp(reg: Register) u8 {
|
||||
return @as(u8, reg.id());
|
||||
}
|
||||
|
||||
pub fn bitSize(reg: Register, zcu: *const Module) u32 {
|
||||
const features = zcu.getTarget().cpu.features;
|
||||
|
||||
return switch (@intFromEnum(reg)) {
|
||||
// zig fmt: off
|
||||
@intFromEnum(Register.zero) ... @intFromEnum(Register.x31) => 64,
|
||||
@intFromEnum(Register.ft0) ... @intFromEnum(Register.f31) => if (Target.riscv.featureSetHas(features, .d)) 64 else 32,
|
||||
else => unreachable,
|
||||
// zig fmt: on
|
||||
};
|
||||
}
|
||||
|
||||
pub fn class(reg: Register) abi.RegisterClass {
|
||||
return switch (@intFromEnum(reg)) {
|
||||
// zig fmt: off
|
||||
@intFromEnum(Register.zero) ... @intFromEnum(Register.x31) => .int,
|
||||
@intFromEnum(Register.ft0) ... @intFromEnum(Register.f31) => .float,
|
||||
else => unreachable,
|
||||
// zig fmt: on
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
pub const FrameIndex = enum(u32) {
|
||||
|
|
|
|||
|
|
@ -11,12 +11,11 @@ pub const Instruction = struct {
|
|||
|
||||
pub fn new(mnemonic: Encoding.Mnemonic, ops: []const Operand) !Instruction {
|
||||
const encoding = (try Encoding.findByMnemonic(mnemonic, ops)) orelse {
|
||||
std.log.err("no encoding found for: {s} {s} {s} {s} {s}", .{
|
||||
std.log.err("no encoding found for: {s} [{s} {s} {s}]", .{
|
||||
@tagName(mnemonic),
|
||||
@tagName(if (ops.len > 0) ops[0] else .none),
|
||||
@tagName(if (ops.len > 1) ops[1] else .none),
|
||||
@tagName(if (ops.len > 2) ops[2] else .none),
|
||||
@tagName(if (ops.len > 3) ops[3] else .none),
|
||||
});
|
||||
return error.InvalidInstruction;
|
||||
};
|
||||
|
|
@ -33,6 +32,31 @@ pub const Instruction = struct {
|
|||
pub fn encode(inst: Instruction, writer: anytype) !void {
|
||||
try writer.writeInt(u32, inst.encoding.data.toU32(), .little);
|
||||
}
|
||||
|
||||
pub fn format(
|
||||
inst: Instruction,
|
||||
comptime fmt: []const u8,
|
||||
_: std.fmt.FormatOptions,
|
||||
writer: anytype,
|
||||
) !void {
|
||||
std.debug.assert(fmt.len == 0);
|
||||
|
||||
const encoding = inst.encoding;
|
||||
|
||||
try writer.print("{s} ", .{@tagName(encoding.mnemonic)});
|
||||
|
||||
var i: u32 = 0;
|
||||
while (i < inst.ops.len and inst.ops[i] != .none) : (i += 1) {
|
||||
if (i != inst.ops.len and i != 0) try writer.writeAll(", ");
|
||||
|
||||
switch (@as(Instruction.Operand, inst.ops[i])) {
|
||||
.none => unreachable, // it's sliced out above
|
||||
.reg => |reg| try writer.writeAll(@tagName(reg)),
|
||||
.imm => |imm| try writer.print("{d}", .{imm.asSigned(64)}),
|
||||
.mem => unreachable, // there is no "mem" operand in the actual instructions
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const std = @import("std");
|
||||
|
|
|
|||
|
|
@ -11151,7 +11151,6 @@ fn lowerFnRetTy(o: *Object, fn_info: InternPool.Key.FuncType) Allocator.Error!Bu
|
|||
}
|
||||
return o.builder.structType(.normal, types[0..types_len]);
|
||||
},
|
||||
.none => unreachable,
|
||||
}
|
||||
},
|
||||
// TODO investigate C ABI for other architectures
|
||||
|
|
@ -11409,7 +11408,6 @@ const ParamTypeIterator = struct {
|
|||
it.llvm_index += it.types_len - 1;
|
||||
return .multiple_llvm_types;
|
||||
},
|
||||
.none => unreachable,
|
||||
}
|
||||
},
|
||||
// TODO investigate C ABI for other architectures
|
||||
|
|
|
|||
|
|
@ -5842,7 +5842,8 @@ pub fn tpAddress(self: *Elf) i64 {
|
|||
const addr = switch (self.getTarget().cpu.arch) {
|
||||
.x86_64 => mem.alignForward(u64, phdr.p_vaddr + phdr.p_memsz, phdr.p_align),
|
||||
.aarch64 => mem.alignBackward(u64, phdr.p_vaddr - 16, phdr.p_align),
|
||||
else => @panic("TODO implement getTpAddress for this arch"),
|
||||
.riscv64 => phdr.p_vaddr,
|
||||
else => |arch| std.debug.panic("TODO implement getTpAddress for {s}", .{@tagName(arch)}),
|
||||
};
|
||||
return @intCast(addr);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1409,11 +1409,11 @@ const x86_64 = struct {
|
|||
.GOTPC64 => try cwriter.writeInt(i64, GOT + A, .little),
|
||||
.SIZE32 => {
|
||||
const size = @as(i64, @intCast(target.elfSym(elf_file).st_size));
|
||||
try cwriter.writeInt(u32, @as(u32, @bitCast(@as(i32, @intCast(size + A)))), .little);
|
||||
try cwriter.writeInt(u32, @bitCast(@as(i32, @intCast(size + A))), .little);
|
||||
},
|
||||
.SIZE64 => {
|
||||
const size = @as(i64, @intCast(target.elfSym(elf_file).st_size));
|
||||
try cwriter.writeInt(i64, @as(i64, @intCast(size + A)), .little);
|
||||
try cwriter.writeInt(i64, @intCast(size + A), .little);
|
||||
},
|
||||
else => try atom.reportUnhandledRelocError(rel, elf_file),
|
||||
}
|
||||
|
|
@ -2001,26 +2001,25 @@ const riscv = struct {
|
|||
const r_type: elf.R_RISCV = @enumFromInt(rel.r_type());
|
||||
|
||||
switch (r_type) {
|
||||
.@"64" => {
|
||||
try atom.scanReloc(symbol, rel, dynAbsRelocAction(symbol, elf_file), elf_file);
|
||||
},
|
||||
|
||||
.HI20 => {
|
||||
try atom.scanReloc(symbol, rel, absRelocAction(symbol, elf_file), elf_file);
|
||||
},
|
||||
.@"32" => try atom.scanReloc(symbol, rel, absRelocAction(symbol, elf_file), elf_file),
|
||||
.@"64" => try atom.scanReloc(symbol, rel, dynAbsRelocAction(symbol, elf_file), elf_file),
|
||||
.HI20 => try atom.scanReloc(symbol, rel, absRelocAction(symbol, elf_file), elf_file),
|
||||
|
||||
.CALL_PLT => if (symbol.flags.import) {
|
||||
symbol.flags.needs_plt = true;
|
||||
},
|
||||
.GOT_HI20 => symbol.flags.needs_got = true,
|
||||
|
||||
.GOT_HI20 => {
|
||||
symbol.flags.needs_got = true;
|
||||
},
|
||||
.TPREL_HI20,
|
||||
.TPREL_LO12_I,
|
||||
.TPREL_LO12_S,
|
||||
.TPREL_ADD,
|
||||
|
||||
.PCREL_HI20,
|
||||
.PCREL_LO12_I,
|
||||
.PCREL_LO12_S,
|
||||
.LO12_I,
|
||||
.LO12_S,
|
||||
.ADD32,
|
||||
.SUB32,
|
||||
=> {},
|
||||
|
|
@ -2058,6 +2057,8 @@ const riscv = struct {
|
|||
switch (r_type) {
|
||||
.NONE => unreachable,
|
||||
|
||||
.@"32" => try cwriter.writeInt(u32, @as(u32, @truncate(@as(u64, @intCast(S + A)))), .little),
|
||||
|
||||
.@"64" => {
|
||||
try atom.resolveDynAbsReloc(
|
||||
target,
|
||||
|
|
@ -2076,11 +2077,6 @@ const riscv = struct {
|
|||
riscv_util.writeInstU(code[r_offset..][0..4], value);
|
||||
},
|
||||
|
||||
.LO12_I => {
|
||||
const value: u32 = @bitCast(math.cast(i32, S + A) orelse return error.Overflow);
|
||||
riscv_util.writeInstI(code[r_offset..][0..4], value);
|
||||
},
|
||||
|
||||
.GOT_HI20 => {
|
||||
assert(target.flags.has_got);
|
||||
const disp: u32 = @bitCast(math.cast(i32, G + GOT + A - P) orelse return error.Overflow);
|
||||
|
|
@ -2143,6 +2139,39 @@ const riscv = struct {
|
|||
}
|
||||
},
|
||||
|
||||
.LO12_I,
|
||||
.LO12_S,
|
||||
=> {
|
||||
const disp: u32 = @bitCast(math.cast(i32, S + A) orelse return error.Overflow);
|
||||
switch (r_type) {
|
||||
.LO12_I => riscv_util.writeInstI(code[r_offset..][0..4], disp),
|
||||
.LO12_S => riscv_util.writeInstS(code[r_offset..][0..4], disp),
|
||||
else => unreachable,
|
||||
}
|
||||
},
|
||||
|
||||
.TPREL_HI20 => {
|
||||
const target_addr: u32 = @intCast(target.address(.{}, elf_file));
|
||||
const val: i32 = @intCast(S + A - target_addr);
|
||||
riscv_util.writeInstU(code[r_offset..][0..4], @bitCast(val));
|
||||
},
|
||||
|
||||
.TPREL_LO12_I,
|
||||
.TPREL_LO12_S,
|
||||
=> {
|
||||
const target_addr: u32 = @intCast(target.address(.{}, elf_file));
|
||||
const val: i32 = @intCast(S + A - target_addr);
|
||||
switch (r_type) {
|
||||
.TPREL_LO12_I => riscv_util.writeInstI(code[r_offset..][0..4], @bitCast(val)),
|
||||
.TPREL_LO12_S => riscv_util.writeInstS(code[r_offset..][0..4], @bitCast(val)),
|
||||
else => unreachable,
|
||||
}
|
||||
},
|
||||
|
||||
.TPREL_ADD => {
|
||||
// TODO: annotates an ADD instruction that can be removed when TPREL is relaxed
|
||||
},
|
||||
|
||||
else => |x| switch (@intFromEnum(x)) {
|
||||
// Zig custom relocations
|
||||
Elf.R_ZIG_GOT_HI20 => {
|
||||
|
|
|
|||
|
|
@ -906,7 +906,9 @@ fn updateDeclCode(
|
|||
|
||||
log.debug("updateDeclCode {}{*}", .{ decl_name.fmt(&mod.intern_pool), decl });
|
||||
|
||||
const required_alignment = decl.getAlignment(mod);
|
||||
const required_alignment = decl.getAlignment(mod).max(
|
||||
target_util.minFunctionAlignment(mod.getTarget()),
|
||||
);
|
||||
|
||||
const sym = elf_file.symbol(sym_index);
|
||||
const esym = &self.local_esyms.items(.elf_sym)[sym.esym_index];
|
||||
|
|
@ -1634,6 +1636,7 @@ const log = std.log.scoped(.link);
|
|||
const mem = std.mem;
|
||||
const relocation = @import("relocation.zig");
|
||||
const trace = @import("../../tracy.zig").trace;
|
||||
const target_util = @import("../../target.zig");
|
||||
const std = @import("std");
|
||||
|
||||
const Air = @import("../../Air.zig");
|
||||
|
|
|
|||
|
|
@ -431,6 +431,23 @@ pub fn defaultFunctionAlignment(target: std.Target) Alignment {
|
|||
};
|
||||
}
|
||||
|
||||
pub fn minFunctionAlignment(target: std.Target) Alignment {
|
||||
return switch (target.cpu.arch) {
|
||||
.arm,
|
||||
.armeb,
|
||||
.aarch64,
|
||||
.aarch64_32,
|
||||
.aarch64_be,
|
||||
.riscv32,
|
||||
.riscv64,
|
||||
.sparc,
|
||||
.sparcel,
|
||||
.sparc64,
|
||||
=> .@"2",
|
||||
else => .@"1",
|
||||
};
|
||||
}
|
||||
|
||||
pub fn supportsFunctionAlignment(target: std.Target) bool {
|
||||
return switch (target.cpu.arch) {
|
||||
.wasm32, .wasm64 => false,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ test "@abs integers" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try comptime testAbsIntegers();
|
||||
try testAbsIntegers();
|
||||
|
|
@ -93,18 +92,17 @@ test "@abs floats" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try comptime testAbsFloats(f16);
|
||||
try testAbsFloats(f16);
|
||||
if (builtin.zig_backend != .stage2_riscv64) try testAbsFloats(f16);
|
||||
try comptime testAbsFloats(f32);
|
||||
try testAbsFloats(f32);
|
||||
try comptime testAbsFloats(f64);
|
||||
try testAbsFloats(f64);
|
||||
try comptime testAbsFloats(f80);
|
||||
if (builtin.zig_backend != .stage2_wasm and builtin.zig_backend != .stage2_spirv64) try testAbsFloats(f80);
|
||||
if (builtin.zig_backend != .stage2_wasm and builtin.zig_backend != .stage2_spirv64 and builtin.zig_backend != .stage2_riscv64) try testAbsFloats(f80);
|
||||
try comptime testAbsFloats(f128);
|
||||
if (builtin.zig_backend != .stage2_wasm and builtin.zig_backend != .stage2_spirv64) try testAbsFloats(f128);
|
||||
if (builtin.zig_backend != .stage2_wasm and builtin.zig_backend != .stage2_spirv64 and builtin.zig_backend != .stage2_riscv64) try testAbsFloats(f128);
|
||||
}
|
||||
|
||||
fn testAbsFloats(comptime T: type) !void {
|
||||
|
|
|
|||
|
|
@ -54,7 +54,6 @@ fn addUnaligned(a: *align(1) const u32, b: *align(1) const u32) u32 {
|
|||
}
|
||||
|
||||
test "@alignCast pointers" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
|
||||
var x: u32 align(4) = 1;
|
||||
expectsOnly1(&x);
|
||||
try expect(x == 2);
|
||||
|
|
@ -238,7 +237,6 @@ fn addUnalignedSlice(a: []align(1) const u32, b: []align(1) const u32) u32 {
|
|||
}
|
||||
|
||||
test "specifying alignment allows pointer cast" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
|
|
@ -251,7 +249,6 @@ fn testBytesAlign(b: u8) !void {
|
|||
}
|
||||
|
||||
test "@alignCast slices" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
|
@ -312,7 +309,6 @@ test "function alignment" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
// function alignment is a compile error on wasm32/wasm64
|
||||
if (native_arch == .wasm32 or native_arch == .wasm64) return error.SkipZigTest;
|
||||
|
|
@ -426,7 +422,6 @@ test "function callconv expression depends on generic parameter" {
|
|||
}
|
||||
|
||||
test "runtime-known array index has best alignment possible" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
// take full advantage of over-alignment
|
||||
|
|
@ -562,7 +557,6 @@ test "align(@alignOf(T)) T does not force resolution of T" {
|
|||
}
|
||||
|
||||
test "align(N) on functions" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
|
@ -608,7 +602,6 @@ test "comptime alloc alignment" {
|
|||
}
|
||||
|
||||
test "@alignCast null" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
|
|
@ -624,7 +617,6 @@ test "alignment of slice element" {
|
|||
}
|
||||
|
||||
test "sub-aligned pointer field access" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
|
||||
|
|
|
|||
|
|
@ -29,8 +29,6 @@ test "comparison of @alignOf(T) against zero" {
|
|||
}
|
||||
|
||||
test "correct alignment for elements and slices of aligned array" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buf: [1024]u8 align(64) = undefined;
|
||||
var start: usize = 1;
|
||||
var end: usize = undefined;
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@ fn getArrayLen(a: []const u32) usize {
|
|||
test "array concat with undefined" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -89,7 +88,6 @@ test "array concat with tuple" {
|
|||
|
||||
test "array init with concat" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = 'a';
|
||||
var i: [4]u8 = [2]u8{ a, 'b' } ++ [2]u8{ 'c', 'd' };
|
||||
|
|
@ -99,7 +97,6 @@ test "array init with concat" {
|
|||
test "array init with mult" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = 'a';
|
||||
var i: [8]u8 = [2]u8{ a, 'b' } ** 4;
|
||||
|
|
@ -231,7 +228,6 @@ test "nested arrays of integers" {
|
|||
test "implicit comptime in array type size" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var arr: [plusOne(10)]bool = undefined;
|
||||
_ = &arr;
|
||||
|
|
@ -245,7 +241,6 @@ fn plusOne(x: u32) u32 {
|
|||
test "single-item pointer to array indexing and slicing" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testSingleItemPtrArrayIndexSlice();
|
||||
try comptime testSingleItemPtrArrayIndexSlice();
|
||||
|
|
@ -271,7 +266,6 @@ fn doSomeMangling(array: *[4]u8) void {
|
|||
|
||||
test "implicit cast zero sized array ptr to slice" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
{
|
||||
var b = "".*;
|
||||
|
|
@ -310,7 +304,6 @@ const Str = struct { a: []Sub };
|
|||
test "set global var array via slice embedded in struct" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var s = Str{ .a = s_array[0..] };
|
||||
|
||||
|
|
@ -347,7 +340,6 @@ test "read/write through global variable array of struct fields initialized via
|
|||
test "implicit cast single-item pointer" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testImplicitCastSingleItemPtr();
|
||||
try comptime testImplicitCastSingleItemPtr();
|
||||
|
|
@ -378,7 +370,6 @@ test "comptime evaluating function that takes array by value" {
|
|||
test "runtime initialize array elem and then implicit cast to slice" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var two: i32 = 2;
|
||||
_ = &two;
|
||||
|
|
@ -389,7 +380,6 @@ test "runtime initialize array elem and then implicit cast to slice" {
|
|||
test "array literal as argument to function" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry(two: i32) !void {
|
||||
|
|
@ -418,7 +408,6 @@ test "double nested array to const slice cast in array literal" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry(two: i32) !void {
|
||||
|
|
@ -505,7 +494,6 @@ test "anonymous literal in array" {
|
|||
test "access the null element of a null terminated array" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -525,7 +513,6 @@ test "type deduction for array subscript expression" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -716,7 +703,6 @@ test "array of array agregate init" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a = [1]u32{11} ** 10;
|
||||
var b = [1][10]u32{a} ** 2;
|
||||
|
|
@ -767,7 +753,6 @@ test "slicing array of zero-sized values" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
var arr: [32]u0 = undefined;
|
||||
|
|
@ -778,8 +763,6 @@ test "slicing array of zero-sized values" {
|
|||
}
|
||||
|
||||
test "array init with no result pointer sets field result types" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
// A function parameter has a result type, but no result pointer.
|
||||
fn f(arr: [1]u32) u32 {
|
||||
|
|
@ -964,7 +947,6 @@ test "array initialized with string literal" {
|
|||
|
||||
test "array initialized with array with sentinel" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
a: u32,
|
||||
|
|
@ -1051,7 +1033,6 @@ test "union that needs padding bytes inside an array" {
|
|||
|
||||
test "runtime index of array of zero-bit values" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var runtime: struct { array: [1]void, index: usize } = undefined;
|
||||
runtime = .{ .array = .{{}}, .index = 0 };
|
||||
|
|
|
|||
|
|
@ -483,7 +483,6 @@ fn testStructInFn() !void {
|
|||
|
||||
test "fn call returning scalar optional in equality expression" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
try expect(getNull() == null);
|
||||
}
|
||||
|
||||
|
|
@ -494,7 +493,6 @@ fn getNull() ?*i32 {
|
|||
test "global variable assignment with optional unwrapping with var initialized to undefined" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
var data: i32 = 1234;
|
||||
|
|
@ -513,7 +511,6 @@ var global_foo: *i32 = undefined;
|
|||
test "peer result location with typed parent, runtime condition, comptime prongs" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest(arg: i32) i32 {
|
||||
|
|
@ -593,7 +590,6 @@ test "equality compare fn ptrs" {
|
|||
|
||||
test "self reference through fn ptr field" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const A = struct {
|
||||
|
|
@ -690,7 +686,6 @@ test "string concatenation" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = "OK" ++ " IT " ++ "WORKED";
|
||||
const b = "OK IT WORKED";
|
||||
|
|
@ -714,7 +709,6 @@ test "result location is optional inside error union" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const x = maybe(true) catch unreachable;
|
||||
try expect(x.? == 42);
|
||||
|
|
@ -730,7 +724,6 @@ fn maybe(x: bool) anyerror!?u32 {
|
|||
test "auto created variables have correct alignment" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo(str: [*]const u8) u32 {
|
||||
|
|
@ -838,7 +831,6 @@ test "labeled block implicitly ends in a break" {
|
|||
test "catch in block has correct result location" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn open() error{A}!@This() {
|
||||
|
|
@ -870,7 +862,6 @@ test "labeled block with runtime branch forwards its result location type to bre
|
|||
|
||||
test "try in labeled block doesn't cast to wrong type" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
a: u32,
|
||||
|
|
@ -897,7 +888,6 @@ test "weird array and tuple initializations" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const E = enum { a, b };
|
||||
const S = struct { e: E };
|
||||
|
|
@ -1016,7 +1006,6 @@ comptime {
|
|||
|
||||
test "switch inside @as gets correct type" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: u32 = 0;
|
||||
_ = &a;
|
||||
|
|
@ -1101,8 +1090,6 @@ test "orelse coercion as function argument" {
|
|||
}
|
||||
|
||||
test "runtime-known globals initialized with undefined" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
var array: [10]u32 = [_]u32{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||
var vp: [*]u32 = undefined;
|
||||
|
|
@ -1246,8 +1233,6 @@ test "pointer to tuple field can be dereferenced at comptime" {
|
|||
}
|
||||
|
||||
test "proper value is returned from labeled block" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn hash(v: *u32, key: anytype) void {
|
||||
const Key = @TypeOf(key);
|
||||
|
|
@ -1385,8 +1370,6 @@ test "allocation and looping over 3-byte integer" {
|
|||
}
|
||||
|
||||
test "loading array from struct is not optimized away" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
arr: [1]u32 = .{0},
|
||||
fn doTheTest(self: *@This()) !void {
|
||||
|
|
|
|||
|
|
@ -250,7 +250,6 @@ test "bitcast packed struct to integer and back" {
|
|||
test "implicit cast to error union by returning" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry() !void {
|
||||
|
|
@ -280,8 +279,6 @@ test "comptime bitcast used in expression has the correct type" {
|
|||
}
|
||||
|
||||
test "bitcast passed as tuple element" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo(args: anytype) !void {
|
||||
comptime assert(@TypeOf(args[0]) == f32);
|
||||
|
|
@ -292,8 +289,6 @@ test "bitcast passed as tuple element" {
|
|||
}
|
||||
|
||||
test "triple level result location with bitcast sandwich passed as tuple element" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo(args: anytype) !void {
|
||||
comptime assert(@TypeOf(args[0]) == f64);
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ test "@byteSwap vectors u8" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try comptime vector8();
|
||||
try vector8();
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ var result: []const u8 = "wrong";
|
|||
|
||||
test "pass string literal byvalue to a generic var param" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
start();
|
||||
|
|
|
|||
|
|
@ -60,7 +60,6 @@ test "tuple parameters" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const add = struct {
|
||||
fn add(a: i32, b: i32) i32 {
|
||||
|
|
@ -94,7 +93,6 @@ test "result location of function call argument through runtime condition and st
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const E = enum { a, b };
|
||||
const S = struct {
|
||||
|
|
@ -411,7 +409,6 @@ test "recursive inline call with comptime known argument" {
|
|||
test "inline while with @call" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn inc(a: *u32) void {
|
||||
|
|
@ -427,8 +424,6 @@ test "inline while with @call" {
|
|||
}
|
||||
|
||||
test "method call as parameter type" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo(x: anytype, y: @TypeOf(x).Inner()) @TypeOf(y) {
|
||||
return y;
|
||||
|
|
@ -477,7 +472,6 @@ test "argument to generic function has correct result type" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo(_: anytype, e: enum { a, b }) bool {
|
||||
|
|
|
|||
|
|
@ -57,8 +57,6 @@ test "@intCast to comptime_int" {
|
|||
}
|
||||
|
||||
test "implicit cast comptime numbers to any type when the value fits" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a: u64 = 255;
|
||||
var b: u8 = a;
|
||||
_ = &b;
|
||||
|
|
@ -188,7 +186,6 @@ fn expectIntFromFloat(comptime F: type, f: F, comptime I: type, i: I) !void {
|
|||
test "implicitly cast indirect pointer to maybe-indirect pointer" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const Self = @This();
|
||||
|
|
@ -249,7 +246,6 @@ test "coerce undefined to optional" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(MakeType(void).getNull() == null);
|
||||
try expect(MakeType(void).getNonNull() != null);
|
||||
|
|
@ -270,7 +266,6 @@ fn MakeType(comptime T: type) type {
|
|||
test "implicit cast from *[N]T to [*c]T" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: [4]u16 = [4]u16{ 0, 1, 2, 3 };
|
||||
var y: [*c]u16 = &x;
|
||||
|
|
@ -347,7 +342,6 @@ test "array coercion to undefined at runtime" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
@setRuntimeSafety(true);
|
||||
|
||||
|
|
@ -413,7 +407,6 @@ test "peer type unsigned int to signed" {
|
|||
test "expected [*c]const u8, found [*:0]const u8" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: [*:0]const u8 = "hello";
|
||||
_ = &a;
|
||||
|
|
@ -483,7 +476,6 @@ fn castToOptionalTypeError(z: i32) !void {
|
|||
test "implicitly cast from [0]T to anyerror![]T" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testCastZeroArrayToErrSliceMut();
|
||||
try comptime testCastZeroArrayToErrSliceMut();
|
||||
|
|
@ -501,7 +493,6 @@ test "peer type resolution: [0]u8, []const u8, and anyerror![]u8" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() anyerror!void {
|
||||
|
|
@ -558,7 +549,6 @@ fn testCastConstArrayRefToConstSlice() !void {
|
|||
test "peer type resolution: error and [N]T" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(mem.eql(u8, try testPeerErrorAndArray(0), "OK"));
|
||||
comptime assert(mem.eql(u8, try testPeerErrorAndArray(0), "OK"));
|
||||
|
|
@ -583,7 +573,6 @@ fn testPeerErrorAndArray2(x: u8) anyerror![]const u8 {
|
|||
test "single-item pointer of array to slice to unknown length pointer" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testCastPtrOfArrayToSliceAndPtr();
|
||||
try comptime testCastPtrOfArrayToSliceAndPtr();
|
||||
|
|
@ -841,7 +830,6 @@ test "peer cast *[0]T to E![]const T" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buffer: [5]u8 = "abcde".*;
|
||||
const buf: anyerror![]const u8 = buffer[0..];
|
||||
|
|
@ -857,7 +845,6 @@ test "peer cast *[0]T to []const T" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buffer: [5]u8 = "abcde".*;
|
||||
const buf: []const u8 = buffer[0..];
|
||||
|
|
@ -881,7 +868,6 @@ test "peer resolution of string literals" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const E = enum { a, b, c, d };
|
||||
|
|
@ -903,7 +889,6 @@ test "peer resolution of string literals" {
|
|||
test "peer cast [:x]T to []T" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -920,7 +905,6 @@ test "peer cast [:x]T to []T" {
|
|||
test "peer cast [N:x]T to [N]T" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -937,7 +921,6 @@ test "peer cast [N:x]T to [N]T" {
|
|||
test "peer cast *[N:x]T to *[N]T" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -995,7 +978,6 @@ test "peer cast [:x]T to [*:x]T" {
|
|||
test "peer type resolution implicit cast to return type" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -1016,7 +998,6 @@ test "peer type resolution implicit cast to return type" {
|
|||
test "peer type resolution implicit cast to variable type" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -1060,7 +1041,6 @@ test "cast between C pointer with different but compatible types" {
|
|||
test "peer type resolve string lit with sentinel-terminated mutable slice" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var array: [4:0]u8 = undefined;
|
||||
array[4] = 0; // TODO remove this when #4372 is solved
|
||||
|
|
@ -1127,7 +1107,6 @@ test "implicit cast from [*]T to ?*anyopaque" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a = [_]u8{ 3, 2, 1 };
|
||||
var runtime_zero: usize = 0;
|
||||
|
|
@ -1158,7 +1137,6 @@ fn foobar(func: PFN_void) !void {
|
|||
|
||||
test "cast function with an opaque parameter" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
if (builtin.zig_backend == .stage2_c) {
|
||||
// https://github.com/ziglang/zig/issues/16845
|
||||
|
|
@ -1191,7 +1169,6 @@ test "implicit ptr to *anyopaque" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: u32 = 1;
|
||||
const ptr: *align(@alignOf(u32)) anyopaque = &a;
|
||||
|
|
@ -1205,7 +1182,6 @@ test "implicit ptr to *anyopaque" {
|
|||
test "return null from fn () anyerror!?&T" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = returnNullFromOptionalTypeErrorRef();
|
||||
const b = returnNullLitFromOptionalTypeErrorRef();
|
||||
|
|
@ -1296,7 +1272,6 @@ test "implicit cast from *T to ?*anyopaque" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: u8 = 1;
|
||||
incrementVoidPtrValue(&a);
|
||||
|
|
@ -1310,7 +1285,6 @@ fn incrementVoidPtrValue(value: ?*anyopaque) void {
|
|||
test "implicit cast *[0]T to E![]const u8" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x = @as(anyerror![]const u8, &[0]u8{});
|
||||
_ = &x;
|
||||
|
|
@ -1332,7 +1306,6 @@ test "*const [N]null u8 to ?[]const u8" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -1369,7 +1342,6 @@ test "assignment to optional pointer result loc" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct };
|
||||
_ = &foo;
|
||||
|
|
@ -1377,7 +1349,6 @@ test "assignment to optional pointer result loc" {
|
|||
}
|
||||
|
||||
test "cast between *[N]void and []void" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
var a: [4]void = undefined;
|
||||
|
|
@ -1445,7 +1416,6 @@ test "peer type resolution: unreachable, null, slice" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest(num: usize, word: []const u8) !void {
|
||||
|
|
@ -1486,7 +1456,6 @@ test "cast compatible optional types" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: ?[:0]const u8 = null;
|
||||
_ = &a;
|
||||
|
|
@ -1497,7 +1466,6 @@ test "cast compatible optional types" {
|
|||
test "coerce undefined single-item pointer of array to error union of slice" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = @as([*]u8, undefined)[0..0];
|
||||
var b: error{a}![]const u8 = a;
|
||||
|
|
@ -1600,7 +1568,6 @@ test "bitcast packed struct with u0" {
|
|||
|
||||
test "optional pointer coerced to optional allowzero pointer" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var p: ?*u32 = undefined;
|
||||
var q: ?*allowzero u32 = undefined;
|
||||
|
|
@ -1617,8 +1584,6 @@ test "optional slice coerced to allowzero many pointer" {
|
|||
}
|
||||
|
||||
test "optional slice passed as parameter coerced to allowzero many pointer" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const ns = struct {
|
||||
const Color = struct {
|
||||
r: u8,
|
||||
|
|
@ -1638,8 +1603,6 @@ test "optional slice passed as parameter coerced to allowzero many pointer" {
|
|||
}
|
||||
|
||||
test "single item pointer to pointer to array to slice" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: i32 = 1234;
|
||||
try expect(@as([]const i32, @as(*[1]i32, &x))[0] == 1234);
|
||||
const z1 = @as([]const i32, @as(*[1]i32, &x));
|
||||
|
|
@ -1682,8 +1645,6 @@ test "@volatileCast without a result location" {
|
|||
}
|
||||
|
||||
test "coercion from single-item pointer to @as to slice" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: u32 = 1;
|
||||
|
||||
// Why the following line gets a compile error?
|
||||
|
|
@ -1696,7 +1657,6 @@ test "peer type resolution: const sentinel slice and mutable non-sentinel slice"
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest(comptime T: type, comptime s: T) !void {
|
||||
|
|
@ -1727,7 +1687,6 @@ test "peer type resolution: float and comptime-known fixed-width integer" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const i: u8 = 100;
|
||||
var f: f32 = 1.234;
|
||||
|
|
@ -1750,7 +1709,6 @@ test "peer type resolution: same array type with sentinel" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: [2:0]u32 = .{ 0, 1 };
|
||||
var b: [2:0]u32 = .{ 2, 3 };
|
||||
|
|
@ -1773,7 +1731,6 @@ test "peer type resolution: array with sentinel and array without sentinel" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: [2:0]u32 = .{ 0, 1 };
|
||||
var b: [2]u32 = .{ 2, 3 };
|
||||
|
|
@ -1843,7 +1800,6 @@ test "peer type resolution: error union and optional of same type" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const E = error{Foo};
|
||||
var a: E!*u8 = error.Foo;
|
||||
|
|
@ -1867,7 +1823,6 @@ test "peer type resolution: C pointer and @TypeOf(null)" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: [*c]c_int = 0x1000;
|
||||
_ = &a;
|
||||
|
|
@ -1981,7 +1936,6 @@ test "peer type resolution: array and tuple" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var arr: [3]i32 = .{ 1, 2, 3 };
|
||||
_ = &arr;
|
||||
|
|
@ -2116,7 +2070,6 @@ test "peer type resolution: tuple pointer and optional slice" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
// Miscompilation on Intel's OpenCL CPU runtime.
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // flaky
|
||||
|
||||
|
|
@ -2209,7 +2162,6 @@ test "peer type resolution: tuples with comptime fields" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = .{ 1, 2 };
|
||||
const b = .{ @as(u32, 3), @as(i16, 4) };
|
||||
|
|
@ -2241,7 +2193,6 @@ test "peer type resolution: C pointer and many pointer" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buf = "hello".*;
|
||||
|
||||
|
|
@ -2309,7 +2260,6 @@ test "peer type resolution: arrays of compatible types" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var e0: u8 = 3;
|
||||
var e1: u8 = 2;
|
||||
|
|
@ -2365,7 +2315,6 @@ test "cast builtins can wrap result in error union" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const MyEnum = enum(u32) { _ };
|
||||
|
|
@ -2404,7 +2353,6 @@ test "cast builtins can wrap result in error union and optional" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const MyEnum = enum(u32) { _ };
|
||||
|
|
@ -2600,7 +2548,6 @@ test "@intFromBool on vector" {
|
|||
|
||||
test "numeric coercions with undefined" {
|
||||
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const from: i32 = undefined;
|
||||
var to: f32 = from;
|
||||
|
|
@ -2624,7 +2571,6 @@ test "@as does not corrupt values with incompatible representations" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const x: f32 = @as(f16, blk: {
|
||||
if (false) {
|
||||
|
|
|
|||
|
|
@ -408,8 +408,6 @@ test "mutate entire slice at comptime" {
|
|||
}
|
||||
|
||||
test "dereference undefined pointer to zero-bit type" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const p0: *void = undefined;
|
||||
try testing.expectEqual({}, p0.*);
|
||||
|
||||
|
|
@ -515,7 +513,5 @@ fn fieldPtrTest() u32 {
|
|||
return a.value;
|
||||
}
|
||||
test "pointer in aggregate field can mutate comptime state" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try comptime std.testing.expect(fieldPtrTest() == 2);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -116,7 +116,6 @@ test "errdefer with payload" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo() !i32 {
|
||||
|
|
@ -139,7 +138,6 @@ test "reference to errdefer payload" {
|
|||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo() !i32 {
|
||||
|
|
@ -162,7 +160,6 @@ test "reference to errdefer payload" {
|
|||
test "simple else prong doesn't emit an error for unreachable else prong" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo() error{Foo}!void {
|
||||
|
|
|
|||
|
|
@ -48,8 +48,6 @@ test "empty extern union" {
|
|||
}
|
||||
|
||||
test "empty union passed as argument" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const U = union(enum) {
|
||||
fn f(u: @This()) void {
|
||||
switch (u) {}
|
||||
|
|
@ -59,8 +57,6 @@ test "empty union passed as argument" {
|
|||
}
|
||||
|
||||
test "empty enum passed as argument" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const E = enum {
|
||||
fn f(e: @This()) void {
|
||||
switch (e) {}
|
||||
|
|
|
|||
|
|
@ -610,7 +610,6 @@ fn testEnumWithSpecifiedTagValues(x: MultipleChoice) !void {
|
|||
test "enum with specified tag values" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testEnumWithSpecifiedTagValues(MultipleChoice.C);
|
||||
try comptime testEnumWithSpecifiedTagValues(MultipleChoice.C);
|
||||
|
|
@ -684,7 +683,6 @@ test "empty non-exhaustive enum" {
|
|||
test "single field non-exhaustive enum" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const E = enum(u8) { a, _ };
|
||||
|
|
@ -749,7 +747,6 @@ test "cast integer literal to enum" {
|
|||
test "enum with specified and unspecified tag values" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testEnumWithSpecifiedAndUnspecifiedTagValues(MultipleChoice2.D);
|
||||
try comptime testEnumWithSpecifiedAndUnspecifiedTagValues(MultipleChoice2.D);
|
||||
|
|
@ -858,8 +855,6 @@ fn doALoopThing(id: EnumWithOneMember) void {
|
|||
}
|
||||
|
||||
test "comparison operator on enum with one member is comptime-known" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
doALoopThing(EnumWithOneMember.Eof);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@ fn shouldBeNotEqual(a: anyerror, b: anyerror) void {
|
|||
|
||||
test "error binary operator" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = errBinaryOperatorG(true) catch 3;
|
||||
const b = errBinaryOperatorG(false) catch 3;
|
||||
|
|
@ -63,14 +62,12 @@ pub fn baz() anyerror!i32 {
|
|||
|
||||
test "error wrapping" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect((baz() catch unreachable) == 15);
|
||||
}
|
||||
|
||||
test "unwrap simple value from error" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const i = unwrapSimpleValueFromErrorDo() catch unreachable;
|
||||
try expect(i == 13);
|
||||
|
|
@ -81,7 +78,6 @@ fn unwrapSimpleValueFromErrorDo() anyerror!isize {
|
|||
|
||||
test "error return in assignment" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
doErrReturnInAssignment() catch unreachable;
|
||||
}
|
||||
|
|
@ -104,7 +100,6 @@ test "syntax: optional operator in front of error union operator" {
|
|||
test "widen cast integer payload of error union function call" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn errorable() !u64 {
|
||||
|
|
@ -129,7 +124,6 @@ test "debug info for optional error set" {
|
|||
|
||||
test "implicit cast to optional to error union to return result loc" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry() !void {
|
||||
|
|
@ -241,8 +235,6 @@ fn testExplicitErrorSetCast(set1: Set1) !void {
|
|||
}
|
||||
|
||||
test "@errorCast on error unions" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
{
|
||||
|
|
@ -270,7 +262,6 @@ test "@errorCast on error unions" {
|
|||
|
||||
test "comptime test error for empty error set" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testComptimeTestErrorEmptySet(1234);
|
||||
try comptime testComptimeTestErrorEmptySet(1234);
|
||||
|
|
@ -306,8 +297,6 @@ test "inferred empty error set comptime catch" {
|
|||
}
|
||||
|
||||
test "error inference with an empty set" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const Struct = struct {
|
||||
pub fn func() (error{})!usize {
|
||||
|
|
@ -362,7 +351,6 @@ fn quux_1() !i32 {
|
|||
|
||||
test "error: Zero sized error set returned with value payload crash" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
_ = try foo3(0);
|
||||
_ = try comptime foo3(0);
|
||||
|
|
@ -376,7 +364,6 @@ fn foo3(b: usize) Error!usize {
|
|||
test "error: Infer error set from literals" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
_ = nullLiteral("n") catch |err| handleErrors(err);
|
||||
_ = floatLiteral("n") catch |err| handleErrors(err);
|
||||
|
|
@ -498,7 +485,6 @@ test "optional error set is the same size as error set" {
|
|||
test "nested catch" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry() !void {
|
||||
|
|
@ -524,7 +510,6 @@ test "nested catch" {
|
|||
test "function pointer with return type that is error union with payload which is pointer of parent struct" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const Foo = struct {
|
||||
|
|
@ -582,7 +567,6 @@ test "error payload type is correctly resolved" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const MyIntWrapper = struct {
|
||||
const Self = @This();
|
||||
|
|
@ -755,7 +739,6 @@ test "ret_ptr doesn't cause own inferred error set to be resolved" {
|
|||
|
||||
test "simple else prong allowed even when all errors handled" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo() !u8 {
|
||||
|
|
@ -873,7 +856,6 @@ test "alignment of wrapping an error union payload" {
|
|||
|
||||
test "compare error union and error set" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: anyerror = error.Foo;
|
||||
var b: anyerror!u32 = error.Bar;
|
||||
|
|
@ -1039,7 +1021,6 @@ test "function called at runtime is properly analyzed for inferred error set" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo() !void {
|
||||
|
|
@ -1063,7 +1044,6 @@ test "generic type constructed from inferred error set of unresolved function" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn write(_: void, bytes: []const u8) !usize {
|
||||
|
|
@ -1079,8 +1059,6 @@ test "generic type constructed from inferred error set of unresolved function" {
|
|||
}
|
||||
|
||||
test "errorCast to adhoc inferred error set" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
inline fn baz() !i32 {
|
||||
return @errorCast(err());
|
||||
|
|
@ -1093,8 +1071,6 @@ test "errorCast to adhoc inferred error set" {
|
|||
}
|
||||
|
||||
test "errorCast from error sets to error unions" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const err_union: Set1!void = @errorCast(error.A);
|
||||
try expectError(error.A, err_union);
|
||||
}
|
||||
|
|
@ -1103,8 +1079,8 @@ test "result location initialization of error union with OPV payload" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
x: u0,
|
||||
|
|
|
|||
|
|
@ -73,7 +73,6 @@ fn constExprEvalOnSingleExprBlocksFn(x: i32, b: bool) i32 {
|
|||
test "constant expressions" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var array: [array_size]u8 = undefined;
|
||||
_ = &array;
|
||||
|
|
@ -506,7 +505,6 @@ test "comptime shlWithOverflow" {
|
|||
test "const ptr to variable data changes at runtime" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(foo_ref.name[0] == 'a');
|
||||
foo_ref.name = "b";
|
||||
|
|
@ -549,7 +547,6 @@ test "static eval list init" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(static_vec3.data[2] == 1.0);
|
||||
try expect(vec3(0.0, 0.0, 3.0).data[2] == 3.0);
|
||||
|
|
@ -721,8 +718,6 @@ fn loopNTimes(comptime n: usize) void {
|
|||
}
|
||||
|
||||
test "variable inside inline loop that has different types on different iterations" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testVarInsideInlineLoop(.{ true, @as(u32, 42) });
|
||||
}
|
||||
|
||||
|
|
@ -746,7 +741,6 @@ test "array concatenation of function calls" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a = oneItem(3) ++ oneItem(4);
|
||||
try expect(std.mem.eql(i32, &a, &[_]i32{ 3, 4 }));
|
||||
|
|
@ -756,7 +750,6 @@ test "array multiplication of function calls" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a = oneItem(3) ** scalar(2);
|
||||
try expect(std.mem.eql(i32, &a, &[_]i32{ 3, 3 }));
|
||||
|
|
@ -774,7 +767,6 @@ test "array concatenation peer resolves element types - value" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a = [2]u3{ 1, 7 };
|
||||
var b = [3]u8{ 200, 225, 255 };
|
||||
|
|
@ -1088,7 +1080,6 @@ test "comptime break operand passing through runtime condition converted to runt
|
|||
test "comptime break operand passing through runtime switch converted to runtime break" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest(runtime: u8) !void {
|
||||
|
|
@ -1556,7 +1547,6 @@ test "non-optional and optional array elements concatenated" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const array = [1]u8{'A'} ++ [1]?u8{null};
|
||||
var index: usize = 0;
|
||||
|
|
@ -1631,8 +1621,6 @@ test "struct in comptime false branch is not evaluated" {
|
|||
}
|
||||
|
||||
test "result of nested switch assigned to variable" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var zds: u32 = 0;
|
||||
zds = switch (zds) {
|
||||
0 => switch (zds) {
|
||||
|
|
@ -1647,8 +1635,6 @@ test "result of nested switch assigned to variable" {
|
|||
}
|
||||
|
||||
test "inline for loop of functions returning error unions" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const T1 = struct {
|
||||
fn v() error{}!usize {
|
||||
return 1;
|
||||
|
|
@ -1667,8 +1653,6 @@ test "inline for loop of functions returning error unions" {
|
|||
}
|
||||
|
||||
test "if inside a switch" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var condition = true;
|
||||
var wave_type: u32 = 0;
|
||||
_ = .{ &condition, &wave_type };
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@ test "function extern symbol" {
|
|||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = @extern(*const fn () callconv(.C) i32, .{ .name = "a_mystery_function" });
|
||||
try expect(a() == 4567);
|
||||
|
|
@ -34,7 +33,6 @@ test "function extern symbol matches extern decl" {
|
|||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
extern fn another_mystery_function() u32;
|
||||
|
|
|
|||
|
|
@ -22,8 +22,6 @@ test "add f16" {
|
|||
}
|
||||
|
||||
test "add f32/f64" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testAdd(f32);
|
||||
try comptime testAdd(f32);
|
||||
try testAdd(f64);
|
||||
|
|
@ -60,8 +58,6 @@ test "sub f16" {
|
|||
}
|
||||
|
||||
test "sub f32/f64" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testSub(f32);
|
||||
try comptime testSub(f32);
|
||||
try testSub(f64);
|
||||
|
|
@ -98,8 +94,6 @@ test "mul f16" {
|
|||
}
|
||||
|
||||
test "mul f32/f64" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testMul(f32);
|
||||
try comptime testMul(f32);
|
||||
try testMul(f64);
|
||||
|
|
@ -1005,7 +999,6 @@ test "@abs f32/f64" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testFabs(f32);
|
||||
try comptime testFabs(f32);
|
||||
|
|
@ -1622,7 +1615,6 @@ test "comptime inf >= runtime 1" {
|
|||
test "comptime isNan(nan * 1)" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const nan_times_one = comptime std.math.nan(f64) * 1;
|
||||
try std.testing.expect(std.math.isNan(nan_times_one));
|
||||
|
|
@ -1630,7 +1622,6 @@ test "comptime isNan(nan * 1)" {
|
|||
test "runtime isNan(nan * 1)" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const nan_times_one = std.math.nan(f64) * 1;
|
||||
try std.testing.expect(std.math.isNan(nan_times_one));
|
||||
|
|
@ -1638,7 +1629,6 @@ test "runtime isNan(nan * 1)" {
|
|||
test "comptime isNan(nan * 0)" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const nan_times_zero = comptime std.math.nan(f64) * 0;
|
||||
try std.testing.expect(std.math.isNan(nan_times_zero));
|
||||
|
|
@ -1648,7 +1638,6 @@ test "comptime isNan(nan * 0)" {
|
|||
test "runtime isNan(nan * 0)" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const nan_times_zero = std.math.nan(f64) * 0;
|
||||
try std.testing.expect(std.math.isNan(nan_times_zero));
|
||||
|
|
@ -1658,7 +1647,6 @@ test "runtime isNan(nan * 0)" {
|
|||
test "comptime isNan(inf * 0)" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const inf_times_zero = comptime std.math.inf(f64) * 0;
|
||||
try std.testing.expect(std.math.isNan(inf_times_zero));
|
||||
|
|
@ -1668,7 +1656,6 @@ test "comptime isNan(inf * 0)" {
|
|||
test "runtime isNan(inf * 0)" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const inf_times_zero = std.math.inf(f64) * 0;
|
||||
try std.testing.expect(std.math.isNan(inf_times_zero));
|
||||
|
|
|
|||
|
|
@ -71,7 +71,6 @@ fn outer(y: u32) *const fn (u32) u32 {
|
|||
|
||||
test "return inner function which references comptime variable of outer function" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const func = outer(10);
|
||||
try expect(func(3) == 7);
|
||||
|
|
@ -81,7 +80,6 @@ test "discard the result of a function that returns a struct" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry() void {
|
||||
|
|
@ -106,7 +104,6 @@ test "inline function call that calls optional function pointer, return pointer
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
field: u32,
|
||||
|
|
@ -191,7 +188,6 @@ test "function with complex callconv and return type expressions" {
|
|||
|
||||
test "pass by non-copying value" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(addPointCoords(Point{ .x = 1, .y = 2 }) == 3);
|
||||
}
|
||||
|
|
@ -207,7 +203,6 @@ fn addPointCoords(pt: Point) i32 {
|
|||
|
||||
test "pass by non-copying value through var arg" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect((try addPointCoordsVar(Point{ .x = 1, .y = 2 })) == 3);
|
||||
}
|
||||
|
|
@ -219,7 +214,6 @@ fn addPointCoordsVar(pt: anytype) !i32 {
|
|||
|
||||
test "pass by non-copying value as method" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var pt = Point2{ .x = 1, .y = 2 };
|
||||
try expect(pt.addPointCoords() == 3);
|
||||
|
|
@ -236,7 +230,6 @@ const Point2 = struct {
|
|||
|
||||
test "pass by non-copying value as method, which is generic" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var pt = Point3{ .x = 1, .y = 2 };
|
||||
try expect(pt.addPointCoords(i32) == 3);
|
||||
|
|
@ -265,7 +258,6 @@ test "implicit cast fn call result to optional in field result" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry() !void {
|
||||
|
|
@ -292,7 +284,6 @@ test "implicit cast fn call result to optional in field result" {
|
|||
test "void parameters" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try voidFun(1, void{}, 2, {});
|
||||
}
|
||||
|
|
@ -356,7 +347,6 @@ test "function call with anon list literal" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -377,7 +367,6 @@ test "function call with anon list literal - 2D" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -414,8 +403,6 @@ test "ability to give comptime types and non comptime types to same parameter" {
|
|||
}
|
||||
|
||||
test "function with inferred error set but returning no error" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo() !void {}
|
||||
};
|
||||
|
|
@ -426,7 +413,6 @@ test "function with inferred error set but returning no error" {
|
|||
|
||||
test "import passed byref to function in return type" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn get() @import("std").ArrayListUnmanaged(i32) {
|
||||
|
|
@ -485,7 +471,6 @@ test "method call with optional and error union first param" {
|
|||
test "method call with optional pointer first param" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
x: i32 = 1234,
|
||||
|
|
@ -505,7 +490,6 @@ test "using @ptrCast on function pointers" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const A = struct { data: [4]u8 };
|
||||
|
|
@ -543,7 +527,6 @@ test "function returns function returning type" {
|
|||
|
||||
test "peer type resolution of inferred error set with non-void payload" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn openDataFile(mode: enum { read, write }) !u32 {
|
||||
|
|
@ -586,8 +569,6 @@ test "lazy values passed to anytype parameter" {
|
|||
}
|
||||
|
||||
test "pass and return comptime-only types" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn returnNull(comptime x: @Type(.Null)) @Type(.Null) {
|
||||
return x;
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@ fn custom(comptime T: type, comptime num: u64) fn (T) u64 {
|
|||
test "fn delegation" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const foo = Foo{};
|
||||
try expect(foo.one() == 11);
|
||||
|
|
|
|||
|
|
@ -69,7 +69,6 @@ test "basic for loop" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const expected_result = [_]u8{ 9, 8, 7, 6, 0, 1, 2, 3 } ** 3;
|
||||
|
||||
|
|
@ -134,7 +133,6 @@ test "for with null and T peer types and inferred result location type" {
|
|||
test "2 break statements and an else" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry(t: bool, f: bool) !void {
|
||||
|
|
@ -183,7 +181,6 @@ fn mangleString(s: []u8) void {
|
|||
test "for copies its payload" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -203,7 +200,6 @@ test "for on slice with allowzero ptr" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest(slice: []const u8) !void {
|
||||
|
|
@ -219,7 +215,6 @@ test "for on slice with allowzero ptr" {
|
|||
test "else continue outer for" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var i: usize = 6;
|
||||
var buf: [5]u8 = undefined;
|
||||
|
|
@ -283,7 +278,6 @@ test "two counters" {
|
|||
test "1-based counter and ptr to array" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var ok: usize = 0;
|
||||
|
||||
|
|
@ -317,7 +311,6 @@ test "slice and two counters, one is offset and one is runtime" {
|
|||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const slice: []const u8 = "blah";
|
||||
var start: usize = 0;
|
||||
|
|
@ -347,7 +340,6 @@ test "two slices, one captured by-ref" {
|
|||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buf: [10]u8 = undefined;
|
||||
const slice1: []const u8 = "blah";
|
||||
|
|
@ -367,7 +359,6 @@ test "raw pointer and slice" {
|
|||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buf: [10]u8 = undefined;
|
||||
const slice: []const u8 = "blah";
|
||||
|
|
@ -387,7 +378,6 @@ test "raw pointer and counter" {
|
|||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buf: [10]u8 = undefined;
|
||||
const ptr: [*]u8 = &buf;
|
||||
|
|
@ -406,7 +396,6 @@ test "inline for with slice as the comptime-known" {
|
|||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const comptime_slice = "hello";
|
||||
var runtime_i: usize = 3;
|
||||
|
|
@ -438,7 +427,6 @@ test "inline for with counter as the comptime-known" {
|
|||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var runtime_slice = "hello";
|
||||
var runtime_i: usize = 3;
|
||||
|
|
@ -471,7 +459,6 @@ test "inline for on tuple pointer" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct { u32, u32, u32 };
|
||||
var s: S = .{ 100, 200, 300 };
|
||||
|
|
@ -487,7 +474,6 @@ test "ref counter that starts at zero" {
|
|||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
for ([_]usize{ 0, 1, 2 }, 0..) |i, j| {
|
||||
try expectEqual(i, j);
|
||||
|
|
|
|||
|
|
@ -117,7 +117,6 @@ test "function with return type type" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var list: List(i32) = undefined;
|
||||
var list2: List(i32) = undefined;
|
||||
|
|
@ -159,7 +158,6 @@ test "generic fn with implicit cast" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(getFirstByte(u8, &[_]u8{13}) == 13);
|
||||
try expect(getFirstByte(u16, &[_]u16{
|
||||
|
|
@ -287,7 +285,6 @@ test "generic function instantiation turns into comptime call" {
|
|||
|
||||
test "generic function with void and comptime parameter" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct { x: i32 };
|
||||
const namespace = struct {
|
||||
|
|
@ -304,7 +301,6 @@ test "generic function with void and comptime parameter" {
|
|||
test "anonymous struct return type referencing comptime parameter" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
pub fn extraData(comptime T: type, index: usize) struct { data: T, end: usize } {
|
||||
|
|
@ -323,7 +319,6 @@ test "generic function instantiation non-duplicates" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.os.tag == .wasi) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
|
|
@ -395,7 +390,6 @@ test "extern function used as generic parameter" {
|
|||
|
||||
test "generic struct as parameter type" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest(comptime Int: type, thing: struct { int: Int }) !void {
|
||||
|
|
@ -436,7 +430,6 @@ test "null sentinel pointer passed as generic argument" {
|
|||
|
||||
test "generic function passed as comptime argument" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doMath(comptime f: fn (type, i32, i32) error{Overflow}!i32, a: i32, b: i32) !void {
|
||||
|
|
@ -449,7 +442,6 @@ test "generic function passed as comptime argument" {
|
|||
|
||||
test "return type of generic function is function pointer" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn b(comptime T: type) ?*const fn () error{}!T {
|
||||
|
|
@ -462,7 +454,6 @@ test "return type of generic function is function pointer" {
|
|||
|
||||
test "coerced function body has inequal value with its uncoerced body" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const A = B(i32, c);
|
||||
|
|
@ -547,7 +538,6 @@ test "call generic function with from function called by the generic function" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_llvm and
|
||||
builtin.cpu.arch == .aarch64 and builtin.os.tag == .windows) return error.SkipZigTest;
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ test "store to global array" {
|
|||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(pos[1] == 0.0);
|
||||
pos = [2]f32{ 0.0, 1.0 };
|
||||
|
|
@ -30,7 +29,6 @@ test "slices pointing at the same address as global array." {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const a = [_]u8{ 1, 2, 3 };
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ var global_with_err: anyerror!u32 = error.SomeError;
|
|||
|
||||
test "unwrap mutable global var" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
if (global_with_val) |v| {
|
||||
try expect(v == 0);
|
||||
|
|
@ -139,7 +138,6 @@ test "if-else expression with runtime condition result location is inferred opti
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const A = struct { b: u64, c: u64 };
|
||||
var d: bool = true;
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ fn foo(a: A) i32 {
|
|||
|
||||
test "incomplete struct param top level declaration" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = A{
|
||||
.b = B{
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ const builtin = @import("builtin");
|
|||
test "inline scalar prongs" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: usize = 0;
|
||||
switch (x) {
|
||||
|
|
@ -21,7 +20,6 @@ test "inline scalar prongs" {
|
|||
test "inline prong ranges" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: usize = 0;
|
||||
_ = &x;
|
||||
|
|
@ -37,7 +35,6 @@ const E = enum { a, b, c, d };
|
|||
test "inline switch enums" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: E = .a;
|
||||
_ = &x;
|
||||
|
|
@ -79,7 +76,6 @@ test "inline switch unions" {
|
|||
test "inline else bool" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a = true;
|
||||
_ = &a;
|
||||
|
|
@ -92,7 +88,6 @@ test "inline else bool" {
|
|||
test "inline else error" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const Err = error{ a, b, c };
|
||||
var a = Err.a;
|
||||
|
|
@ -106,7 +101,6 @@ test "inline else error" {
|
|||
test "inline else enum" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const E2 = enum(u8) { a = 2, b = 3, c = 4, d = 5 };
|
||||
var a: E2 = .a;
|
||||
|
|
@ -120,7 +114,6 @@ test "inline else enum" {
|
|||
test "inline else int with gaps" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: u8 = 0;
|
||||
_ = &a;
|
||||
|
|
@ -139,7 +132,6 @@ test "inline else int with gaps" {
|
|||
test "inline else int all values" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: u2 = 0;
|
||||
_ = &a;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ test "ir block deps" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect((foo(1) catch unreachable) == 0);
|
||||
try expect((foo(2) catch unreachable) == 0);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ test "strlit to vector" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const strlit = "0123456789abcdef0123456789ABCDEF";
|
||||
const vec_from_strlit: @Vector(32, u8) = strlit.*;
|
||||
|
|
|
|||
|
|
@ -236,7 +236,6 @@ test "float equality" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const x: f64 = 0.012;
|
||||
const y: f64 = x + 1.0;
|
||||
|
|
@ -593,8 +592,6 @@ fn testSignedWrappingEval(x: i32) !void {
|
|||
}
|
||||
|
||||
test "signed negation wrapping" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testSignedNegationWrappingEval(minInt(i16));
|
||||
try comptime testSignedNegationWrappingEval(minInt(i16));
|
||||
}
|
||||
|
|
@ -605,8 +602,6 @@ fn testSignedNegationWrappingEval(x: i16) !void {
|
|||
}
|
||||
|
||||
test "unsigned negation wrapping" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testUnsignedNegationWrappingEval(1);
|
||||
try comptime testUnsignedNegationWrappingEval(1);
|
||||
}
|
||||
|
|
@ -667,8 +662,6 @@ test "bit shift a u1" {
|
|||
}
|
||||
|
||||
test "truncating shift right" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testShrTrunc(maxInt(u16));
|
||||
try comptime testShrTrunc(maxInt(u16));
|
||||
}
|
||||
|
|
@ -1436,8 +1429,6 @@ test "quad hex float literal parsing accurate" {
|
|||
}
|
||||
|
||||
test "truncating shift left" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testShlTrunc(maxInt(u16));
|
||||
try comptime testShlTrunc(maxInt(u16));
|
||||
}
|
||||
|
|
@ -1460,8 +1451,6 @@ fn testShlExact(x: u8) !void {
|
|||
}
|
||||
|
||||
test "exact shift right" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testShrExact(0b10110100);
|
||||
try comptime testShrExact(0b10110100);
|
||||
}
|
||||
|
|
@ -1471,8 +1460,6 @@ fn testShrExact(x: u8) !void {
|
|||
}
|
||||
|
||||
test "shift left/right on u0 operand" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
var x: u0 = 0;
|
||||
|
|
@ -1821,7 +1808,6 @@ test "absFloat" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testAbsFloat();
|
||||
try comptime testAbsFloat();
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@ test "standard field calls" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(HasFuncs.one(0) == 1);
|
||||
try expect(HasFuncs.two(0) == 2);
|
||||
|
|
@ -76,7 +75,6 @@ test "@field field calls" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(@field(HasFuncs, "one")(0) == 1);
|
||||
try expect(@field(HasFuncs, "two")(0) == 2);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ test "@memset on array pointers" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testMemsetArray();
|
||||
try comptime testMemsetArray();
|
||||
|
|
@ -73,7 +72,6 @@ test "memset with bool element" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buf: [5]bool = undefined;
|
||||
@memset(&buf, true);
|
||||
|
|
@ -86,7 +84,6 @@ test "memset with 1-byte struct element" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct { x: bool };
|
||||
var buf: [5]S = undefined;
|
||||
|
|
@ -100,7 +97,6 @@ test "memset with 1-byte array element" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const A = [1]bool;
|
||||
var buf: [5]A = undefined;
|
||||
|
|
@ -170,7 +166,6 @@ test "zero keys with @memset" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const Keys = struct {
|
||||
up: bool,
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ fn foo() C!void {
|
|||
|
||||
test "merge error sets" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
if (foo()) {
|
||||
@panic("unexpected");
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ test "nan memory equality" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
// signaled
|
||||
try testing.expect(mem.eql(u8, mem.asBytes(&snan_u16), mem.asBytes(&snan_f16)));
|
||||
|
|
|
|||
|
|
@ -85,7 +85,6 @@ fn testTestNullRuntime(x: ?i32) !void {
|
|||
test "optional void" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try optionalVoidImpl();
|
||||
try comptime optionalVoidImpl();
|
||||
|
|
@ -109,7 +108,6 @@ const Empty = struct {};
|
|||
test "optional struct{}" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
_ = try optionalEmptyStructImpl();
|
||||
_ = try comptime optionalEmptyStructImpl();
|
||||
|
|
@ -135,7 +133,6 @@ test "null with default unwrap" {
|
|||
|
||||
test "optional pointer to 0 bit type null value at runtime" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const EmptyStruct = struct {};
|
||||
var x: ?*EmptyStruct = null;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ pub const EmptyStruct = struct {};
|
|||
|
||||
test "optional pointer to size zero struct" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var e = EmptyStruct{};
|
||||
const o: ?*EmptyStruct = &e;
|
||||
|
|
@ -60,7 +59,6 @@ fn testNullPtrsEql() !void {
|
|||
test "optional with zero-bit type" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
|
|
@ -241,7 +239,6 @@ test "compare optionals with modified payloads" {
|
|||
test "unwrap function call with optional pointer return value" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry() !void {
|
||||
|
|
@ -373,7 +370,6 @@ test "0-bit child type coerced to optional return ptr result location" {
|
|||
test "0-bit child type coerced to optional" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -492,7 +488,6 @@ const NoReturn = struct {
|
|||
|
||||
test "optional of noreturn used with if" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
NoReturn.a = 64;
|
||||
if (NoReturn.loop()) |_| {
|
||||
|
|
@ -504,7 +499,6 @@ test "optional of noreturn used with if" {
|
|||
|
||||
test "optional of noreturn used with orelse" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
NoReturn.a = 64;
|
||||
const val = NoReturn.testOrelse();
|
||||
|
|
@ -601,7 +595,6 @@ test "cast slice to const slice nested in error union and optional" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn inner() !?[]u8 {
|
||||
|
|
@ -615,8 +608,6 @@ test "cast slice to const slice nested in error union and optional" {
|
|||
}
|
||||
|
||||
test "variable of optional of noreturn" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var null_opv: ?noreturn = null;
|
||||
_ = &null_opv;
|
||||
try std.testing.expectEqual(@as(?noreturn, null), null_opv);
|
||||
|
|
@ -641,7 +632,6 @@ test "result location initialization of optional with OPV payload" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
|
|
|
|||
|
|
@ -238,7 +238,6 @@ test "regular in irregular packed struct" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const Irregular = packed struct {
|
||||
bar: Regular = Regular{},
|
||||
|
|
@ -494,7 +493,6 @@ test "@intFromPtr on a packed struct field" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (native_endian != .little) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
|
|
@ -518,7 +516,6 @@ test "@intFromPtr on a packed struct field unaligned and nested" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (native_endian != .little) return error.SkipZigTest; // Byte aligned packed struct field pointers have not been implemented yet
|
||||
|
||||
const S1 = packed struct {
|
||||
|
|
@ -1191,7 +1188,6 @@ test "packed struct field pointer aligned properly" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const Foo = packed struct {
|
||||
a: i32,
|
||||
|
|
|
|||
|
|
@ -174,7 +174,6 @@ test "implicit cast error unions with non-optional to optional pointer" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -202,7 +201,6 @@ test "allowzero pointer and slice" {
|
|||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var ptr: [*]allowzero i32 = @ptrFromInt(0);
|
||||
const opt_ptr: ?[*]allowzero i32 = ptr;
|
||||
|
|
@ -222,7 +220,6 @@ test "assign null directly to C pointer and test null equality" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: [*c]i32 = null;
|
||||
_ = &x;
|
||||
|
|
@ -442,7 +439,6 @@ test "indexing array with sentinel returns correct type" {
|
|||
test "element pointer to slice" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -490,7 +486,6 @@ test "element pointer arithmetic to slice" {
|
|||
|
||||
test "array slicing to slice" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -541,7 +536,6 @@ test "pointer alignment and element type include call expression" {
|
|||
|
||||
test "pointer to array has explicit alignment" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const Base = extern struct { a: u8 };
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ const std = @import("std");
|
|||
|
||||
test "@prefetch()" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: [2]u32 = .{ 42, 42 };
|
||||
var a_len = a.len;
|
||||
|
|
|
|||
|
|
@ -58,7 +58,6 @@ fn testReinterpretStructWrappedBytesAsInteger() !void {
|
|||
test "reinterpret bytes of an array into an extern struct" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testReinterpretBytesAsExternStruct();
|
||||
try comptime testReinterpretBytesAsExternStruct();
|
||||
|
|
@ -233,7 +232,6 @@ test "implicit optional pointer to optional anyopaque pointer" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buf: [4]u8 = "aoeu".*;
|
||||
const x: ?[*]u8 = &buf;
|
||||
|
|
@ -246,7 +244,6 @@ test "@ptrCast slice to slice" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo(slice: []u32) []i32 {
|
||||
|
|
|
|||
|
|
@ -3,8 +3,6 @@ const builtin = @import("builtin");
|
|||
const expectEqual = std.testing.expectEqual;
|
||||
|
||||
test "casting integer address to function pointer" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
addressToFunction();
|
||||
comptime addressToFunction();
|
||||
}
|
||||
|
|
@ -19,7 +17,6 @@ test "mutate through ptr initialized with constant ptrFromInt value" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
forceCompilerAnalyzeBranchHardCodedPtrDereference(false);
|
||||
}
|
||||
|
|
@ -37,7 +34,6 @@ test "@ptrFromInt creates null pointer" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const ptr = @as(?*u32, @ptrFromInt(0));
|
||||
try expectEqual(@as(?*u32, null), ptr);
|
||||
|
|
@ -47,7 +43,6 @@ test "@ptrFromInt creates allowzero zero pointer" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const ptr = @as(*allowzero u32, @ptrFromInt(0));
|
||||
try expectEqual(@as(usize, 0), @intFromPtr(ptr));
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ test "reference a variable in an if after an if in the 2nd switch prong" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try foo(true, Num.Two, false, "aoeu");
|
||||
try expect(!ok);
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ test "return address" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
_ = retAddr();
|
||||
// TODO: #14938
|
||||
|
|
|
|||
|
|
@ -81,7 +81,6 @@ const P = packed struct {
|
|||
test "@offsetOf" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
// Packed structs have fixed memory layout
|
||||
try expect(@offsetOf(P, "a") == 0);
|
||||
|
|
@ -158,7 +157,6 @@ test "@TypeOf() has no runtime side effects" {
|
|||
|
||||
test "branching logic inside @TypeOf" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
var data: i32 = 0;
|
||||
|
|
@ -273,7 +271,6 @@ test "runtime instructions inside typeof in comptime only scope" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
{
|
||||
var y: i8 = 2;
|
||||
|
|
@ -330,7 +327,6 @@ test "peer type resolution with @TypeOf doesn't trigger dependency loop check" {
|
|||
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const T = struct {
|
||||
next: @TypeOf(null, @as(*const @This(), undefined)),
|
||||
|
|
@ -412,7 +408,6 @@ test "Extern function calls, dereferences and field access in @TypeOf" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const Test = struct {
|
||||
fn test_fn_1(a: c_long) @TypeOf(c_fopen("test", "r").*) {
|
||||
|
|
|
|||
|
|
@ -67,7 +67,6 @@ test "comptime slice of undefined pointer of length 0" {
|
|||
|
||||
test "implicitly cast array of size 0 to slice" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var msg = [_]u8{};
|
||||
try assertLenIsZero(&msg);
|
||||
|
|
@ -124,7 +123,6 @@ test "slice of type" {
|
|||
|
||||
test "generic malloc free" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const a = memAlloc(u8, 10) catch unreachable;
|
||||
memFree(u8, a);
|
||||
|
|
@ -186,8 +184,6 @@ test "slicing zero length array" {
|
|||
}
|
||||
|
||||
test "slicing pointer by length" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const array = [_]u8{ 1, 2, 3, 4, 5, 6, 7, 8 };
|
||||
const ptr: [*]const u8 = @as([*]const u8, @ptrCast(&array));
|
||||
const slice = ptr[1..][0..5];
|
||||
|
|
@ -236,7 +232,6 @@ test "runtime safety lets us slice from len..len" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var an_array = [_]u8{ 1, 2, 3 };
|
||||
try expect(mem.eql(u8, sliceFromLenToLen(an_array[0..], 3, 3), ""));
|
||||
|
|
@ -249,7 +244,6 @@ fn sliceFromLenToLen(a_slice: []u8, start: usize, end: usize) []u8 {
|
|||
test "C pointer" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var buf: [*c]const u8 = "kjdhfkjdhfdkjhfkfjhdfkjdhfkdjhfdkjhf";
|
||||
var len: u32 = 10;
|
||||
|
|
@ -293,7 +287,6 @@ fn sliceSum(comptime q: []const u8) i32 {
|
|||
test "slice type with custom alignment" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const LazilyResolvedType = struct {
|
||||
anything: i32,
|
||||
|
|
@ -307,7 +300,6 @@ test "slice type with custom alignment" {
|
|||
|
||||
test "obtaining a null terminated slice" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
// here we have a normal array
|
||||
var buf: [50]u8 = undefined;
|
||||
|
|
@ -352,7 +344,6 @@ test "empty array to slice" {
|
|||
test "@ptrCast slice to pointer" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -407,7 +398,6 @@ test "slice syntax resulting in pointer-to-array" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
|
|
@ -627,7 +617,6 @@ test "slice syntax resulting in pointer-to-array" {
|
|||
test "slice pointer-to-array null terminated" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
comptime {
|
||||
var array = [5:0]u8{ 1, 2, 3, 4, 5 };
|
||||
|
|
@ -646,7 +635,6 @@ test "slice pointer-to-array null terminated" {
|
|||
|
||||
test "slice pointer-to-array zero length" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
comptime {
|
||||
{
|
||||
|
|
@ -681,7 +669,6 @@ test "type coercion of pointer to anon struct literal to pointer to slice" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const U = union {
|
||||
|
|
@ -773,7 +760,6 @@ test "slice sentinel access at comptime" {
|
|||
test "slicing array with sentinel as end index" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn do() !void {
|
||||
|
|
@ -792,7 +778,6 @@ test "slicing array with sentinel as end index" {
|
|||
test "slicing slice with sentinel as end index" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn do() !void {
|
||||
|
|
@ -863,7 +848,6 @@ test "global slice field access" {
|
|||
}
|
||||
|
||||
test "slice of void" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
var n: usize = 10;
|
||||
|
|
@ -874,8 +858,6 @@ test "slice of void" {
|
|||
}
|
||||
|
||||
test "slice with dereferenced value" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: usize = 0;
|
||||
const idx: *usize = &a;
|
||||
_ = blk: {
|
||||
|
|
@ -989,7 +971,6 @@ test "get address of element of zero-sized slice" {
|
|||
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
|
|
@ -1004,7 +985,6 @@ test "sentinel-terminated 0-length slices" {
|
|||
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const u32s: [4]u32 = [_]u32{ 0, 1, 2, 3 };
|
||||
|
||||
|
|
|
|||
|
|
@ -92,7 +92,6 @@ test "structs" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var foo: StructFoo = undefined;
|
||||
@memset(@as([*]u8, @ptrCast(&foo))[0..@sizeOf(StructFoo)], 0);
|
||||
|
|
@ -111,7 +110,6 @@ fn testMutation(foo: *StructFoo) void {
|
|||
|
||||
test "struct byval assign" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var foo1: StructFoo = undefined;
|
||||
var foo2: StructFoo = undefined;
|
||||
|
|
@ -176,7 +174,6 @@ const MemberFnTestFoo = struct {
|
|||
|
||||
test "call member function directly" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const instance = MemberFnTestFoo{ .x = 1234 };
|
||||
const result = MemberFnTestFoo.member(instance);
|
||||
|
|
@ -185,7 +182,6 @@ test "call member function directly" {
|
|||
|
||||
test "store member function in variable" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const instance = MemberFnTestFoo{ .x = 1234 };
|
||||
const memberFn = MemberFnTestFoo.member;
|
||||
|
|
@ -207,7 +203,6 @@ const MemberFnRand = struct {
|
|||
test "return struct byval from function" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const Bar = struct {
|
||||
x: i32,
|
||||
|
|
@ -256,7 +251,6 @@ test "usingnamespace within struct scope" {
|
|||
test "struct field init with catch" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -300,7 +294,6 @@ const Val = struct {
|
|||
test "struct point to self" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var root: Node = undefined;
|
||||
root.val.x = 1;
|
||||
|
|
@ -355,7 +348,6 @@ test "self-referencing struct via array member" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const T = struct {
|
||||
children: [1]*@This(),
|
||||
|
|
@ -403,7 +395,6 @@ test "packed struct" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var foo = APackedStruct{
|
||||
.x = 1,
|
||||
|
|
@ -633,7 +624,6 @@ fn getC(data: *const BitField1) u2 {
|
|||
test "default struct initialization fields" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
a: i32 = 1234,
|
||||
|
|
@ -809,7 +799,6 @@ test "fn with C calling convention returns struct by value" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry() !void {
|
||||
|
|
@ -909,8 +898,6 @@ test "anonymous struct literal syntax" {
|
|||
}
|
||||
|
||||
test "fully anonymous struct" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
try dump(.{
|
||||
|
|
@ -933,8 +920,6 @@ test "fully anonymous struct" {
|
|||
}
|
||||
|
||||
test "fully anonymous list literal" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
try dump(.{ @as(u32, 1234), @as(f64, 12.34), true, "hi" });
|
||||
|
|
@ -982,7 +967,6 @@ test "tuple element initialized with fn call" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -1023,7 +1007,6 @@ test "struct with 0-length union array field" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const U = union {
|
||||
a: u32,
|
||||
|
|
@ -1044,7 +1027,6 @@ test "type coercion of anon struct literal to struct" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const S2 = struct {
|
||||
|
|
@ -1084,7 +1066,6 @@ test "type coercion of pointer to anon struct literal to pointer to struct" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const S2 = struct {
|
||||
|
|
@ -1299,7 +1280,6 @@ test "initialize struct with empty literal" {
|
|||
|
||||
test "loading a struct pointer perfoms a copy" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
a: i32,
|
||||
|
|
@ -1561,7 +1541,6 @@ test "discarded struct initialization works as expected" {
|
|||
test "function pointer in struct returns the struct" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const A = struct {
|
||||
const A = @This();
|
||||
|
|
@ -1732,7 +1711,6 @@ test "extern struct field pointer has correct alignment" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -1770,8 +1748,6 @@ test "extern struct field pointer has correct alignment" {
|
|||
}
|
||||
|
||||
test "packed struct field in anonymous struct" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const T = packed struct {
|
||||
f1: bool = false,
|
||||
};
|
||||
|
|
@ -1783,8 +1759,6 @@ fn countFields(v: anytype) usize {
|
|||
}
|
||||
|
||||
test "struct init with no result pointer sets field result types" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
// A function parameter has a result type, but no result pointer.
|
||||
fn f(s: struct { x: u32 }) u32 {
|
||||
|
|
@ -1863,8 +1837,6 @@ test "comptimeness of optional and error union payload is analyzed properly" {
|
|||
}
|
||||
|
||||
test "initializer uses own alignment" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
x: u32 = @alignOf(@This()) + 1,
|
||||
};
|
||||
|
|
@ -1876,8 +1848,6 @@ test "initializer uses own alignment" {
|
|||
}
|
||||
|
||||
test "initializer uses own size" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
x: u32 = @sizeOf(@This()) + 1,
|
||||
};
|
||||
|
|
@ -1889,8 +1859,6 @@ test "initializer uses own size" {
|
|||
}
|
||||
|
||||
test "initializer takes a pointer to a variable inside its struct" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const namespace = struct {
|
||||
const S = struct {
|
||||
s: *S = &S.instance,
|
||||
|
|
@ -1909,8 +1877,6 @@ test "initializer takes a pointer to a variable inside its struct" {
|
|||
}
|
||||
|
||||
test "circular dependency through pointer field of a struct" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const StructInner = extern struct {
|
||||
outer: StructOuter = std.mem.zeroes(StructOuter),
|
||||
|
|
@ -1932,8 +1898,6 @@ test "circular dependency through pointer field of a struct" {
|
|||
}
|
||||
|
||||
test "field calls do not force struct field init resolution" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
x: u32 = blk: {
|
||||
_ = @TypeOf(make().dummyFn()); // runtime field call - S not fully resolved - dummyFn call should not force field init resolution
|
||||
|
|
@ -2067,7 +2031,6 @@ test "runtime value in nested initializer passed as pointer to function" {
|
|||
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const Bar = struct {
|
||||
b: u32,
|
||||
|
|
@ -2142,7 +2105,6 @@ test "assignment of field with padding" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const Mesh = extern struct {
|
||||
id: u32,
|
||||
|
|
@ -2173,7 +2135,6 @@ test "initiate global variable with runtime value" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
field: i32,
|
||||
|
|
@ -2192,7 +2153,6 @@ test "initiate global variable with runtime value" {
|
|||
test "struct containing optional pointer to array of @This()" {
|
||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
x: ?*const [1]@This(),
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ const builtin = @import("builtin");
|
|||
test "struct contains null pointer which contains original struct" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: ?*NodeLineComment = null;
|
||||
_ = &x;
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ const NodeAligned = struct {
|
|||
|
||||
test "struct contains slice of itself" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var other_nodes = [_]Node{
|
||||
Node{
|
||||
|
|
@ -54,7 +53,6 @@ test "struct contains slice of itself" {
|
|||
test "struct contains aligned slice of itself" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var other_nodes = [_]NodeAligned{
|
||||
NodeAligned{
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ const expectEqual = std.testing.expectEqual;
|
|||
|
||||
test "switch with numbers" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testSwitchWithNumbers(13);
|
||||
}
|
||||
|
|
@ -23,7 +22,6 @@ fn testSwitchWithNumbers(x: u32) !void {
|
|||
|
||||
test "switch with all ranges" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(testSwitchWithAllRanges(50, 3) == 1);
|
||||
try expect(testSwitchWithAllRanges(101, 0) == 2);
|
||||
|
|
@ -57,27 +55,25 @@ test "implicit comptime switch" {
|
|||
|
||||
test "switch on enum" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const fruit = Fruit.Orange;
|
||||
nonConstSwitchOnEnum(fruit);
|
||||
try expect(nonConstSwitchOnEnum(fruit));
|
||||
}
|
||||
const Fruit = enum {
|
||||
Apple,
|
||||
Orange,
|
||||
Banana,
|
||||
};
|
||||
fn nonConstSwitchOnEnum(fruit: Fruit) void {
|
||||
switch (fruit) {
|
||||
Fruit.Apple => unreachable,
|
||||
Fruit.Orange => {},
|
||||
Fruit.Banana => unreachable,
|
||||
}
|
||||
fn nonConstSwitchOnEnum(fruit: Fruit) bool {
|
||||
return switch (fruit) {
|
||||
Fruit.Apple => false,
|
||||
Fruit.Orange => true,
|
||||
Fruit.Banana => false,
|
||||
};
|
||||
}
|
||||
|
||||
test "switch statement" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try nonConstSwitch(SwitchStatementFoo.C);
|
||||
}
|
||||
|
|
@ -94,7 +90,6 @@ const SwitchStatementFoo = enum { A, B, C, D };
|
|||
|
||||
test "switch with multiple expressions" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const x = switch (returnsFive()) {
|
||||
1, 2, 3 => 1,
|
||||
|
|
@ -123,7 +118,6 @@ fn trueIfBoolFalseOtherwise(comptime T: type) bool {
|
|||
|
||||
test "switching on booleans" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testSwitchOnBools();
|
||||
try comptime testSwitchOnBools();
|
||||
|
|
@ -179,7 +173,6 @@ test "undefined.u0" {
|
|||
|
||||
test "switch with disjoint range" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var q: u8 = 0;
|
||||
_ = &q;
|
||||
|
|
@ -191,8 +184,6 @@ test "switch with disjoint range" {
|
|||
}
|
||||
|
||||
test "switch variable for range and multiple prongs" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
try doTheSwitch(16);
|
||||
|
|
@ -224,7 +215,6 @@ fn poll() void {
|
|||
|
||||
test "switch on global mutable var isn't constant-folded" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
while (state < 2) {
|
||||
poll();
|
||||
|
|
@ -286,7 +276,6 @@ fn testSwitchEnumPtrCapture() !void {
|
|||
|
||||
test "switch handles all cases of number" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testSwitchHandleAllCases();
|
||||
try comptime testSwitchHandleAllCases();
|
||||
|
|
@ -382,7 +371,6 @@ test "anon enum literal used in switch on union enum" {
|
|||
|
||||
test "switch all prongs unreachable" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try testAllProngsUnreachable();
|
||||
try comptime testAllProngsUnreachable();
|
||||
|
|
@ -406,7 +394,6 @@ fn switchWithUnreachable(x: i32) i32 {
|
|||
|
||||
test "capture value of switch with all unreachable prongs" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const x = return_a_number() catch |err| switch (err) {
|
||||
else => unreachable,
|
||||
|
|
@ -420,7 +407,6 @@ fn return_a_number() anyerror!i32 {
|
|||
|
||||
test "switch on integer with else capturing expr" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -442,7 +428,6 @@ test "else prong of switch on error set excludes other cases" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -478,7 +463,6 @@ test "switch prongs with error set cases make a new error set type for capture v
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -513,7 +497,6 @@ test "switch prongs with error set cases make a new error set type for capture v
|
|||
|
||||
test "return result loc and then switch with range implicit casted to error union" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -662,7 +645,6 @@ test "switch prong pointer capture alignment" {
|
|||
test "switch on pointer type" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const X = struct {
|
||||
|
|
@ -735,7 +717,6 @@ test "switch capture copies its payload" {
|
|||
|
||||
test "capture of integer forwards the switch condition directly" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo(x: u8) !void {
|
||||
|
|
@ -757,7 +738,6 @@ test "capture of integer forwards the switch condition directly" {
|
|||
|
||||
test "enum value without tag name used as switch item" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const E = enum(u32) {
|
||||
a = 1,
|
||||
|
|
@ -775,8 +755,6 @@ test "enum value without tag name used as switch item" {
|
|||
}
|
||||
|
||||
test "switch item sizeof" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
var a: usize = 0;
|
||||
|
|
@ -873,8 +851,6 @@ test "switch pointer capture peer type resolution" {
|
|||
}
|
||||
|
||||
test "inline switch range that includes the maximum value of the switched type" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const inputs: [3]u8 = .{ 0, 254, 255 };
|
||||
for (inputs) |input| {
|
||||
switch (input) {
|
||||
|
|
@ -933,7 +909,6 @@ test "peer type resolution on switch captures ignores unused payload bits" {
|
|||
test "switch prong captures range" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn a(b: []u3, c: u3) void {
|
||||
|
|
@ -970,8 +945,6 @@ test "prong with inline call to unreachable" {
|
|||
}
|
||||
|
||||
test "block error return trace index is reset between prongs" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn returnError() error{TestFailed} {
|
||||
return error.TestFailed;
|
||||
|
|
|
|||
|
|
@ -51,7 +51,6 @@ test "this used as optional function parameter" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var global: State = undefined;
|
||||
global.enter = prev;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ const expect = std.testing.expect;
|
|||
|
||||
test "try on error union" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try tryOnErrorUnionImpl();
|
||||
try comptime tryOnErrorUnionImpl();
|
||||
|
|
@ -52,7 +51,6 @@ test "`try`ing an if/else expression" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn getError() !void {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ test "tuple concatenation" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -56,7 +55,6 @@ test "more tuple concatenation" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const T = struct {
|
||||
fn consume_tuple(tuple: anytype, len: usize) !void {
|
||||
|
|
@ -326,8 +324,6 @@ test "tuple type with void field" {
|
|||
}
|
||||
|
||||
test "zero sized struct in tuple handled correctly" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const State = struct {
|
||||
const Self = @This();
|
||||
data: @Type(.{
|
||||
|
|
@ -369,7 +365,6 @@ test "branching inside tuple literal" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn foo(a: anytype) !void {
|
||||
|
|
@ -474,7 +469,6 @@ test "coerce anon tuple to tuple" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: u8 = 1;
|
||||
var y: u16 = 2;
|
||||
|
|
@ -579,8 +573,6 @@ test "comptime fields in tuple can be initialized" {
|
|||
}
|
||||
|
||||
test "tuple default values" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const T = struct {
|
||||
usize,
|
||||
usize = 123,
|
||||
|
|
|
|||
|
|
@ -203,7 +203,6 @@ test "Type.Opaque" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const Opaque = @Type(.{
|
||||
.Opaque = .{
|
||||
|
|
@ -261,7 +260,6 @@ test "Type.Struct" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const A = @Type(@typeInfo(struct { x: u8, y: u32 }));
|
||||
const infoA = @typeInfo(A).Struct;
|
||||
|
|
|
|||
|
|
@ -91,7 +91,6 @@ test "reslice of undefined global var slice" {
|
|||
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var stack_buf: [100]u8 = [_]u8{0} ** 100;
|
||||
buf = &stack_buf;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ test "ignore lval with underscore" {
|
|||
|
||||
test "ignore lval with underscore (while loop)" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
while (optionalReturnError()) |_| {
|
||||
while (optionalReturnError()) |_| {
|
||||
|
|
|
|||
|
|
@ -418,7 +418,6 @@ test "tagged union initialization with runtime void" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(testTaggedUnionInit({}));
|
||||
}
|
||||
|
|
@ -1744,7 +1743,6 @@ test "union with 128 bit integer" {
|
|||
|
||||
test "memset extern union" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const U = extern union {
|
||||
foo: u8,
|
||||
|
|
@ -1766,7 +1764,6 @@ test "memset extern union" {
|
|||
|
||||
test "memset packed union" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const U = packed union {
|
||||
a: u32,
|
||||
|
|
@ -1977,8 +1974,6 @@ test "reinterpret packed union inside packed struct" {
|
|||
}
|
||||
|
||||
test "inner struct initializer uses union layout" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const namespace = struct {
|
||||
const U = union {
|
||||
a: struct {
|
||||
|
|
@ -2004,7 +1999,6 @@ test "inner struct initializer uses union layout" {
|
|||
|
||||
test "inner struct initializer uses packed union layout" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const namespace = struct {
|
||||
const U = packed union {
|
||||
|
|
@ -2031,7 +2025,6 @@ test "inner struct initializer uses packed union layout" {
|
|||
|
||||
test "extern union initialized via reintepreted struct field initializer" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const bytes = [_]u8{ 0xaa, 0xbb, 0xcc, 0xdd };
|
||||
|
||||
|
|
@ -2155,7 +2148,6 @@ test "pass register-sized field as non-register-sized union" {
|
|||
|
||||
test "circular dependency through pointer field of a union" {
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
const UnionInner = extern struct {
|
||||
|
|
|
|||
|
|
@ -14,8 +14,6 @@ fn add(args: anytype) i32 {
|
|||
}
|
||||
|
||||
test "add arbitrary args" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(add(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);
|
||||
try expect(add(.{@as(i32, 1234)}) == 1234);
|
||||
try expect(add(.{}) == 0);
|
||||
|
|
@ -26,15 +24,12 @@ fn readFirstVarArg(args: anytype) void {
|
|||
}
|
||||
|
||||
test "send void arg to var args" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
readFirstVarArg(.{{}});
|
||||
}
|
||||
|
||||
test "pass args directly" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(addSomeStuff(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);
|
||||
try expect(addSomeStuff(.{@as(i32, 1234)}) == 1234);
|
||||
|
|
@ -48,7 +43,6 @@ fn addSomeStuff(args: anytype) i32 {
|
|||
test "runtime parameter before var args" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect((try extraFn(10, .{})) == 0);
|
||||
try expect((try extraFn(10, .{false})) == 1);
|
||||
|
|
@ -87,15 +81,11 @@ fn foo2(args: anytype) bool {
|
|||
}
|
||||
|
||||
test "array of var args functions" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(foos[0](.{}));
|
||||
try expect(!foos[1](.{}));
|
||||
}
|
||||
|
||||
test "pass zero length array to var args param" {
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
doNothingWithFirstArg(.{""});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -166,7 +166,6 @@ test "array to vector" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
@ -434,6 +433,7 @@ test "load vector elements via runtime index" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn doTheTest() !void {
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ test "void optional" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: ?void = {};
|
||||
_ = &x;
|
||||
|
|
|
|||
|
|
@ -258,7 +258,6 @@ fn returnWithImplicitCastFromWhileLoopTest() anyerror!void {
|
|||
|
||||
test "while on error union with else result follow else prong" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const result = while (returnError()) |value| {
|
||||
break value;
|
||||
|
|
@ -268,7 +267,6 @@ test "while on error union with else result follow else prong" {
|
|||
|
||||
test "while on error union with else result follow break prong" {
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const result = while (returnSuccess(10)) |value| {
|
||||
break value;
|
||||
|
|
@ -315,7 +313,6 @@ test "while error 2 break statements and an else" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn entry(opt_t: anyerror!bool, f: bool) !void {
|
||||
|
|
@ -382,7 +379,6 @@ test "while loop with comptime true condition needs no else block to return valu
|
|||
test "int returned from switch in while" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var x: u32 = 3;
|
||||
const val: usize = while (true) switch (x) {
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ test "implicit unsigned integer to signed integer" {
|
|||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
var a: u8 = 250;
|
||||
var b: i16 = a;
|
||||
|
|
@ -80,7 +79,6 @@ test "cast small unsigned to larger signed" {
|
|||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
|
||||
|
||||
try expect(castSmallUnsignedToLargerSigned1(200) == @as(i16, 200));
|
||||
try expect(castSmallUnsignedToLargerSigned2(9999) == @as(i64, 9999));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue