| author | |
| committer | |
| log | 912b84bbad698d18a6b844f9c05c074d2880e35b |
| tree | 9432636c0915dfdbb3bd23e26aa725debad56d2b |
| parent | 6921b0a850771fa7729930a9ec64b27b4e57e79b |
14 files changed, 122 insertions(+), 87 deletions(-)
lib/include/zig.h+34-31| ... | ... | @@ -101,19 +101,20 @@ |
| 101 | 101 | |
| 102 | 102 | #if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) |
| 103 | 103 | #include <stdatomic.h> |
| 104 | #define zig_atomic(type) _Atomic(type) | |
| 104 | 105 | #define zig_cmpxchg_strong(obj, expected, desired, succ, fail) atomic_compare_exchange_strong_explicit(obj, &(expected), desired, succ, fail) |
| 105 | #define zig_cmpxchg_weak (obj, expected, desired, succ, fail) atomic_compare_exchange_weak_explicit (obj, &(expected), desired, succ, fail) | |
| 106 | #define zig_cmpxchg_weak(obj, expected, desired, succ, fail) atomic_compare_exchange_weak_explicit (obj, &(expected), desired, succ, fail) | |
| 106 | 107 | #define zig_atomicrmw_xchg(obj, arg, order) atomic_exchange_explicit (obj, arg, order) |
| 107 | #define zig_atomicrmw_add (obj, arg, order) atomic_fetch_add_explicit (obj, arg, order) | |
| 108 | #define zig_atomicrmw_sub (obj, arg, order) atomic_fetch_sub_explicit (obj, arg, order) | |
| 109 | #define zig_atomicrmw_or (obj, arg, order) atomic_fetch_or_explicit (obj, arg, order) | |
| 110 | #define zig_atomicrmw_xor (obj, arg, order) atomic_fetch_xor_explicit (obj, arg, order) | |
| 111 | #define zig_atomicrmw_and (obj, arg, order) atomic_fetch_and_explicit (obj, arg, order) | |
| 112 | #define zig_atomicrmw_nand(obj, arg, order) atomic_fetch_nand_explicit(obj, arg, order) | |
| 113 | #define zig_atomicrmw_min (obj, arg, order) atomic_fetch_min_explicit (obj, arg, order) | |
| 114 | #define zig_atomicrmw_max (obj, arg, order) atomic_fetch_max_explicit (obj, arg, order) | |
| 115 | #define zig_atomic_store (obj, arg, order) atomic_store_explicit (obj, arg, order) | |
| 116 | #define zig_atomic_load (obj, order) atomic_load_explicit (obj, order) | |
| 108 | #define zig_atomicrmw_add(obj, arg, order) atomic_fetch_add_explicit (obj, arg, order) | |
| 109 | #define zig_atomicrmw_sub(obj, arg, order) atomic_fetch_sub_explicit (obj, arg, order) | |
| 110 | #define zig_atomicrmw_or(obj, arg, order) atomic_fetch_or_explicit (obj, arg, order) | |
| 111 | #define zig_atomicrmw_xor(obj, arg, order) atomic_fetch_xor_explicit (obj, arg, order) | |
| 112 | #define zig_atomicrmw_and(obj, arg, order) atomic_fetch_and_explicit (obj, arg, order) | |
| 113 | #define zig_atomicrmw_nand(obj, arg, order) __atomic_fetch_nand (obj, arg, order) | |
| 114 | #define zig_atomicrmw_min(obj, arg, order) __atomic_fetch_min (obj, arg, order) | |
| 115 | #define zig_atomicrmw_max(obj, arg, order) __atomic_fetch_max (obj, arg, order) | |
| 116 | #define zig_atomic_store(obj, arg, order) atomic_store_explicit (obj, arg, order) | |
| 117 | #define zig_atomic_load(obj, order) atomic_load_explicit (obj, order) | |
| 117 | 118 | #define zig_fence(order) atomic_thread_fence(order) |
| 118 | 119 | #elif __GNUC__ |
| 119 | 120 | #define memory_order_relaxed __ATOMIC_RELAXED |
| ... | ... | @@ -122,19 +123,20 @@ |
| 122 | 123 | #define memory_order_release __ATOMIC_RELEASE |
| 123 | 124 | #define memory_order_acq_rel __ATOMIC_ACQ_REL |
| 124 | 125 | #define memory_order_seq_cst __ATOMIC_SEQ_CST |
| 126 | #define zig_atomic(type) type | |
| 125 | 127 | #define zig_cmpxchg_strong(obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, false, succ, fail) |
| 126 | #define zig_cmpxchg_weak (obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, true , succ, fail) | |
| 128 | #define zig_cmpxchg_weak(obj, expected, desired, succ, fail) __atomic_compare_exchange_n(obj, &(expected), desired, true , succ, fail) | |
| 127 | 129 | #define zig_atomicrmw_xchg(obj, arg, order) __atomic_exchange_n(obj, arg, order) |
| 128 | #define zig_atomicrmw_add (obj, arg, order) __atomic_fetch_add (obj, arg, order) | |
| 129 | #define zig_atomicrmw_sub (obj, arg, order) __atomic_fetch_sub (obj, arg, order) | |
| 130 | #define zig_atomicrmw_or (obj, arg, order) __atomic_fetch_or (obj, arg, order) | |
| 131 | #define zig_atomicrmw_xor (obj, arg, order) __atomic_fetch_xor (obj, arg, order) | |
| 132 | #define zig_atomicrmw_and (obj, arg, order) __atomic_fetch_and (obj, arg, order) | |
| 130 | #define zig_atomicrmw_add(obj, arg, order) __atomic_fetch_add (obj, arg, order) | |
| 131 | #define zig_atomicrmw_sub(obj, arg, order) __atomic_fetch_sub (obj, arg, order) | |
| 132 | #define zig_atomicrmw_or(obj, arg, order) __atomic_fetch_or (obj, arg, order) | |
| 133 | #define zig_atomicrmw_xor(obj, arg, order) __atomic_fetch_xor (obj, arg, order) | |
| 134 | #define zig_atomicrmw_and(obj, arg, order) __atomic_fetch_and (obj, arg, order) | |
| 133 | 135 | #define zig_atomicrmw_nand(obj, arg, order) __atomic_fetch_nand(obj, arg, order) |
| 134 | #define zig_atomicrmw_min (obj, arg, order) __atomic_fetch_min (obj, arg, order) | |
| 135 | #define zig_atomicrmw_max (obj, arg, order) __atomic_fetch_max (obj, arg, order) | |
| 136 | #define zig_atomic_store (obj, arg, order) __atomic_store (obj, arg, order) | |
| 137 | #define zig_atomic_load (obj, order) __atomic_load (obj, order) | |
| 136 | #define zig_atomicrmw_min(obj, arg, order) __atomic_fetch_min (obj, arg, order) | |
| 137 | #define zig_atomicrmw_max(obj, arg, order) __atomic_fetch_max (obj, arg, order) | |
| 138 | #define zig_atomic_store(obj, arg, order) __atomic_store_n (obj, arg, order) | |
| 139 | #define zig_atomic_load(obj, order) __atomic_load_n (obj, order) | |
| 138 | 140 | #define zig_fence(order) __atomic_thread_fence(order) |
| 139 | 141 | #else |
| 140 | 142 | #define memory_order_relaxed 0 |
| ... | ... | @@ -143,19 +145,20 @@ |
| 143 | 145 | #define memory_order_release 3 |
| 144 | 146 | #define memory_order_acq_rel 4 |
| 145 | 147 | #define memory_order_seq_cst 5 |
| 148 | #define zig_atomic(type) type | |
| 146 | 149 | #define zig_cmpxchg_strong(obj, expected, desired, succ, fail) zig_unimplemented() |
| 147 | #define zig_cmpxchg_weak (obj, expected, desired, succ, fail) zig_unimplemented() | |
| 150 | #define zig_cmpxchg_weak(obj, expected, desired, succ, fail) zig_unimplemented() | |
| 148 | 151 | #define zig_atomicrmw_xchg(obj, arg, order) zig_unimplemented() |
| 149 | #define zig_atomicrmw_add (obj, arg, order) zig_unimplemented() | |
| 150 | #define zig_atomicrmw_sub (obj, arg, order) zig_unimplemented() | |
| 151 | #define zig_atomicrmw_or (obj, arg, order) zig_unimplemented() | |
| 152 | #define zig_atomicrmw_xor (obj, arg, order) zig_unimplemented() | |
| 153 | #define zig_atomicrmw_and (obj, arg, order) zig_unimplemented() | |
| 152 | #define zig_atomicrmw_add(obj, arg, order) zig_unimplemented() | |
| 153 | #define zig_atomicrmw_sub(obj, arg, order) zig_unimplemented() | |
| 154 | #define zig_atomicrmw_or(obj, arg, order) zig_unimplemented() | |
| 155 | #define zig_atomicrmw_xor(obj, arg, order) zig_unimplemented() | |
| 156 | #define zig_atomicrmw_and(obj, arg, order) zig_unimplemented() | |
| 154 | 157 | #define zig_atomicrmw_nand(obj, arg, order) zig_unimplemented() |
| 155 | #define zig_atomicrmw_min (obj, arg, order) zig_unimplemented() | |
| 156 | #define zig_atomicrmw_max (obj, arg, order) zig_unimplemented() | |
| 157 | #define zig_atomic_store (obj, arg, order) zig_unimplemented() | |
| 158 | #define zig_atomic_load (obj, order) zig_unimplemented() | |
| 158 | #define zig_atomicrmw_min(obj, arg, order) zig_unimplemented() | |
| 159 | #define zig_atomicrmw_max(obj, arg, order) zig_unimplemented() | |
| 160 | #define zig_atomic_store(obj, arg, order) zig_unimplemented() | |
| 161 | #define zig_atomic_load(obj, order) zig_unimplemented() | |
| 159 | 162 | #define zig_fence(order) zig_unimplemented() |
| 160 | 163 | #endif |
| 161 | 164 |
src/codegen/c.zig+88-21| ... | ... | @@ -587,9 +587,9 @@ pub const DeclGen = struct { |
| 587 | 587 | |
| 588 | 588 | try writer.writeByte('('); |
| 589 | 589 | try dg.renderTypecast(writer, ty); |
| 590 | try writer.writeAll("){ .is_null = "); | |
| 590 | try writer.writeAll("){ .payload = "); | |
| 591 | 591 | try dg.renderValue(writer, Type.bool, val, location); |
| 592 | try writer.writeAll(", .payload = "); | |
| 592 | try writer.writeAll(", .is_null = "); | |
| 593 | 593 | try dg.renderValue(writer, payload_ty, val, location); |
| 594 | 594 | return writer.writeAll(" }"); |
| 595 | 595 | }, |
| ... | ... | @@ -820,11 +820,13 @@ pub const DeclGen = struct { |
| 820 | 820 | try writer.writeAll("){"); |
| 821 | 821 | if (val.castTag(.opt_payload)) |pl| { |
| 822 | 822 | const payload_val = pl.data; |
| 823 | try writer.writeAll(" .is_null = false, .payload = "); | |
| 823 | try writer.writeAll(" .payload = "); | |
| 824 | 824 | try dg.renderValue(writer, payload_ty, payload_val, location); |
| 825 | try writer.writeAll(" }"); | |
| 825 | try writer.writeAll(", .is_null = false }"); | |
| 826 | 826 | } else { |
| 827 | try writer.writeAll(" .is_null = true }"); | |
| 827 | try writer.writeAll(" .payload = "); | |
| 828 | try dg.renderValue(writer, payload_ty, Value.undef, location); | |
| 829 | try writer.writeAll(", .is_null = true }"); | |
| 828 | 830 | } |
| 829 | 831 | }, |
| 830 | 832 | .ErrorSet => { |
| ... | ... | @@ -3870,10 +3872,23 @@ fn airStructFieldVal(f: *Function, inst: Air.Inst.Index) !CValue { |
| 3870 | 3872 | const payload = if (struct_ty.tag() == .union_tagged or struct_ty.tag() == .union_safety_tagged) "payload." else ""; |
| 3871 | 3873 | |
| 3872 | 3874 | const inst_ty = f.air.typeOfIndex(inst); |
| 3873 | const local = try f.allocLocal(inst_ty, .Const); | |
| 3874 | try writer.writeAll(" = "); | |
| 3875 | try f.writeCValue(writer, struct_byval); | |
| 3876 | try writer.print(".{s}{ };\n", .{ payload, fmtIdent(field_name) }); | |
| 3875 | const is_array = inst_ty.zigTypeTag() == .Array; | |
| 3876 | const local = try f.allocLocal(inst_ty, if (is_array) .Mut else .Const); | |
| 3877 | ||
| 3878 | if (is_array) { | |
| 3879 | try writer.writeAll(";\n"); | |
| 3880 | try writer.writeAll("memcpy("); | |
| 3881 | try f.writeCValue(writer, local); | |
| 3882 | try writer.writeAll(", "); | |
| 3883 | try f.writeCValue(writer, struct_byval); | |
| 3884 | try writer.print(".{s}{ }, sizeof(", .{ payload, fmtIdent(field_name) }); | |
| 3885 | try f.writeCValue(writer, local); | |
| 3886 | try writer.writeAll("));\n"); | |
| 3887 | } else { | |
| 3888 | try writer.writeAll(" = "); | |
| 3889 | try f.writeCValue(writer, struct_byval); | |
| 3890 | try writer.print(".{s}{ };\n", .{ payload, fmtIdent(field_name) }); | |
| 3891 | } | |
| 3877 | 3892 | return local; |
| 3878 | 3893 | } |
| 3879 | 3894 | |
| ... | ... | @@ -3962,9 +3977,9 @@ fn airWrapOptional(f: *Function, inst: Air.Inst.Index) !CValue { |
| 3962 | 3977 | |
| 3963 | 3978 | // .wrap_optional is used to convert non-optionals into optionals so it can never be null. |
| 3964 | 3979 | const local = try f.allocLocal(inst_ty, .Const); |
| 3965 | try writer.writeAll(" = { .is_null = false, .payload ="); | |
| 3980 | try writer.writeAll(" = { .payload = "); | |
| 3966 | 3981 | try f.writeCValue(writer, operand); |
| 3967 | try writer.writeAll("};\n"); | |
| 3982 | try writer.writeAll(", .is_null = false };\n"); | |
| 3968 | 3983 | return local; |
| 3969 | 3984 | } |
| 3970 | 3985 | |
| ... | ... | @@ -4203,23 +4218,54 @@ fn airCmpxchg(f: *Function, inst: Air.Inst.Index, flavor: [*:0]const u8) !CValue |
| 4203 | 4218 | const ty_pl = f.air.instructions.items(.data)[inst].ty_pl; |
| 4204 | 4219 | const extra = f.air.extraData(Air.Cmpxchg, ty_pl.payload).data; |
| 4205 | 4220 | const inst_ty = f.air.typeOfIndex(inst); |
| 4221 | const is_struct = !inst_ty.isPtrLikeOptional(); | |
| 4222 | const ptr_ty = f.air.typeOf(extra.ptr); | |
| 4206 | 4223 | const ptr = try f.resolveInst(extra.ptr); |
| 4207 | 4224 | const expected_value = try f.resolveInst(extra.expected_value); |
| 4208 | 4225 | const new_value = try f.resolveInst(extra.new_value); |
| 4209 | const local = try f.allocLocal(inst_ty, .Const); | |
| 4210 | 4226 | const writer = f.object.writer(); |
| 4211 | 4227 | |
| 4212 | try writer.print(" = zig_cmpxchg_{s}(", .{flavor}); | |
| 4228 | const local = try f.allocLocal(inst_ty, .Mut); | |
| 4229 | try writer.writeAll(" = "); | |
| 4230 | if (is_struct) try writer.writeAll("{ .payload = "); | |
| 4231 | try f.writeCValue(writer, expected_value); | |
| 4232 | if (is_struct) try writer.writeAll(", .is_null = false }"); | |
| 4233 | try writer.writeAll(";\n"); | |
| 4234 | ||
| 4235 | if (is_struct) { | |
| 4236 | try f.writeCValue(writer, local); | |
| 4237 | try writer.writeAll(".is_null = "); | |
| 4238 | } else { | |
| 4239 | try writer.writeAll("if ("); | |
| 4240 | } | |
| 4241 | try writer.print("zig_cmpxchg_{s}((zig_atomic(", .{flavor}); | |
| 4242 | try f.object.dg.renderTypecast(writer, ptr_ty.elemType()); | |
| 4243 | try writer.writeByte(')'); | |
| 4244 | if (ptr_ty.isVolatilePtr()) try writer.writeAll(" volatile"); | |
| 4245 | try writer.writeAll(" *)"); | |
| 4213 | 4246 | try f.writeCValue(writer, ptr); |
| 4214 | 4247 | try writer.writeAll(", "); |
| 4215 | try f.writeCValue(writer, expected_value); | |
| 4248 | try f.writeCValue(writer, local); | |
| 4249 | if (is_struct) { | |
| 4250 | try writer.writeAll(".payload"); | |
| 4251 | } | |
| 4216 | 4252 | try writer.writeAll(", "); |
| 4217 | 4253 | try f.writeCValue(writer, new_value); |
| 4218 | 4254 | try writer.writeAll(", "); |
| 4219 | 4255 | try writeMemoryOrder(writer, extra.successOrder()); |
| 4220 | 4256 | try writer.writeAll(", "); |
| 4221 | 4257 | try writeMemoryOrder(writer, extra.failureOrder()); |
| 4222 | try writer.writeAll(");\n"); | |
| 4258 | try writer.writeByte(')'); | |
| 4259 | if (is_struct) { | |
| 4260 | try writer.writeAll(";\n"); | |
| 4261 | } else { | |
| 4262 | try writer.writeAll(") {\n"); | |
| 4263 | f.object.indent_writer.pushIndent(); | |
| 4264 | try f.writeCValue(writer, local); | |
| 4265 | try writer.writeAll(" = NULL;\n"); | |
| 4266 | f.object.indent_writer.popIndent(); | |
| 4267 | try writer.writeAll("}\n"); | |
| 4268 | } | |
| 4223 | 4269 | |
| 4224 | 4270 | return local; |
| 4225 | 4271 | } |
| ... | ... | @@ -4228,12 +4274,26 @@ fn airAtomicRmw(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4228 | 4274 | const pl_op = f.air.instructions.items(.data)[inst].pl_op; |
| 4229 | 4275 | const extra = f.air.extraData(Air.AtomicRmw, pl_op.payload).data; |
| 4230 | 4276 | const inst_ty = f.air.typeOfIndex(inst); |
| 4277 | const ptr_ty = f.air.typeOf(pl_op.operand); | |
| 4231 | 4278 | const ptr = try f.resolveInst(pl_op.operand); |
| 4232 | 4279 | const operand = try f.resolveInst(extra.operand); |
| 4233 | 4280 | const local = try f.allocLocal(inst_ty, .Const); |
| 4234 | 4281 | const writer = f.object.writer(); |
| 4235 | 4282 | |
| 4236 | try writer.print(" = zig_atomicrmw_{s}(", .{toAtomicRmwSuffix(extra.op())}); | |
| 4283 | try writer.print(" = zig_atomicrmw_{s}((", .{toAtomicRmwSuffix(extra.op())}); | |
| 4284 | switch (extra.op()) { | |
| 4285 | else => { | |
| 4286 | try writer.writeAll("zig_atomic("); | |
| 4287 | try f.object.dg.renderTypecast(writer, ptr_ty.elemType()); | |
| 4288 | try writer.writeByte(')'); | |
| 4289 | }, | |
| 4290 | .Nand, .Min, .Max => { | |
| 4291 | // These are missing from stdatomic.h, so no atomic types for now. | |
| 4292 | try f.object.dg.renderTypecast(writer, ptr_ty.elemType()); | |
| 4293 | }, | |
| 4294 | } | |
| 4295 | if (ptr_ty.isVolatilePtr()) try writer.writeAll(" volatile"); | |
| 4296 | try writer.writeAll(" *)"); | |
| 4237 | 4297 | try f.writeCValue(writer, ptr); |
| 4238 | 4298 | try writer.writeAll(", "); |
| 4239 | 4299 | try f.writeCValue(writer, operand); |
| ... | ... | @@ -4255,7 +4315,11 @@ fn airAtomicLoad(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4255 | 4315 | const local = try f.allocLocal(inst_ty, .Const); |
| 4256 | 4316 | const writer = f.object.writer(); |
| 4257 | 4317 | |
| 4258 | try writer.writeAll(" = zig_atomic_load("); | |
| 4318 | try writer.writeAll(" = zig_atomic_load((zig_atomic("); | |
| 4319 | try f.object.dg.renderTypecast(writer, ptr_ty.elemType()); | |
| 4320 | try writer.writeByte(')'); | |
| 4321 | if (ptr_ty.isVolatilePtr()) try writer.writeAll(" volatile"); | |
| 4322 | try writer.writeAll(" *)"); | |
| 4259 | 4323 | try f.writeCValue(writer, ptr); |
| 4260 | 4324 | try writer.writeAll(", "); |
| 4261 | 4325 | try writeMemoryOrder(writer, atomic_load.order); |
| ... | ... | @@ -4266,19 +4330,22 @@ fn airAtomicLoad(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4266 | 4330 | |
| 4267 | 4331 | fn airAtomicStore(f: *Function, inst: Air.Inst.Index, order: [*:0]const u8) !CValue { |
| 4268 | 4332 | const bin_op = f.air.instructions.items(.data)[inst].bin_op; |
| 4333 | const ptr_ty = f.air.typeOf(bin_op.lhs); | |
| 4269 | 4334 | const ptr = try f.resolveInst(bin_op.lhs); |
| 4270 | 4335 | const element = try f.resolveInst(bin_op.rhs); |
| 4271 | const inst_ty = f.air.typeOfIndex(inst); | |
| 4272 | const local = try f.allocLocal(inst_ty, .Const); | |
| 4273 | 4336 | const writer = f.object.writer(); |
| 4274 | 4337 | |
| 4275 | try writer.writeAll(" = zig_atomic_store("); | |
| 4338 | try writer.writeAll("zig_atomic_store((zig_atomic("); | |
| 4339 | try f.object.dg.renderTypecast(writer, ptr_ty.elemType()); | |
| 4340 | try writer.writeByte(')'); | |
| 4341 | if (ptr_ty.isVolatilePtr()) try writer.writeAll(" volatile"); | |
| 4342 | try writer.writeAll(" *)"); | |
| 4276 | 4343 | try f.writeCValue(writer, ptr); |
| 4277 | 4344 | try writer.writeAll(", "); |
| 4278 | 4345 | try f.writeCValue(writer, element); |
| 4279 | 4346 | try writer.print(", {s});\n", .{order}); |
| 4280 | 4347 | |
| 4281 | return local; | |
| 4348 | return CValue.none; | |
| 4282 | 4349 | } |
| 4283 | 4350 | |
| 4284 | 4351 | fn airMemset(f: *Function, inst: Air.Inst.Index) !CValue { |
test/behavior/atomics.zig-13| ... | ... | @@ -4,7 +4,6 @@ const expect = std.testing.expect; |
| 4 | 4 | const expectEqual = std.testing.expectEqual; |
| 5 | 5 | |
| 6 | 6 | test "cmpxchg" { |
| 7 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 8 | 7 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 9 | 8 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 10 | 9 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -44,7 +43,6 @@ test "fence" { |
| 44 | 43 | } |
| 45 | 44 | |
| 46 | 45 | test "atomicrmw and atomicload" { |
| 47 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 48 | 46 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 49 | 47 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 50 | 48 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -74,7 +72,6 @@ fn testAtomicLoad(ptr: *u8) !void { |
| 74 | 72 | } |
| 75 | 73 | |
| 76 | 74 | test "cmpxchg with ptr" { |
| 77 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 78 | 75 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 79 | 76 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 80 | 77 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -101,7 +98,6 @@ test "cmpxchg with ptr" { |
| 101 | 98 | } |
| 102 | 99 | |
| 103 | 100 | test "cmpxchg with ignored result" { |
| 104 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 105 | 101 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 106 | 102 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 107 | 103 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -116,7 +112,6 @@ test "cmpxchg with ignored result" { |
| 116 | 112 | } |
| 117 | 113 | |
| 118 | 114 | test "128-bit cmpxchg" { |
| 119 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 120 | 115 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 121 | 116 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 122 | 117 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -150,7 +145,6 @@ fn test_u128_cmpxchg() !void { |
| 150 | 145 | var a_global_variable = @as(u32, 1234); |
| 151 | 146 | |
| 152 | 147 | test "cmpxchg on a global variable" { |
| 153 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 154 | 148 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 155 | 149 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 156 | 150 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -169,7 +163,6 @@ test "cmpxchg on a global variable" { |
| 169 | 163 | } |
| 170 | 164 | |
| 171 | 165 | test "atomic load and rmw with enum" { |
| 172 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 173 | 166 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 174 | 167 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 175 | 168 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -188,7 +181,6 @@ test "atomic load and rmw with enum" { |
| 188 | 181 | } |
| 189 | 182 | |
| 190 | 183 | test "atomic store" { |
| 191 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 192 | 184 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 193 | 185 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 194 | 186 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -203,7 +195,6 @@ test "atomic store" { |
| 203 | 195 | } |
| 204 | 196 | |
| 205 | 197 | test "atomic store comptime" { |
| 206 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 207 | 198 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 208 | 199 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 209 | 200 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -223,7 +214,6 @@ fn testAtomicStore() !void { |
| 223 | 214 | } |
| 224 | 215 | |
| 225 | 216 | test "atomicrmw with floats" { |
| 226 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 227 | 217 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 228 | 218 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 229 | 219 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -252,7 +242,6 @@ fn testAtomicRmwFloat() !void { |
| 252 | 242 | } |
| 253 | 243 | |
| 254 | 244 | test "atomicrmw with ints" { |
| 255 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 256 | 245 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 257 | 246 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 258 | 247 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -287,7 +276,6 @@ fn testAtomicRmwInt() !void { |
| 287 | 276 | } |
| 288 | 277 | |
| 289 | 278 | test "atomics with different types" { |
| 290 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 291 | 279 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 292 | 280 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 293 | 281 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -318,7 +306,6 @@ fn testAtomicsWithType(comptime T: type, a: T, b: T) !void { |
| 318 | 306 | } |
| 319 | 307 | |
| 320 | 308 | test "return @atomicStore, using it as a void value" { |
| 321 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 322 | 309 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 323 | 310 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 324 | 311 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
test/behavior/bugs/13068.zig-1| ... | ... | @@ -7,7 +7,6 @@ var list = std.ArrayList(u32).init(allocator); |
| 7 | 7 | test { |
| 8 | 8 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 9 | 9 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 10 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 11 | 10 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 12 | 11 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 13 | 12 |
test/behavior/defer.zig-1| ... | ... | @@ -108,7 +108,6 @@ test "mixing normal and error defers" { |
| 108 | 108 | } |
| 109 | 109 | |
| 110 | 110 | test "errdefer with payload" { |
| 111 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 112 | 111 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 113 | 112 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 114 | 113 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
test/behavior/eval.zig-1| ... | ... | @@ -531,7 +531,6 @@ test "@tagName of @typeInfo" { |
| 531 | 531 | } |
| 532 | 532 | |
| 533 | 533 | test "static eval list init" { |
| 534 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 535 | 534 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 536 | 535 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 537 | 536 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
test/behavior/packed-struct.zig-3| ... | ... | @@ -150,7 +150,6 @@ test "consistent size of packed structs" { |
| 150 | 150 | |
| 151 | 151 | test "correct sizeOf and offsets in packed structs" { |
| 152 | 152 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; |
| 153 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 154 | 153 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 155 | 154 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 156 | 155 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -221,7 +220,6 @@ test "correct sizeOf and offsets in packed structs" { |
| 221 | 220 | |
| 222 | 221 | test "nested packed structs" { |
| 223 | 222 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; |
| 224 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 225 | 223 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 226 | 224 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 227 | 225 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -270,7 +268,6 @@ test "nested packed structs" { |
| 270 | 268 | |
| 271 | 269 | test "regular in irregular packed struct" { |
| 272 | 270 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; |
| 273 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | |
| 274 | 271 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 275 | 272 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 276 | 273 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
test/behavior/packed_struct_explicit_backing_int.zig-1| ... | ... | @@ -6,7 +6,6 @@ const native_endian = builtin.cpu.arch.endian(); |
| 6 | 6 | |
| 7 | 7 | test "packed struct explicit backing integer" { |
| 8 | 8 | assert(builtin.zig_backend != .stage1); |
| 9 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 10 | 9 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 11 | 10 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 12 | 11 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
test/behavior/pointers.zig-2| ... | ... | @@ -157,7 +157,6 @@ test "implicit casting between C pointer and optional non-C pointer" { |
| 157 | 157 | } |
| 158 | 158 | |
| 159 | 159 | test "implicit cast error unions with non-optional to optional pointer" { |
| 160 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 161 | 160 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 162 | 161 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 163 | 162 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -403,7 +402,6 @@ test "@ptrToInt on null optional at comptime" { |
| 403 | 402 | } |
| 404 | 403 | |
| 405 | 404 | test "indexing array with sentinel returns correct type" { |
| 406 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 407 | 405 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 408 | 406 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 409 | 407 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
test/behavior/struct.zig-2| ... | ... | @@ -339,7 +339,6 @@ fn testPassSliceOfEmptyStructToFn(slice: []const EmptyStruct2) usize { |
| 339 | 339 | |
| 340 | 340 | test "self-referencing struct via array member" { |
| 341 | 341 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 342 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 343 | 342 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 344 | 343 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 345 | 344 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -978,7 +977,6 @@ test "comptime struct field" { |
| 978 | 977 | } |
| 979 | 978 | |
| 980 | 979 | test "tuple element initialized with fn call" { |
| 981 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 982 | 980 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 983 | 981 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 984 | 982 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
test/behavior/switch.zig-3| ... | ... | @@ -420,7 +420,6 @@ test "else prong of switch on error set excludes other cases" { |
| 420 | 420 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 421 | 421 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 422 | 422 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 423 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 424 | 423 | |
| 425 | 424 | const S = struct { |
| 426 | 425 | fn doTheTest() !void { |
| ... | ... | @@ -455,7 +454,6 @@ test "switch prongs with error set cases make a new error set type for capture v |
| 455 | 454 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 456 | 455 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 457 | 456 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 458 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 459 | 457 | |
| 460 | 458 | const S = struct { |
| 461 | 459 | fn doTheTest() !void { |
| ... | ... | @@ -621,7 +619,6 @@ test "switch capture copies its payload" { |
| 621 | 619 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 622 | 620 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 623 | 621 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 624 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 625 | 622 | |
| 626 | 623 | const S = struct { |
| 627 | 624 | fn doTheTest() !void { |
test/behavior/translate_c_macros.zig-4| ... | ... | @@ -21,7 +21,6 @@ test "casting to void with a macro" { |
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | test "initializer list expression" { |
| 24 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 25 | 24 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 26 | 25 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 27 | 26 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -48,7 +47,6 @@ test "reference to a struct type" { |
| 48 | 47 | test "cast negative integer to pointer" { |
| 49 | 48 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 50 | 49 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 51 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 52 | 50 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 53 | 51 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 54 | 52 | |
| ... | ... | @@ -93,7 +91,6 @@ test "casting or calling a value with a paren-surrounded macro" { |
| 93 | 91 | test "nested comma operator" { |
| 94 | 92 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 95 | 93 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 96 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 97 | 94 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 98 | 95 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 99 | 96 | |
| ... | ... | @@ -117,7 +114,6 @@ test "cast functions" { |
| 117 | 114 | test "large integer macro" { |
| 118 | 115 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 119 | 116 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 120 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 121 | 117 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 122 | 118 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 123 | 119 |
test/behavior/type.zig-3| ... | ... | @@ -200,7 +200,6 @@ test "Type.ErrorUnion" { |
| 200 | 200 | |
| 201 | 201 | test "Type.Opaque" { |
| 202 | 202 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 203 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 204 | 203 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 205 | 204 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 206 | 205 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -350,7 +349,6 @@ test "Type.Struct" { |
| 350 | 349 | } |
| 351 | 350 | |
| 352 | 351 | test "Type.Enum" { |
| 353 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 354 | 352 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 355 | 353 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 356 | 354 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| ... | ... | @@ -395,7 +393,6 @@ test "Type.Enum" { |
| 395 | 393 | |
| 396 | 394 | test "Type.Union" { |
| 397 | 395 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 398 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 399 | 396 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 400 | 397 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 401 | 398 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
test/behavior/union.zig-1| ... | ... | @@ -1056,7 +1056,6 @@ test "containers with single-field enums" { |
| 1056 | 1056 | } |
| 1057 | 1057 | |
| 1058 | 1058 | test "@unionInit on union with tag but no fields" { |
| 1059 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | |
| 1060 | 1059 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1061 | 1060 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1062 | 1061 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |