authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-09 16:03:20-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-03-09 16:03:20-05:00
log2aa4a32097392c869fe2ef58f372a960c0268859
tree18a320927655ba151a658a7003693a825dde96f1
parentb936fe0a5855872814c9f70f958363f64896217b
parent90f08a69aaf8b5d6c36faa92d605afcd5fde0002
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #11105 from Luukdegram/wasm-misc

stage2: wasm - miscellaneous improvements

29 files changed, 347 insertions(+), 68 deletions(-)

src/arch/wasm/CodeGen.zig+136-32
...@@ -212,7 +212,8 @@ fn buildOpcode(args: OpcodeBuildArguments) wasm.Opcode {...@@ -212,7 +212,8 @@ fn buildOpcode(args: OpcodeBuildArguments) wasm.Opcode {
212 16 => switch (args.valtype1.?) {212 16 => switch (args.valtype1.?) {
213 .i32 => if (args.signedness.? == .signed) return .i32_load16_s else return .i32_load16_u,213 .i32 => if (args.signedness.? == .signed) return .i32_load16_s else return .i32_load16_u,
214 .i64 => if (args.signedness.? == .signed) return .i64_load16_s else return .i64_load16_u,214 .i64 => if (args.signedness.? == .signed) return .i64_load16_s else return .i64_load16_u,
215 .f32, .f64 => unreachable,215 .f32 => return .f32_load,
216 .f64 => unreachable,
216 },217 },
217 32 => switch (args.valtype1.?) {218 32 => switch (args.valtype1.?) {
218 .i64 => if (args.signedness.? == .signed) return .i64_load32_s else return .i64_load32_u,219 .i64 => if (args.signedness.? == .signed) return .i64_load32_s else return .i64_load32_u,
...@@ -242,7 +243,8 @@ fn buildOpcode(args: OpcodeBuildArguments) wasm.Opcode {...@@ -242,7 +243,8 @@ fn buildOpcode(args: OpcodeBuildArguments) wasm.Opcode {
242 16 => switch (args.valtype1.?) {243 16 => switch (args.valtype1.?) {
243 .i32 => return .i32_store16,244 .i32 => return .i32_store16,
244 .i64 => return .i64_store16,245 .i64 => return .i64_store16,
245 .f32, .f64 => unreachable,246 .f32 => return .f32_store,
247 .f64 => unreachable,
246 },248 },
247 32 => switch (args.valtype1.?) {249 32 => switch (args.valtype1.?) {
248 .i64 => return .i64_store32,250 .i64 => return .i64_store32,
...@@ -1064,7 +1066,7 @@ fn allocStackPtr(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1064,7 +1066,7 @@ fn allocStackPtr(self: *Self, inst: Air.Inst.Index) !WValue {
1064}1066}
10651067
1066/// From given zig bitsize, returns the wasm bitsize1068/// From given zig bitsize, returns the wasm bitsize
1067fn toWasmIntBits(bits: u16) ?u16 {1069fn toWasmBits(bits: u16) ?u16 {
1068 return for ([_]u16{ 32, 64 }) |wasm_bits| {1070 return for ([_]u16{ 32, 64 }) |wasm_bits| {
1069 if (bits <= wasm_bits) return wasm_bits;1071 if (bits <= wasm_bits) return wasm_bits;
1070 } else null;1072 } else null;
...@@ -1120,11 +1122,11 @@ fn isByRef(ty: Type, target: std.Target) bool {...@@ -1120,11 +1122,11 @@ fn isByRef(ty: Type, target: std.Target) bool {
1120 .ErrorSet,1122 .ErrorSet,
1121 .Fn,1123 .Fn,
1122 .Enum,1124 .Enum,
1123 .Vector,
1124 .AnyFrame,1125 .AnyFrame,
1125 => return false,1126 => return false,
11261127
1127 .Array,1128 .Array,
1129 .Vector,
1128 .Struct,1130 .Struct,
1129 .Frame,1131 .Frame,
1130 .Union,1132 .Union,
...@@ -1155,22 +1157,24 @@ fn isByRef(ty: Type, target: std.Target) bool {...@@ -1155,22 +1157,24 @@ fn isByRef(ty: Type, target: std.Target) bool {
1155/// local value to store the pointer. This allows for local re-use and improves binary size.1157/// local value to store the pointer. This allows for local re-use and improves binary size.
1156fn buildPointerOffset(self: *Self, ptr_value: WValue, offset: u64, action: enum { modify, new }) InnerError!WValue {1158fn buildPointerOffset(self: *Self, ptr_value: WValue, offset: u64, action: enum { modify, new }) InnerError!WValue {
1157 // do not perform arithmetic when offset is 0.1159 // do not perform arithmetic when offset is 0.
1158 if (offset == 0 and ptr_value.offset() == 0) return ptr_value;1160 if (offset == 0 and ptr_value.offset() == 0 and action == .modify) return ptr_value;
1159 const result_ptr: WValue = switch (action) {1161 const result_ptr: WValue = switch (action) {
1160 .new => try self.allocLocal(Type.usize),1162 .new => try self.allocLocal(Type.usize),
1161 .modify => ptr_value,1163 .modify => ptr_value,
1162 };1164 };
1163 try self.emitWValue(ptr_value);1165 try self.emitWValue(ptr_value);
1164 switch (self.arch()) {1166 if (offset + ptr_value.offset() > 0) {
1165 .wasm32 => {1167 switch (self.arch()) {
1166 try self.addImm32(@bitCast(i32, @intCast(u32, offset + ptr_value.offset())));1168 .wasm32 => {
1167 try self.addTag(.i32_add);1169 try self.addImm32(@bitCast(i32, @intCast(u32, offset + ptr_value.offset())));
1168 },1170 try self.addTag(.i32_add);
1169 .wasm64 => {1171 },
1170 try self.addImm64(offset + ptr_value.offset());1172 .wasm64 => {
1171 try self.addTag(.i64_add);1173 try self.addImm64(offset + ptr_value.offset());
1172 },1174 try self.addTag(.i64_add);
1173 else => unreachable,1175 },
1176 else => unreachable,
1177 }
1174 }1178 }
1175 try self.addLabel(.local_set, result_ptr.local);1179 try self.addLabel(.local_set, result_ptr.local);
1176 return result_ptr;1180 return result_ptr;
...@@ -1218,6 +1222,8 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1218,6 +1222,8 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1218 .cond_br => self.airCondBr(inst),1222 .cond_br => self.airCondBr(inst),
1219 .dbg_stmt => WValue.none,1223 .dbg_stmt => WValue.none,
1220 .intcast => self.airIntcast(inst),1224 .intcast => self.airIntcast(inst),
1225 .fptrunc => self.airFptrunc(inst),
1226 .fpext => self.airFpext(inst),
1221 .float_to_int => self.airFloatToInt(inst),1227 .float_to_int => self.airFloatToInt(inst),
1222 .get_union_tag => self.airGetUnionTag(inst),1228 .get_union_tag => self.airGetUnionTag(inst),
12231229
...@@ -1263,6 +1269,7 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1263,6 +1269,7 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1263 .struct_field_ptr_index_2 => self.airStructFieldPtrIndex(inst, 2),1269 .struct_field_ptr_index_2 => self.airStructFieldPtrIndex(inst, 2),
1264 .struct_field_ptr_index_3 => self.airStructFieldPtrIndex(inst, 3),1270 .struct_field_ptr_index_3 => self.airStructFieldPtrIndex(inst, 3),
1265 .struct_field_val => self.airStructFieldVal(inst),1271 .struct_field_val => self.airStructFieldVal(inst),
1272 .field_parent_ptr => self.airFieldParentPtr(inst),
12661273
1267 .switch_br => self.airSwitchBr(inst),1274 .switch_br => self.airSwitchBr(inst),
1268 .trunc => self.airTrunc(inst),1275 .trunc => self.airTrunc(inst),
...@@ -1273,6 +1280,7 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1273,6 +1280,7 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1273 .unwrap_errunion_err => self.airUnwrapErrUnionError(inst),1280 .unwrap_errunion_err => self.airUnwrapErrUnionError(inst),
1274 .wrap_errunion_payload => self.airWrapErrUnionPayload(inst),1281 .wrap_errunion_payload => self.airWrapErrUnionPayload(inst),
1275 .wrap_errunion_err => self.airWrapErrUnionErr(inst),1282 .wrap_errunion_err => self.airWrapErrUnionErr(inst),
1283 .errunion_payload_ptr_set => self.airErrUnionPayloadPtrSet(inst),
12761284
1277 .wasm_memory_size => self.airWasmMemorySize(inst),1285 .wasm_memory_size => self.airWasmMemorySize(inst),
1278 .wasm_memory_grow => self.airWasmMemoryGrow(inst),1286 .wasm_memory_grow => self.airWasmMemoryGrow(inst),
...@@ -1297,8 +1305,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1297,8 +1305,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1297 .bit_reverse,1305 .bit_reverse,
1298 .is_err_ptr,1306 .is_err_ptr,
1299 .is_non_err_ptr,1307 .is_non_err_ptr,
1300 .fptrunc,
1301 .fpext,
1302 .unwrap_errunion_payload_ptr,1308 .unwrap_errunion_payload_ptr,
1303 .unwrap_errunion_err_ptr,1309 .unwrap_errunion_err_ptr,
13041310
...@@ -1331,8 +1337,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {...@@ -1331,8 +1337,6 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
1331 .atomic_rmw,1337 .atomic_rmw,
1332 .tag_name,1338 .tag_name,
1333 .error_name,1339 .error_name,
1334 .errunion_payload_ptr_set,
1335 .field_parent_ptr,
1336 .mul_add,1340 .mul_add,
13371341
1338 // For these 4, probably best to wait until https://github.com/ziglang/zig/issues/102481342 // For these 4, probably best to wait until https://github.com/ziglang/zig/issues/10248
...@@ -1370,7 +1374,10 @@ fn airRet(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -1370,7 +1374,10 @@ fn airRet(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
13701374
1371fn airRetPtr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {1375fn airRetPtr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
1372 const child_type = self.air.typeOfIndex(inst).childType();1376 const child_type = self.air.typeOfIndex(inst).childType();
1373 if (child_type.abiSize(self.target) == 0) return WValue{ .none = {} };1377
1378 if (!child_type.isFnOrHasRuntimeBits()) {
1379 return self.allocStack(Type.usize); // create pointer to void
1380 }
13741381
1375 if (isByRef(child_type, self.target)) {1382 if (isByRef(child_type, self.target)) {
1376 return self.return_value;1383 return self.return_value;
...@@ -1513,7 +1520,7 @@ fn store(self: *Self, lhs: WValue, rhs: WValue, ty: Type, offset: u32) InnerErro...@@ -1513,7 +1520,7 @@ fn store(self: *Self, lhs: WValue, rhs: WValue, ty: Type, offset: u32) InnerErro
15131520
1514 return self.memCopy(ty, lhs, rhs);1521 return self.memCopy(ty, lhs, rhs);
1515 },1522 },
1516 .Struct, .Array, .Union => {1523 .Struct, .Array, .Union, .Vector => {
1517 return self.memCopy(ty, lhs, rhs);1524 return self.memCopy(ty, lhs, rhs);
1518 },1525 },
1519 .Pointer => {1526 .Pointer => {
...@@ -1886,6 +1893,8 @@ fn valueAsI32(self: Self, val: Value, ty: Type) i32 {...@@ -1886,6 +1893,8 @@ fn valueAsI32(self: Self, val: Value, ty: Type) i32 {
1886 const kv = self.bin_file.base.options.module.?.getErrorValue(val.getError().?) catch unreachable; // passed invalid `Value` to function1893 const kv = self.bin_file.base.options.module.?.getErrorValue(val.getError().?) catch unreachable; // passed invalid `Value` to function
1887 return @bitCast(i32, kv.value);1894 return @bitCast(i32, kv.value);
1888 },1895 },
1896 .Bool => return @intCast(i32, val.toSignedInt()),
1897 .Pointer => return @intCast(i32, val.toSignedInt()),
1889 else => unreachable, // Programmer called this function for an illegal type1898 else => unreachable, // Programmer called this function for an illegal type
1890 }1899 }
1891}1900}
...@@ -2164,8 +2173,8 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -2164,8 +2173,8 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2164 self.gpa.free(case.values);2173 self.gpa.free(case.values);
2165 } else case_list.deinit();2174 } else case_list.deinit();
21662175
2167 var lowest: i32 = 0;2176 var lowest_maybe: ?i32 = null;
2168 var highest: i32 = 0;2177 var highest_maybe: ?i32 = null;
2169 while (case_i < switch_br.data.cases_len) : (case_i += 1) {2178 while (case_i < switch_br.data.cases_len) : (case_i += 1) {
2170 const case = self.air.extraData(Air.SwitchBr.Case, extra_index);2179 const case = self.air.extraData(Air.SwitchBr.Case, extra_index);
2171 const items = @bitCast([]const Air.Inst.Ref, self.air.extra[case.end..][0..case.data.items_len]);2180 const items = @bitCast([]const Air.Inst.Ref, self.air.extra[case.end..][0..case.data.items_len]);
...@@ -2177,11 +2186,11 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -2177,11 +2186,11 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2177 for (items) |ref, i| {2186 for (items) |ref, i| {
2178 const item_val = self.air.value(ref).?;2187 const item_val = self.air.value(ref).?;
2179 const int_val = self.valueAsI32(item_val, target_ty);2188 const int_val = self.valueAsI32(item_val, target_ty);
2180 if (int_val < lowest) {2189 if (lowest_maybe == null or int_val < lowest_maybe.?) {
2181 lowest = int_val;2190 lowest_maybe = int_val;
2182 }2191 }
2183 if (int_val > highest) {2192 if (highest_maybe == null or int_val > highest_maybe.?) {
2184 highest = int_val;2193 highest_maybe = int_val;
2185 }2194 }
2186 values[i] = .{ .integer = int_val, .value = item_val };2195 values[i] = .{ .integer = int_val, .value = item_val };
2187 }2196 }
...@@ -2190,6 +2199,9 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -2190,6 +2199,9 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2190 try self.startBlock(.block, blocktype);2199 try self.startBlock(.block, blocktype);
2191 }2200 }
21922201
2202 // When highest and lowest are null, we have no cases and can use a jump table
2203 const lowest = lowest_maybe orelse 0;
2204 const highest = highest_maybe orelse 0;
2193 // When the highest and lowest values are seperated by '50',2205 // When the highest and lowest values are seperated by '50',
2194 // we define it as sparse and use an if/else-chain, rather than a jump table.2206 // we define it as sparse and use an if/else-chain, rather than a jump table.
2195 // When the target is an integer size larger than u32, we have no way to use the value2207 // When the target is an integer size larger than u32, we have no way to use the value
...@@ -2215,6 +2227,10 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -2215,6 +2227,10 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2215 // we put inside, are atleast 0.2227 // we put inside, are atleast 0.
2216 try self.addImm32(lowest * -1);2228 try self.addImm32(lowest * -1);
2217 try self.addTag(.i32_add);2229 try self.addTag(.i32_add);
2230 } else if (lowest > 0) {
2231 // make the index start from 0 by substracting the lowest value
2232 try self.addImm32(lowest);
2233 try self.addTag(.i32_sub);
2218 }2234 }
22192235
2220 // Account for default branch so always add '1'2236 // Account for default branch so always add '1'
...@@ -2223,12 +2239,13 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -2223,12 +2239,13 @@ fn airSwitchBr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2223 const table_extra_index = try self.addExtra(jump_table);2239 const table_extra_index = try self.addExtra(jump_table);
2224 try self.addInst(.{ .tag = .br_table, .data = .{ .payload = table_extra_index } });2240 try self.addInst(.{ .tag = .br_table, .data = .{ .payload = table_extra_index } });
2225 try self.mir_extra.ensureUnusedCapacity(self.gpa, depth);2241 try self.mir_extra.ensureUnusedCapacity(self.gpa, depth);
2226 while (lowest <= highest) : (lowest += 1) {2242 var value = lowest;
2243 while (value <= highest) : (value += 1) {
2227 // idx represents the branch we jump to2244 // idx represents the branch we jump to
2228 const idx = blk: {2245 const idx = blk: {
2229 for (case_list.items) |case, idx| {2246 for (case_list.items) |case, idx| {
2230 for (case.values) |case_value| {2247 for (case.values) |case_value| {
2231 if (case_value.integer == lowest) break :blk @intCast(u32, idx);2248 if (case_value.integer == value) break :blk @intCast(u32, idx);
2232 }2249 }
2233 }2250 }
2234 break :blk if (has_else_body) case_i else unreachable;2251 break :blk if (has_else_body) case_i else unreachable;
...@@ -2398,9 +2415,9 @@ fn airIntcast(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -2398,9 +2415,9 @@ fn airIntcast(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2398 const ref_info = ref_ty.intInfo(self.target);2415 const ref_info = ref_ty.intInfo(self.target);
2399 const wanted_info = ty.intInfo(self.target);2416 const wanted_info = ty.intInfo(self.target);
24002417
2401 const op_bits = toWasmIntBits(ref_info.bits) orelse2418 const op_bits = toWasmBits(ref_info.bits) orelse
2402 return self.fail("TODO: Wasm intcast integer types of bitsize: {d}", .{ref_info.bits});2419 return self.fail("TODO: Wasm intcast integer types of bitsize: {d}", .{ref_info.bits});
2403 const wanted_bits = toWasmIntBits(wanted_info.bits) orelse2420 const wanted_bits = toWasmBits(wanted_info.bits) orelse
2404 return self.fail("TODO: Wasm intcast integer types of bitsize: {d}", .{wanted_info.bits});2421 return self.fail("TODO: Wasm intcast integer types of bitsize: {d}", .{wanted_info.bits});
24052422
2406 // hot path2423 // hot path
...@@ -2641,7 +2658,7 @@ fn airTrunc(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -2641,7 +2658,7 @@ fn airTrunc(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
2641 const result = try self.allocLocal(self.air.getRefType(ty_op.ty));2658 const result = try self.allocLocal(self.air.getRefType(ty_op.ty));
2642 const op_bits = op_ty.intInfo(self.target).bits;2659 const op_bits = op_ty.intInfo(self.target).bits;
26432660
2644 const wasm_bits = toWasmIntBits(wanted_bits) orelse2661 const wasm_bits = toWasmBits(wanted_bits) orelse
2645 return self.fail("TODO: Implement wasm integer truncation for integer bitsize: {d}", .{wanted_bits});2662 return self.fail("TODO: Implement wasm integer truncation for integer bitsize: {d}", .{wanted_bits});
26462663
2647 // Use wasm's instruction to wrap from 64bit to 32bit integer when possible2664 // Use wasm's instruction to wrap from 64bit to 32bit integer when possible
...@@ -3172,3 +3189,90 @@ fn airGetUnionTag(self: *Self, inst: Air.Inst.Index) InnerError!WValue {...@@ -3172,3 +3189,90 @@ fn airGetUnionTag(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3172 } else @as(u32, 0);3189 } else @as(u32, 0);
3173 return self.load(operand, tag_ty, offset);3190 return self.load(operand, tag_ty, offset);
3174}3191}
3192
3193fn airFpext(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3194 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
3195
3196 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
3197 const dest_ty = self.air.typeOfIndex(inst);
3198 const dest_bits = dest_ty.floatBits(self.target);
3199 const src_bits = self.air.typeOf(ty_op.operand).floatBits(self.target);
3200 const operand = try self.resolveInst(ty_op.operand);
3201
3202 if (dest_bits == 64 and src_bits == 32) {
3203 const result = try self.allocLocal(dest_ty);
3204 try self.emitWValue(operand);
3205 try self.addTag(.f64_promote_f32);
3206 try self.addLabel(.local_set, result.local);
3207 return result;
3208 } else {
3209 // TODO: Emit a call to compiler-rt to extend the float. e.g. __extendhfsf2
3210 return self.fail("TODO: Implement 'fpext' for floats with bitsize: {d}", .{dest_bits});
3211 }
3212}
3213
3214fn airFptrunc(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3215 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
3216
3217 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
3218 const dest_ty = self.air.typeOfIndex(inst);
3219 const dest_bits = dest_ty.floatBits(self.target);
3220 const src_bits = self.air.typeOf(ty_op.operand).floatBits(self.target);
3221 const operand = try self.resolveInst(ty_op.operand);
3222
3223 if (dest_bits == 32 and src_bits == 64) {
3224 const result = try self.allocLocal(dest_ty);
3225 try self.emitWValue(operand);
3226 try self.addTag(.f32_demote_f64);
3227 try self.addLabel(.local_set, result.local);
3228 return result;
3229 } else {
3230 // TODO: Emit a call to compiler-rt to trunc the float. e.g. __truncdfhf2
3231 return self.fail("TODO: Implement 'fptrunc' for floats with bitsize: {d}", .{dest_bits});
3232 }
3233}
3234
3235fn airErrUnionPayloadPtrSet(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3236 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
3237 const err_set_ty = self.air.typeOf(ty_op.operand).childType();
3238 const err_ty = err_set_ty.errorUnionSet();
3239 const payload_ty = err_set_ty.errorUnionPayload();
3240 const operand = try self.resolveInst(ty_op.operand);
3241
3242 // set error-tag to '0' to annotate error union is non-error
3243 try self.store(operand, .{ .imm32 = 0 }, err_ty, 0);
3244
3245 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
3246
3247 if (!payload_ty.hasRuntimeBits()) {
3248 return operand;
3249 }
3250
3251 const err_align = err_set_ty.abiAlignment(self.target);
3252 const set_size = err_ty.abiSize(self.target);
3253 const offset = mem.alignForwardGeneric(u64, set_size, err_align);
3254
3255 return self.buildPointerOffset(operand, @intCast(u32, offset), .new);
3256}
3257
3258fn airFieldParentPtr(self: *Self, inst: Air.Inst.Index) InnerError!WValue {
3259 if (self.liveness.isUnused(inst)) return WValue{ .none = {} };
3260
3261 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
3262 const extra = self.air.extraData(Air.FieldParentPtr, ty_pl.payload).data;
3263 const field_ptr = try self.resolveInst(extra.field_ptr);
3264
3265 const struct_ty = self.air.getRefType(ty_pl.ty).childType();
3266 const field_offset = struct_ty.structFieldOffset(extra.field_index, self.target);
3267
3268 if (field_offset == 0) {
3269 return field_ptr;
3270 }
3271
3272 const base = try self.buildPointerOffset(field_ptr, 0, .new);
3273 try self.addLabel(.local_get, base.local);
3274 try self.addImm32(@bitCast(i32, @intCast(u32, field_offset)));
3275 try self.addTag(.i32_sub);
3276 try self.addLabel(.local_set, base.local);
3277 return base;
3278}
src/arch/wasm/Emit.zig+30
...@@ -153,6 +153,34 @@ pub fn emitMir(emit: *Emit) InnerError!void {...@@ -153,6 +153,34 @@ pub fn emitMir(emit: *Emit) InnerError!void {
153 .i64_shl => try emit.emitTag(tag),153 .i64_shl => try emit.emitTag(tag),
154 .i64_shr_s => try emit.emitTag(tag),154 .i64_shr_s => try emit.emitTag(tag),
155 .i64_shr_u => try emit.emitTag(tag),155 .i64_shr_u => try emit.emitTag(tag),
156 .f32_abs => try emit.emitTag(tag),
157 .f32_neg => try emit.emitTag(tag),
158 .f32_ceil => try emit.emitTag(tag),
159 .f32_floor => try emit.emitTag(tag),
160 .f32_trunc => try emit.emitTag(tag),
161 .f32_nearest => try emit.emitTag(tag),
162 .f32_sqrt => try emit.emitTag(tag),
163 .f32_add => try emit.emitTag(tag),
164 .f32_sub => try emit.emitTag(tag),
165 .f32_mul => try emit.emitTag(tag),
166 .f32_div => try emit.emitTag(tag),
167 .f32_min => try emit.emitTag(tag),
168 .f32_max => try emit.emitTag(tag),
169 .f32_copysign => try emit.emitTag(tag),
170 .f64_abs => try emit.emitTag(tag),
171 .f64_neg => try emit.emitTag(tag),
172 .f64_ceil => try emit.emitTag(tag),
173 .f64_floor => try emit.emitTag(tag),
174 .f64_trunc => try emit.emitTag(tag),
175 .f64_nearest => try emit.emitTag(tag),
176 .f64_sqrt => try emit.emitTag(tag),
177 .f64_add => try emit.emitTag(tag),
178 .f64_sub => try emit.emitTag(tag),
179 .f64_mul => try emit.emitTag(tag),
180 .f64_div => try emit.emitTag(tag),
181 .f64_min => try emit.emitTag(tag),
182 .f64_max => try emit.emitTag(tag),
183 .f64_copysign => try emit.emitTag(tag),
156 .i32_wrap_i64 => try emit.emitTag(tag),184 .i32_wrap_i64 => try emit.emitTag(tag),
157 .i64_extend_i32_s => try emit.emitTag(tag),185 .i64_extend_i32_s => try emit.emitTag(tag),
158 .i64_extend_i32_u => try emit.emitTag(tag),186 .i64_extend_i32_u => try emit.emitTag(tag),
...@@ -161,6 +189,8 @@ pub fn emitMir(emit: *Emit) InnerError!void {...@@ -161,6 +189,8 @@ pub fn emitMir(emit: *Emit) InnerError!void {
161 .i64_extend8_s => try emit.emitTag(tag),189 .i64_extend8_s => try emit.emitTag(tag),
162 .i64_extend16_s => try emit.emitTag(tag),190 .i64_extend16_s => try emit.emitTag(tag),
163 .i64_extend32_s => try emit.emitTag(tag),191 .i64_extend32_s => try emit.emitTag(tag),
192 .f32_demote_f64 => try emit.emitTag(tag),
193 .f64_promote_f32 => try emit.emitTag(tag),
164 .i32_reinterpret_f32 => try emit.emitTag(tag),194 .i32_reinterpret_f32 => try emit.emitTag(tag),
165 .i64_reinterpret_f64 => try emit.emitTag(tag),195 .i64_reinterpret_f64 => try emit.emitTag(tag),
166 .f32_reinterpret_i32 => try emit.emitTag(tag),196 .f32_reinterpret_i32 => try emit.emitTag(tag),
src/arch/wasm/Mir.zig+60
...@@ -369,6 +369,62 @@ pub const Inst = struct {...@@ -369,6 +369,62 @@ pub const Inst = struct {
369 /// Uses `tag`369 /// Uses `tag`
370 i64_shr_u = 0x88,370 i64_shr_u = 0x88,
371 /// Uses `tag`371 /// Uses `tag`
372 f32_abs = 0x8B,
373 /// Uses `tag`
374 f32_neg = 0x8C,
375 /// Uses `tag`
376 f32_ceil = 0x8D,
377 /// Uses `tag`
378 f32_floor = 0x8E,
379 /// Uses `tag`
380 f32_trunc = 0x8F,
381 /// Uses `tag`
382 f32_nearest = 0x90,
383 /// Uses `tag`
384 f32_sqrt = 0x91,
385 /// Uses `tag`
386 f32_add = 0x92,
387 /// Uses `tag`
388 f32_sub = 0x93,
389 /// Uses `tag`
390 f32_mul = 0x94,
391 /// Uses `tag`
392 f32_div = 0x95,
393 /// Uses `tag`
394 f32_min = 0x96,
395 /// Uses `tag`
396 f32_max = 0x97,
397 /// Uses `tag`
398 f32_copysign = 0x98,
399 /// Uses `tag`
400 f64_abs = 0x99,
401 /// Uses `tag`
402 f64_neg = 0x9A,
403 /// Uses `tag`
404 f64_ceil = 0x9B,
405 /// Uses `tag`
406 f64_floor = 0x9C,
407 /// Uses `tag`
408 f64_trunc = 0x9D,
409 /// Uses `tag`
410 f64_nearest = 0x9E,
411 /// Uses `tag`
412 f64_sqrt = 0x9F,
413 /// Uses `tag`
414 f64_add = 0xA0,
415 /// Uses `tag`
416 f64_sub = 0xA1,
417 /// Uses `tag`
418 f64_mul = 0xA2,
419 /// Uses `tag`
420 f64_div = 0xA3,
421 /// Uses `tag`
422 f64_min = 0xA4,
423 /// Uses `tag`
424 f64_max = 0xA5,
425 /// Uses `tag`
426 f64_copysign = 0xA6,
427 /// Uses `tag`
372 i32_wrap_i64 = 0xA7,428 i32_wrap_i64 = 0xA7,
373 /// Uses `tag`429 /// Uses `tag`
374 i32_trunc_f32_s = 0xA8,430 i32_trunc_f32_s = 0xA8,
...@@ -391,6 +447,10 @@ pub const Inst = struct {...@@ -391,6 +447,10 @@ pub const Inst = struct {
391 /// Uses `tag`447 /// Uses `tag`
392 i64_trunc_f64_u = 0xB1,448 i64_trunc_f64_u = 0xB1,
393 /// Uses `tag`449 /// Uses `tag`
450 f32_demote_f64 = 0xB6,
451 /// Uses `tag`
452 f64_promote_f32 = 0xBB,
453 /// Uses `tag`
394 i32_reinterpret_f32 = 0xBC,454 i32_reinterpret_f32 = 0xBC,
395 /// Uses `tag`455 /// Uses `tag`
396 i64_reinterpret_f64 = 0xBD,456 i64_reinterpret_f64 = 0xBD,
test/behavior.zig+21-21
...@@ -18,14 +18,19 @@ test {...@@ -18,14 +18,19 @@ test {
18 _ = @import("behavior/bugs/679.zig");18 _ = @import("behavior/bugs/679.zig");
19 _ = @import("behavior/bugs/704.zig");19 _ = @import("behavior/bugs/704.zig");
20 _ = @import("behavior/bugs/718.zig");20 _ = @import("behavior/bugs/718.zig");
21 _ = @import("behavior/bugs/726.zig");
22 _ = @import("behavior/bugs/828.zig");
21 _ = @import("behavior/bugs/1025.zig");23 _ = @import("behavior/bugs/1025.zig");
22 _ = @import("behavior/bugs/1076.zig");24 _ = @import("behavior/bugs/1076.zig");
23 _ = @import("behavior/bugs/1111.zig");25 _ = @import("behavior/bugs/1111.zig");
24 _ = @import("behavior/bugs/1277.zig");26 _ = @import("behavior/bugs/1277.zig");
25 _ = @import("behavior/bugs/1310.zig");27 _ = @import("behavior/bugs/1310.zig");
26 _ = @import("behavior/bugs/1381.zig");28 _ = @import("behavior/bugs/1381.zig");
29 _ = @import("behavior/bugs/1421.zig");
30 _ = @import("behavior/bugs/1442.zig");
27 _ = @import("behavior/bugs/1486.zig");31 _ = @import("behavior/bugs/1486.zig");
28 _ = @import("behavior/bugs/1500.zig");32 _ = @import("behavior/bugs/1500.zig");
33 _ = @import("behavior/bugs/1607.zig");
29 _ = @import("behavior/bugs/1735.zig");34 _ = @import("behavior/bugs/1735.zig");
30 _ = @import("behavior/bugs/1741.zig");35 _ = @import("behavior/bugs/1741.zig");
31 _ = @import("behavior/bugs/1914.zig");36 _ = @import("behavior/bugs/1914.zig");
...@@ -38,25 +43,34 @@ test {...@@ -38,25 +43,34 @@ test {
38 _ = @import("behavior/bugs/3046.zig");43 _ = @import("behavior/bugs/3046.zig");
39 _ = @import("behavior/bugs/3112.zig");44 _ = @import("behavior/bugs/3112.zig");
40 _ = @import("behavior/bugs/3367.zig");45 _ = @import("behavior/bugs/3367.zig");
46 _ = @import("behavior/bugs/3384.zig");
41 _ = @import("behavior/bugs/3586.zig");47 _ = @import("behavior/bugs/3586.zig");
48 _ = @import("behavior/bugs/3742.zig");
42 _ = @import("behavior/bugs/4328.zig");49 _ = @import("behavior/bugs/4328.zig");
43 _ = @import("behavior/bugs/4560.zig");50 _ = @import("behavior/bugs/4560.zig");
44 _ = @import("behavior/bugs/4769_a.zig");51 _ = @import("behavior/bugs/4769_a.zig");
45 _ = @import("behavior/bugs/4769_b.zig");52 _ = @import("behavior/bugs/4769_b.zig");
46 _ = @import("behavior/bugs/4954.zig");53 _ = @import("behavior/bugs/4954.zig");
54 _ = @import("behavior/bugs/5398.zig");
55 _ = @import("behavior/bugs/5413.zig");
56 _ = @import("behavior/bugs/5474.zig");
57 _ = @import("behavior/bugs/5487.zig");
47 _ = @import("behavior/bugs/6850.zig");58 _ = @import("behavior/bugs/6850.zig");
59 _ = @import("behavior/bugs/7003.zig");
48 _ = @import("behavior/bugs/7250.zig");60 _ = @import("behavior/bugs/7250.zig");
49 _ = @import("behavior/bugs/11100.zig");61 _ = @import("behavior/bugs/11100.zig");
62 _ = @import("behavior/bugs/10970.zig");
50 _ = @import("behavior/call.zig");63 _ = @import("behavior/call.zig");
51 _ = @import("behavior/cast.zig");64 _ = @import("behavior/cast.zig");
52 _ = @import("behavior/comptime_memory.zig");65 _ = @import("behavior/comptime_memory.zig");
53 _ = @import("behavior/defer.zig");66 _ = @import("behavior/defer.zig");
54 _ = @import("behavior/enum.zig");67 _ = @import("behavior/enum.zig");
55 _ = @import("behavior/error.zig");68 _ = @import("behavior/error.zig");
69 _ = @import("behavior/field_parent_ptr.zig");
56 _ = @import("behavior/floatop.zig");70 _ = @import("behavior/floatop.zig");
57 _ = @import("behavior/fn.zig");
58 _ = @import("behavior/fn_delegation.zig");71 _ = @import("behavior/fn_delegation.zig");
59 _ = @import("behavior/fn_in_struct_in_comptime.zig");72 _ = @import("behavior/fn_in_struct_in_comptime.zig");
73 _ = @import("behavior/fn.zig");
60 _ = @import("behavior/for.zig");74 _ = @import("behavior/for.zig");
61 _ = @import("behavior/generics.zig");75 _ = @import("behavior/generics.zig");
62 _ = @import("behavior/hasdecl.zig");76 _ = @import("behavior/hasdecl.zig");
...@@ -69,6 +83,7 @@ test {...@@ -69,6 +83,7 @@ test {
69 _ = @import("behavior/ir_block_deps.zig");83 _ = @import("behavior/ir_block_deps.zig");
70 _ = @import("behavior/math.zig");84 _ = @import("behavior/math.zig");
71 _ = @import("behavior/member_func.zig");85 _ = @import("behavior/member_func.zig");
86 _ = @import("behavior/merge_error_sets.zig");
72 _ = @import("behavior/muladd.zig");87 _ = @import("behavior/muladd.zig");
73 _ = @import("behavior/namespace_depends_on_compile_var.zig");88 _ = @import("behavior/namespace_depends_on_compile_var.zig");
74 _ = @import("behavior/null.zig");89 _ = @import("behavior/null.zig");
...@@ -79,10 +94,14 @@ test {...@@ -79,10 +94,14 @@ test {
79 _ = @import("behavior/pub_enum.zig");94 _ = @import("behavior/pub_enum.zig");
80 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");95 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
81 _ = @import("behavior/reflection.zig");96 _ = @import("behavior/reflection.zig");
82 _ = @import("behavior/slice.zig");97 _ = @import("behavior/sizeof_and_typeof.zig");
83 _ = @import("behavior/slice_sentinel_comptime.zig");98 _ = @import("behavior/slice_sentinel_comptime.zig");
99 _ = @import("behavior/slice.zig");
84 _ = @import("behavior/src.zig");100 _ = @import("behavior/src.zig");
101 _ = @import("behavior/struct_contains_null_ptr_itself.zig");
85 _ = @import("behavior/struct.zig");102 _ = @import("behavior/struct.zig");
103 _ = @import("behavior/switch_prong_err_enum.zig");
104 _ = @import("behavior/switch_prong_implicit_cast.zig");
86 _ = @import("behavior/switch.zig");105 _ = @import("behavior/switch.zig");
87 _ = @import("behavior/this.zig");106 _ = @import("behavior/this.zig");
88 _ = @import("behavior/truncate.zig");107 _ = @import("behavior/truncate.zig");
...@@ -113,22 +132,11 @@ test {...@@ -113,22 +132,11 @@ test {
113 {132 {
114 // Tests that pass for stage1, llvm backend, C backend133 // Tests that pass for stage1, llvm backend, C backend
115 _ = @import("behavior/bugs/421.zig");134 _ = @import("behavior/bugs/421.zig");
116 _ = @import("behavior/bugs/726.zig");
117 _ = @import("behavior/bugs/828.zig");
118 _ = @import("behavior/bugs/1421.zig");
119 _ = @import("behavior/bugs/1607.zig");
120 _ = @import("behavior/bugs/3384.zig");
121 _ = @import("behavior/bugs/5398.zig");
122 _ = @import("behavior/bugs/5413.zig");
123 _ = @import("behavior/bugs/5474.zig");
124 _ = @import("behavior/bugs/7003.zig");
125 _ = @import("behavior/bugs/9584.zig");135 _ = @import("behavior/bugs/9584.zig");
126 _ = @import("behavior/bugs/10970.zig");
127 _ = @import("behavior/cast_int.zig");136 _ = @import("behavior/cast_int.zig");
128 _ = @import("behavior/eval.zig");137 _ = @import("behavior/eval.zig");
129 _ = @import("behavior/export_self_referential_type_info.zig");138 _ = @import("behavior/export_self_referential_type_info.zig");
130 _ = @import("behavior/int128.zig");139 _ = @import("behavior/int128.zig");
131 _ = @import("behavior/merge_error_sets.zig");
132 _ = @import("behavior/translate_c_macros.zig");140 _ = @import("behavior/translate_c_macros.zig");
133141
134 if (builtin.zig_backend != .stage2_c) {142 if (builtin.zig_backend != .stage2_c) {
...@@ -137,17 +145,9 @@ test {...@@ -137,17 +145,9 @@ test {
137 _ = @import("behavior/maximum_minimum.zig");145 _ = @import("behavior/maximum_minimum.zig");
138 _ = @import("behavior/popcount.zig");146 _ = @import("behavior/popcount.zig");
139 _ = @import("behavior/saturating_arithmetic.zig");147 _ = @import("behavior/saturating_arithmetic.zig");
140 _ = @import("behavior/sizeof_and_typeof.zig");
141 _ = @import("behavior/widening.zig");148 _ = @import("behavior/widening.zig");
142 _ = @import("behavior/bugs/1442.zig");
143 _ = @import("behavior/bugs/2114.zig");149 _ = @import("behavior/bugs/2114.zig");
144 _ = @import("behavior/bugs/3742.zig");
145 _ = @import("behavior/bugs/5487.zig");
146 _ = @import("behavior/struct_contains_null_ptr_itself.zig");
147 _ = @import("behavior/switch_prong_err_enum.zig");
148 _ = @import("behavior/switch_prong_implicit_cast.zig");
149 _ = @import("behavior/union_with_members.zig");150 _ = @import("behavior/union_with_members.zig");
150 _ = @import("behavior/field_parent_ptr.zig");
151151
152 if (builtin.zig_backend == .stage1) {152 if (builtin.zig_backend == .stage1) {
153 // Tests that only pass for the stage1 backend.153 // Tests that only pass for the stage1 backend.
test/behavior/align.zig-3
...@@ -158,7 +158,6 @@ fn give() anyerror!u128 {...@@ -158,7 +158,6 @@ fn give() anyerror!u128 {
158158
159test "page aligned array on stack" {159test "page aligned array on stack" {
160 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;160 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
161 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
162 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;161 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
163 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;162 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
164163
...@@ -359,7 +358,6 @@ test "read 128-bit field from default aligned struct in global memory" {...@@ -359,7 +358,6 @@ test "read 128-bit field from default aligned struct in global memory" {
359test "struct field explicit alignment" {358test "struct field explicit alignment" {
360 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;359 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
361 if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;360 if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
362 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
363 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;361 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
364 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;362 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
365 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;363 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
...@@ -411,7 +409,6 @@ test "align(N) on functions" {...@@ -411,7 +409,6 @@ test "align(N) on functions" {
411 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;409 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
412 if (builtin.zig_backend == .stage1) return error.SkipZigTest;410 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
413 if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;411 if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
414 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
415 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;412 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
416 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;413 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
417 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;414 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
test/behavior/bugs/10970.zig+4
...@@ -4,6 +4,10 @@ fn retOpt() ?u32 {...@@ -4,6 +4,10 @@ fn retOpt() ?u32 {
4 return null;4 return null;
5}5}
6test {6test {
7 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
9 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
10 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
7 var cond = true;11 var cond = true;
8 const opt = while (cond) {12 const opt = while (cond) {
9 if (retOpt()) |opt| {13 if (retOpt()) |opt| {
test/behavior/bugs/1421.zig+5
...@@ -1,5 +1,6 @@...@@ -1,5 +1,6 @@
1const std = @import("std");1const std = @import("std");
2const expect = std.testing.expect;2const expect = std.testing.expect;
3const builtin = @import("builtin");
34
4const S = struct {5const S = struct {
5 fn method() std.builtin.Type {6 fn method() std.builtin.Type {
...@@ -8,6 +9,10 @@ const S = struct {...@@ -8,6 +9,10 @@ const S = struct {
8};9};
910
10test "functions with return type required to be comptime are generic" {11test "functions with return type required to be comptime are generic" {
12 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
13 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
14 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
15 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
11 const ti = S.method();16 const ti = S.method();
12 try expect(@as(std.builtin.TypeId, ti) == std.builtin.TypeId.Struct);17 try expect(@as(std.builtin.TypeId, ti) == std.builtin.TypeId.Struct);
13}18}
test/behavior/bugs/1442.zig+4
...@@ -7,6 +7,10 @@ const Union = union(enum) {...@@ -7,6 +7,10 @@ const Union = union(enum) {
7};7};
88
9test "const error union field alignment" {9test "const error union field alignment" {
10 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
11 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
12 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
13 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
10 var union_or_err: anyerror!Union = Union{ .Color = 1234 };14 var union_or_err: anyerror!Union = Union{ .Color = 1234 };
11 try std.testing.expect((union_or_err catch unreachable).Color == 1234);15 try std.testing.expect((union_or_err catch unreachable).Color == 1234);
12}16}
test/behavior/bugs/1607.zig+5
...@@ -1,5 +1,6 @@...@@ -1,5 +1,6 @@
1const std = @import("std");1const std = @import("std");
2const testing = std.testing;2const testing = std.testing;
3const builtin = @import("builtin");
34
4const a = [_]u8{ 1, 2, 3 };5const a = [_]u8{ 1, 2, 3 };
56
...@@ -10,6 +11,10 @@ fn checkAddress(s: []const u8) !void {...@@ -10,6 +11,10 @@ fn checkAddress(s: []const u8) !void {
10}11}
1112
12test "slices pointing at the same address as global array." {13test "slices pointing at the same address as global array." {
14 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
15 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
16 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
17 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
13 try checkAddress(&a);18 try checkAddress(&a);
14 comptime try checkAddress(&a);19 comptime try checkAddress(&a);
15}20}
test/behavior/bugs/3742.zig+5
...@@ -1,4 +1,5 @@...@@ -1,4 +1,5 @@
1const std = @import("std");1const std = @import("std");
2const builtin = @import("builtin");
23
3pub const GET = struct {4pub const GET = struct {
4 key: []const u8,5 key: []const u8,
...@@ -34,5 +35,9 @@ pub const ArgSerializer = struct {...@@ -34,5 +35,9 @@ pub const ArgSerializer = struct {
34};35};
3536
36test "fixed" {37test "fixed" {
38 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
39 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
40 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
41 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
37 ArgSerializer.serializeCommand(GET.init("banana"));42 ArgSerializer.serializeCommand(GET.init("banana"));
38}43}
test/behavior/bugs/5398.zig+5
...@@ -1,5 +1,6 @@...@@ -1,5 +1,6 @@
1const std = @import("std");1const std = @import("std");
2const testing = std.testing;2const testing = std.testing;
3const builtin = @import("builtin");
34
4pub const Mesh = struct {5pub const Mesh = struct {
5 id: u32,6 id: u32,
...@@ -18,6 +19,10 @@ pub const Renderable = struct {...@@ -18,6 +19,10 @@ pub const Renderable = struct {
18var renderable: Renderable = undefined;19var renderable: Renderable = undefined;
1920
20test "assignment of field with padding" {21test "assignment of field with padding" {
22 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
23 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
24 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
25 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
21 renderable = Renderable{26 renderable = Renderable{
22 .mesh = Mesh{ .id = 0 },27 .mesh = Mesh{ .id = 0 },
23 .material = Material{28 .material = Material{
test/behavior/bugs/5474.zig+8
...@@ -49,11 +49,19 @@ fn constant() !void {...@@ -49,11 +49,19 @@ fn constant() !void {
49}49}
5050
51test "pointer-to-array constness for zero-size elements, var" {51test "pointer-to-array constness for zero-size elements, var" {
52 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
53 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
54 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
55 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
52 try mutable();56 try mutable();
53 comptime try mutable();57 comptime try mutable();
54}58}
5559
56test "pointer-to-array constness for zero-size elements, const" {60test "pointer-to-array constness for zero-size elements, const" {
61 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
62 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
63 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
64 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
57 try constant();65 try constant();
58 comptime try constant();66 comptime try constant();
59}67}
test/behavior/bugs/5487.zig+5
...@@ -1,4 +1,5 @@...@@ -1,4 +1,5 @@
1const io = @import("std").io;1const io = @import("std").io;
2const builtin = @import("builtin");
23
3pub fn write(_: void, bytes: []const u8) !usize {4pub fn write(_: void, bytes: []const u8) !usize {
4 _ = bytes;5 _ = bytes;
...@@ -9,5 +10,9 @@ pub fn writer() io.Writer(void, @typeInfo(@typeInfo(@TypeOf(write)).Fn.return_ty...@@ -9,5 +10,9 @@ pub fn writer() io.Writer(void, @typeInfo(@typeInfo(@TypeOf(write)).Fn.return_ty
9}10}
1011
11test "crash" {12test "crash" {
13 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
14 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
15 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
16 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
12 _ = io.multiWriter(.{writer()});17 _ = io.multiWriter(.{writer()});
13}18}
test/behavior/bugs/726.zig+11
...@@ -1,12 +1,23 @@...@@ -1,12 +1,23 @@
1const expect = @import("std").testing.expect;1const expect = @import("std").testing.expect;
2const builtin = @import("builtin");
23
3test "@ptrCast from const to nullable" {4test "@ptrCast from const to nullable" {
5 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
6 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
9
4 const c: u8 = 4;10 const c: u8 = 4;
5 var x: ?*const u8 = @ptrCast(?*const u8, &c);11 var x: ?*const u8 = @ptrCast(?*const u8, &c);
6 try expect(x.?.* == 4);12 try expect(x.?.* == 4);
7}13}
814
9test "@ptrCast from var in empty struct to nullable" {15test "@ptrCast from var in empty struct to nullable" {
16 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
17 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
18 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
19 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
20
10 const container = struct {21 const container = struct {
11 var c: u8 = 4;22 var c: u8 = 4;
12 };23 };
test/behavior/bugs/828.zig+5
...@@ -1,3 +1,5 @@...@@ -1,3 +1,5 @@
1const builtin = @import("builtin");
2
1const CountBy = struct {3const CountBy = struct {
2 a: usize,4 a: usize,
35
...@@ -28,6 +30,9 @@ fn constCount(comptime cb: *const CountBy, comptime unused: u32) void {...@@ -28,6 +30,9 @@ fn constCount(comptime cb: *const CountBy, comptime unused: u32) void {
28}30}
2931
30test "comptime struct return should not return the same instance" {32test "comptime struct return should not return the same instance" {
33 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
34 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
35
31 //the first parameter must be passed by reference to trigger the bug36 //the first parameter must be passed by reference to trigger the bug
32 //a second parameter is required to trigger the bug37 //a second parameter is required to trigger the bug
33 const ValA = constCount(&CountBy.One, 12);38 const ValA = constCount(&CountBy.One, 12);
test/behavior/enum.zig-1
...@@ -938,7 +938,6 @@ test "constant enum initialization with differing sizes" {...@@ -938,7 +938,6 @@ test "constant enum initialization with differing sizes" {
938 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;938 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
939 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;939 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
940 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;940 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
941 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
942941
943 try test3_1(test3_foo);942 try test3_1(test3_foo);
944 try test3_2(test3_bar);943 try test3_2(test3_bar);
test/behavior/error.zig-3
...@@ -156,7 +156,6 @@ fn bar2() (error{}!void) {}...@@ -156,7 +156,6 @@ fn bar2() (error{}!void) {}
156156
157test "error union type " {157test "error union type " {
158 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO158 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
159 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
160159
161 try testErrorUnionType();160 try testErrorUnionType();
162 comptime try testErrorUnionType();161 comptime try testErrorUnionType();
...@@ -199,7 +198,6 @@ fn testErrorSetType() !void {...@@ -199,7 +198,6 @@ fn testErrorSetType() !void {
199test "explicit error set cast" {198test "explicit error set cast" {
200 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO199 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
201 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO200 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
202 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
203201
204 try testExplicitErrorSetCast(Set1.A);202 try testExplicitErrorSetCast(Set1.A);
205 comptime try testExplicitErrorSetCast(Set1.A);203 comptime try testExplicitErrorSetCast(Set1.A);
...@@ -296,7 +294,6 @@ test "error: Infer error set from literals" {...@@ -296,7 +294,6 @@ test "error: Infer error set from literals" {
296 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;294 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
297 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO295 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
298 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO296 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
299 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
300297
301 _ = nullLiteral("n") catch |err| handleErrors(err);298 _ = nullLiteral("n") catch |err| handleErrors(err);
302 _ = floatLiteral("n") catch |err| handleErrors(err);299 _ = floatLiteral("n") catch |err| handleErrors(err);
test/behavior/field_parent_ptr.zig+9
...@@ -1,11 +1,20 @@...@@ -1,11 +1,20 @@
1const expect = @import("std").testing.expect;1const expect = @import("std").testing.expect;
2const builtin = @import("builtin");
23
3test "@fieldParentPtr non-first field" {4test "@fieldParentPtr non-first field" {
5 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
6 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
4 try testParentFieldPtr(&foo.c);9 try testParentFieldPtr(&foo.c);
5 comptime try testParentFieldPtr(&foo.c);10 comptime try testParentFieldPtr(&foo.c);
6}11}
712
8test "@fieldParentPtr first field" {13test "@fieldParentPtr first field" {
14 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
15 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
16 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
17 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
9 try testParentFieldPtrFirst(&foo.a);18 try testParentFieldPtrFirst(&foo.a);
10 comptime try testParentFieldPtrFirst(&foo.a);19 comptime try testParentFieldPtrFirst(&foo.a);
11}20}
test/behavior/math.zig-1
...@@ -191,7 +191,6 @@ test "const number literal" {...@@ -191,7 +191,6 @@ test "const number literal" {
191const ten = 10;191const ten = 10;
192192
193test "float equality" {193test "float equality" {
194 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
195 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO194 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
196 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO195 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
197 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO196 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
test/behavior/merge_error_sets.zig+5
...@@ -1,3 +1,4 @@...@@ -1,3 +1,4 @@
1const builtin = @import("builtin");
1const A = error{2const A = error{
2 FileNotFound,3 FileNotFound,
3 NotDir,4 NotDir,
...@@ -11,6 +12,10 @@ fn foo() C!void {...@@ -11,6 +12,10 @@ fn foo() C!void {
11}12}
1213
13test "merge error sets" {14test "merge error sets" {
15 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
16 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
17 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
18 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
14 if (foo()) {19 if (foo()) {
15 @panic("unexpected");20 @panic("unexpected");
16 } else |err| switch (err) {21 } else |err| switch (err) {
test/behavior/null.zig-1
...@@ -182,7 +182,6 @@ const here_is_a_null_literal = SillyStruct{ .context = null };...@@ -182,7 +182,6 @@ const here_is_a_null_literal = SillyStruct{ .context = null };
182182
183test "unwrap optional which is field of global var" {183test "unwrap optional which is field of global var" {
184 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO184 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
185 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
186 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;185 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
187 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;186 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
188 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;187 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
test/behavior/ptrcast.zig-1
...@@ -43,7 +43,6 @@ fn testReinterpretBytesAsExternStruct() !void {...@@ -43,7 +43,6 @@ fn testReinterpretBytesAsExternStruct() !void {
43}43}
4444
45test "reinterpret struct field at comptime" {45test "reinterpret struct field at comptime" {
46 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
47 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO46 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
48 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO47 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
49 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO48 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
test/behavior/sizeof_and_typeof.zig+14
...@@ -18,6 +18,10 @@ test "@sizeOf on compile-time types" {...@@ -18,6 +18,10 @@ test "@sizeOf on compile-time types" {
18}18}
1919
20test "@TypeOf() with multiple arguments" {20test "@TypeOf() with multiple arguments" {
21 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
22 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
23 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
24 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
21 {25 {
22 var var_1: u32 = undefined;26 var var_1: u32 = undefined;
23 var var_2: u8 = undefined;27 var var_2: u8 = undefined;
...@@ -74,6 +78,8 @@ const P = packed struct {...@@ -74,6 +78,8 @@ const P = packed struct {
74};78};
7579
76test "@offsetOf" {80test "@offsetOf" {
81 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
82 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7783
78 // Packed structs have fixed memory layout84 // Packed structs have fixed memory layout
79 try expect(@offsetOf(P, "a") == 0);85 try expect(@offsetOf(P, "a") == 0);
...@@ -180,6 +186,10 @@ test "@sizeOf(T) == 0 doesn't force resolving struct size" {...@@ -180,6 +186,10 @@ test "@sizeOf(T) == 0 doesn't force resolving struct size" {
180}186}
181187
182test "@TypeOf() has no runtime side effects" {188test "@TypeOf() has no runtime side effects" {
189 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
190 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
191 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
192 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
183 const S = struct {193 const S = struct {
184 fn foo(comptime T: type, ptr: *T) T {194 fn foo(comptime T: type, ptr: *T) T {
185 ptr.* += 1;195 ptr.* += 1;
...@@ -193,6 +203,10 @@ test "@TypeOf() has no runtime side effects" {...@@ -193,6 +203,10 @@ test "@TypeOf() has no runtime side effects" {
193}203}
194204
195test "branching logic inside @TypeOf" {205test "branching logic inside @TypeOf" {
206 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
207 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
208 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
209 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
196 const S = struct {210 const S = struct {
197 var data: i32 = 0;211 var data: i32 = 0;
198 fn foo() anyerror!i32 {212 fn foo() anyerror!i32 {
test/behavior/struct_contains_null_ptr_itself.zig+5
...@@ -1,7 +1,12 @@...@@ -1,7 +1,12 @@
1const std = @import("std");1const std = @import("std");
2const expect = std.testing.expect;2const expect = std.testing.expect;
3const builtin = @import("builtin");
34
4test "struct contains null pointer which contains original struct" {5test "struct contains null pointer which contains original struct" {
6 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
9 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
5 var x: ?*NodeLineComment = null;10 var x: ?*NodeLineComment = null;
6 try expect(x == null);11 try expect(x == null);
7}12}
test/behavior/switch.zig-1
...@@ -122,7 +122,6 @@ fn trueIfBoolFalseOtherwise(comptime T: type) bool {...@@ -122,7 +122,6 @@ fn trueIfBoolFalseOtherwise(comptime T: type) bool {
122}122}
123123
124test "switching on booleans" {124test "switching on booleans" {
125 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
126 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO125 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
127 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO126 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
128127
test/behavior/switch_prong_err_enum.zig+5
...@@ -1,4 +1,5 @@...@@ -1,4 +1,5 @@
1const expect = @import("std").testing.expect;1const expect = @import("std").testing.expect;
2const builtin = @import("builtin");
23
3var read_count: u64 = 0;4var read_count: u64 = 0;
45
...@@ -20,6 +21,10 @@ fn doThing(form_id: u64) anyerror!FormValue {...@@ -20,6 +21,10 @@ fn doThing(form_id: u64) anyerror!FormValue {
20}21}
2122
22test "switch prong returns error enum" {23test "switch prong returns error enum" {
24 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
25 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
26 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
27 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
23 switch (doThing(17) catch unreachable) {28 switch (doThing(17) catch unreachable) {
24 FormValue.Address => |payload| {29 FormValue.Address => |payload| {
25 try expect(payload == 1);30 try expect(payload == 1);
test/behavior/switch_prong_implicit_cast.zig+5
...@@ -1,4 +1,5 @@...@@ -1,4 +1,5 @@
1const expect = @import("std").testing.expect;1const expect = @import("std").testing.expect;
2const builtin = @import("builtin");
23
3const FormValue = union(enum) {4const FormValue = union(enum) {
4 One: void,5 One: void,
...@@ -14,6 +15,10 @@ fn foo(id: u64) !FormValue {...@@ -14,6 +15,10 @@ fn foo(id: u64) !FormValue {
14}15}
1516
16test "switch prong implicit cast" {17test "switch prong implicit cast" {
18 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
19 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
20 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
21 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
17 const result = switch (foo(2) catch unreachable) {22 const result = switch (foo(2) catch unreachable) {
18 FormValue.One => false,23 FormValue.One => false,
19 FormValue.Two => |x| x,24 FormValue.Two => |x| x,
test/behavior/union.zig-1
...@@ -457,7 +457,6 @@ test "initialize global array of union" {...@@ -457,7 +457,6 @@ test "initialize global array of union" {
457 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;457 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
458 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;458 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
459459
460 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
461 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;460 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
462461
463 glbl_array[1] = FooUnion{ .U1 = 2 };462 glbl_array[1] = FooUnion{ .U1 = 2 };
test/behavior/var_args.zig-3
...@@ -28,7 +28,6 @@ fn readFirstVarArg(args: anytype) void {...@@ -28,7 +28,6 @@ fn readFirstVarArg(args: anytype) void {
2828
29test "send void arg to var args" {29test "send void arg to var args" {
30 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;30 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
31 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
32 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO31 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
33 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO32 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
3433
...@@ -92,7 +91,6 @@ fn foo2(args: anytype) bool {...@@ -92,7 +91,6 @@ fn foo2(args: anytype) bool {
9291
93test "array of var args functions" {92test "array of var args functions" {
94 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;93 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
95 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
96 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO94 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
97 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO95 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9896
...@@ -102,7 +100,6 @@ test "array of var args functions" {...@@ -102,7 +100,6 @@ test "array of var args functions" {
102100
103test "pass zero length array to var args param" {101test "pass zero length array to var args param" {
104 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;102 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
105 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
106 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO103 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
107 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO104 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
108105