| author | |
| committer | |
| log | 0e38cc16d51178525e89774ce9151651b6a0e99a |
| tree | 41e3768824dc156b70fccf506362f4fa7277e3ae |
| parent | 7f9e841f746bb3eaf6ac205092a30bc7ed12a068 |
Closes #1249814 files changed, 48 insertions(+), 30 deletions(-)
lib/std/fs.zig-2| ... | ... | @@ -809,8 +809,6 @@ pub const IterableDir = struct { |
| 809 | 809 | // and we avoid the code complexity here. |
| 810 | 810 | const w = os.wasi; |
| 811 | 811 | start_over: while (true) { |
| 812 | // TODO https://github.com/ziglang/zig/issues/12498 | |
| 813 | _ = @sizeOf(w.dirent_t) + 1; | |
| 814 | 812 | // According to the WASI spec, the last entry might be truncated, |
| 815 | 813 | // so we need to check if the left buffer contains the whole dirent. |
| 816 | 814 | if (self.end_index - self.index < @sizeOf(w.dirent_t)) { |
src/Sema.zig+4-2| ... | ... | @@ -20262,7 +20262,7 @@ fn analyzeShuffle( |
| 20262 | 20262 | var buf: Value.ElemValueBuffer = undefined; |
| 20263 | 20263 | const elem = mask.elemValueBuffer(sema.mod, i, &buf); |
| 20264 | 20264 | if (elem.isUndef()) continue; |
| 20265 | const int = elem.toSignedInt(); | |
| 20265 | const int = elem.toSignedInt(sema.mod.getTarget()); | |
| 20266 | 20266 | var unsigned: u32 = undefined; |
| 20267 | 20267 | var chosen: u32 = undefined; |
| 20268 | 20268 | if (int >= 0) { |
| ... | ... | @@ -20304,7 +20304,7 @@ fn analyzeShuffle( |
| 20304 | 20304 | values[i] = Value.undef; |
| 20305 | 20305 | continue; |
| 20306 | 20306 | } |
| 20307 | const int = mask_elem_val.toSignedInt(); | |
| 20307 | const int = mask_elem_val.toSignedInt(sema.mod.getTarget()); | |
| 20308 | 20308 | const unsigned = if (int >= 0) @intCast(u32, int) else @intCast(u32, ~int); |
| 20309 | 20309 | if (int >= 0) { |
| 20310 | 20310 | values[i] = try a_val.elemValue(sema.mod, sema.arena, unsigned); |
| ... | ... | @@ -28299,6 +28299,7 @@ fn cmpNumeric( |
| 28299 | 28299 | |
| 28300 | 28300 | var lhs_bits: usize = undefined; |
| 28301 | 28301 | if (try sema.resolveMaybeUndefVal(lhs)) |lhs_val| { |
| 28302 | try sema.resolveLazyValue(lhs_val); | |
| 28302 | 28303 | if (lhs_val.isUndef()) |
| 28303 | 28304 | return sema.addConstUndef(Type.bool); |
| 28304 | 28305 | if (lhs_val.isNan()) switch (op) { |
| ... | ... | @@ -28357,6 +28358,7 @@ fn cmpNumeric( |
| 28357 | 28358 | |
| 28358 | 28359 | var rhs_bits: usize = undefined; |
| 28359 | 28360 | if (try sema.resolveMaybeUndefVal(rhs)) |rhs_val| { |
| 28361 | try sema.resolveLazyValue(rhs_val); | |
| 28360 | 28362 | if (rhs_val.isUndef()) |
| 28361 | 28363 | return sema.addConstUndef(Type.bool); |
| 28362 | 28364 | if (rhs_val.isNan()) switch (op) { |
src/arch/aarch64/CodeGen.zig+1-1| ... | ... | @@ -6247,7 +6247,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue { |
| 6247 | 6247 | if (info.bits <= 64) { |
| 6248 | 6248 | const unsigned = switch (info.signedness) { |
| 6249 | 6249 | .signed => blk: { |
| 6250 | const signed = typed_value.val.toSignedInt(); | |
| 6250 | const signed = typed_value.val.toSignedInt(target); | |
| 6251 | 6251 | break :blk @bitCast(u64, signed); |
| 6252 | 6252 | }, |
| 6253 | 6253 | .unsigned => typed_value.val.toUnsignedInt(target), |
src/arch/arm/CodeGen.zig+1-1| ... | ... | @@ -6121,7 +6121,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue { |
| 6121 | 6121 | if (info.bits <= ptr_bits) { |
| 6122 | 6122 | const unsigned = switch (info.signedness) { |
| 6123 | 6123 | .signed => blk: { |
| 6124 | const signed = @intCast(i32, typed_value.val.toSignedInt()); | |
| 6124 | const signed = @intCast(i32, typed_value.val.toSignedInt(target)); | |
| 6125 | 6125 | break :blk @bitCast(u32, signed); |
| 6126 | 6126 | }, |
| 6127 | 6127 | .unsigned => @intCast(u32, typed_value.val.toUnsignedInt(target)), |
src/arch/sparc64/CodeGen.zig+1-1| ... | ... | @@ -3786,7 +3786,7 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue { |
| 3786 | 3786 | if (info.bits <= 64) { |
| 3787 | 3787 | const unsigned = switch (info.signedness) { |
| 3788 | 3788 | .signed => blk: { |
| 3789 | const signed = typed_value.val.toSignedInt(); | |
| 3789 | const signed = typed_value.val.toSignedInt(target); | |
| 3790 | 3790 | break :blk @bitCast(u64, signed); |
| 3791 | 3791 | }, |
| 3792 | 3792 | .unsigned => typed_value.val.toUnsignedInt(target), |
src/arch/wasm/CodeGen.zig+5-5| ... | ... | @@ -2702,11 +2702,11 @@ fn lowerConstant(func: *CodeGen, arg_val: Value, ty: Type) InnerError!WValue { |
| 2702 | 2702 | switch (int_info.signedness) { |
| 2703 | 2703 | .signed => switch (int_info.bits) { |
| 2704 | 2704 | 0...32 => return WValue{ .imm32 = @intCast(u32, toTwosComplement( |
| 2705 | val.toSignedInt(), | |
| 2705 | val.toSignedInt(target), | |
| 2706 | 2706 | @intCast(u6, int_info.bits), |
| 2707 | 2707 | )) }, |
| 2708 | 2708 | 33...64 => return WValue{ .imm64 = toTwosComplement( |
| 2709 | val.toSignedInt(), | |
| 2709 | val.toSignedInt(target), | |
| 2710 | 2710 | @intCast(u7, int_info.bits), |
| 2711 | 2711 | ) }, |
| 2712 | 2712 | else => unreachable, |
| ... | ... | @@ -2873,15 +2873,15 @@ fn valueAsI32(func: *const CodeGen, val: Value, ty: Type) i32 { |
| 2873 | 2873 | } |
| 2874 | 2874 | }, |
| 2875 | 2875 | .Int => switch (ty.intInfo(func.target).signedness) { |
| 2876 | .signed => return @truncate(i32, val.toSignedInt()), | |
| 2876 | .signed => return @truncate(i32, val.toSignedInt(target)), | |
| 2877 | 2877 | .unsigned => return @bitCast(i32, @truncate(u32, val.toUnsignedInt(target))), |
| 2878 | 2878 | }, |
| 2879 | 2879 | .ErrorSet => { |
| 2880 | 2880 | const kv = func.bin_file.base.options.module.?.getErrorValue(val.getError().?) catch unreachable; // passed invalid `Value` to function |
| 2881 | 2881 | return @bitCast(i32, kv.value); |
| 2882 | 2882 | }, |
| 2883 | .Bool => return @intCast(i32, val.toSignedInt()), | |
| 2884 | .Pointer => return @intCast(i32, val.toSignedInt()), | |
| 2883 | .Bool => return @intCast(i32, val.toSignedInt(target)), | |
| 2884 | .Pointer => return @intCast(i32, val.toSignedInt(target)), | |
| 2885 | 2885 | else => unreachable, // Programmer called this function for an illegal type |
| 2886 | 2886 | } |
| 2887 | 2887 | } |
src/arch/x86_64/CodeGen.zig+1-1| ... | ... | @@ -7007,7 +7007,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue { |
| 7007 | 7007 | .Int => { |
| 7008 | 7008 | const info = typed_value.ty.intInfo(self.target.*); |
| 7009 | 7009 | if (info.bits <= ptr_bits and info.signedness == .signed) { |
| 7010 | return MCValue{ .immediate = @bitCast(u64, typed_value.val.toSignedInt()) }; | |
| 7010 | return MCValue{ .immediate = @bitCast(u64, typed_value.val.toSignedInt(target)) }; | |
| 7011 | 7011 | } |
| 7012 | 7012 | if (!(info.bits > ptr_bits or info.signedness == .signed)) { |
| 7013 | 7013 | return MCValue{ .immediate = typed_value.val.toUnsignedInt(target) }; |
src/codegen.zig+7-7| ... | ... | @@ -459,7 +459,7 @@ pub fn generateSymbol( |
| 459 | 459 | if (info.bits <= 8) { |
| 460 | 460 | const x: u8 = switch (info.signedness) { |
| 461 | 461 | .unsigned => @intCast(u8, typed_value.val.toUnsignedInt(target)), |
| 462 | .signed => @bitCast(u8, @intCast(i8, typed_value.val.toSignedInt())), | |
| 462 | .signed => @bitCast(u8, @intCast(i8, typed_value.val.toSignedInt(target))), | |
| 463 | 463 | }; |
| 464 | 464 | try code.append(x); |
| 465 | 465 | return Result{ .appended = {} }; |
| ... | ... | @@ -488,13 +488,13 @@ pub fn generateSymbol( |
| 488 | 488 | }, |
| 489 | 489 | .signed => { |
| 490 | 490 | if (info.bits <= 16) { |
| 491 | const x = @intCast(i16, typed_value.val.toSignedInt()); | |
| 491 | const x = @intCast(i16, typed_value.val.toSignedInt(target)); | |
| 492 | 492 | mem.writeInt(i16, try code.addManyAsArray(2), x, endian); |
| 493 | 493 | } else if (info.bits <= 32) { |
| 494 | const x = @intCast(i32, typed_value.val.toSignedInt()); | |
| 494 | const x = @intCast(i32, typed_value.val.toSignedInt(target)); | |
| 495 | 495 | mem.writeInt(i32, try code.addManyAsArray(4), x, endian); |
| 496 | 496 | } else { |
| 497 | const x = typed_value.val.toSignedInt(); | |
| 497 | const x = typed_value.val.toSignedInt(target); | |
| 498 | 498 | mem.writeInt(i64, try code.addManyAsArray(8), x, endian); |
| 499 | 499 | } |
| 500 | 500 | }, |
| ... | ... | @@ -536,13 +536,13 @@ pub fn generateSymbol( |
| 536 | 536 | }, |
| 537 | 537 | .signed => { |
| 538 | 538 | if (info.bits <= 16) { |
| 539 | const x = @intCast(i16, int_val.toSignedInt()); | |
| 539 | const x = @intCast(i16, int_val.toSignedInt(target)); | |
| 540 | 540 | mem.writeInt(i16, try code.addManyAsArray(2), x, endian); |
| 541 | 541 | } else if (info.bits <= 32) { |
| 542 | const x = @intCast(i32, int_val.toSignedInt()); | |
| 542 | const x = @intCast(i32, int_val.toSignedInt(target)); | |
| 543 | 543 | mem.writeInt(i32, try code.addManyAsArray(4), x, endian); |
| 544 | 544 | } else { |
| 545 | const x = int_val.toSignedInt(); | |
| 545 | const x = int_val.toSignedInt(target); | |
| 546 | 546 | mem.writeInt(i64, try code.addManyAsArray(8), x, endian); |
| 547 | 547 | } |
| 548 | 548 | }, |
src/codegen/llvm.zig+1-1| ... | ... | @@ -8932,7 +8932,7 @@ pub const FuncGen = struct { |
| 8932 | 8932 | if (elem.isUndef()) { |
| 8933 | 8933 | val.* = llvm_i32.getUndef(); |
| 8934 | 8934 | } else { |
| 8935 | const int = elem.toSignedInt(); | |
| 8935 | const int = elem.toSignedInt(self.dg.module.getTarget()); | |
| 8936 | 8936 | const unsigned = if (int >= 0) @intCast(u32, int) else @intCast(u32, ~int + a_len); |
| 8937 | 8937 | val.* = llvm_i32.constInt(unsigned, .False); |
| 8938 | 8938 | } |
src/codegen/spirv.zig+2-2| ... | ... | @@ -360,7 +360,7 @@ pub const DeclGen = struct { |
| 360 | 360 | |
| 361 | 361 | // Note, value is required to be sign-extended, so we don't need to mask off the upper bits. |
| 362 | 362 | // See https://www.khronos.org/registry/SPIR-V/specs/unified1/SPIRV.html#Literal |
| 363 | var int_bits = if (ty.isSignedInt()) @bitCast(u64, val.toSignedInt()) else val.toUnsignedInt(target); | |
| 363 | var int_bits = if (ty.isSignedInt()) @bitCast(u64, val.toSignedInt(target)) else val.toUnsignedInt(target); | |
| 364 | 364 | |
| 365 | 365 | const value: spec.LiteralContextDependentNumber = switch (backing_bits) { |
| 366 | 366 | 1...32 => .{ .uint32 = @truncate(u32, int_bits) }, |
| ... | ... | @@ -763,7 +763,7 @@ pub const DeclGen = struct { |
| 763 | 763 | if (elem.isUndef()) { |
| 764 | 764 | self.func.body.writeOperand(spec.LiteralInteger, 0xFFFF_FFFF); |
| 765 | 765 | } else { |
| 766 | const int = elem.toSignedInt(); | |
| 766 | const int = elem.toSignedInt(self.getTarget()); | |
| 767 | 767 | const unsigned = if (int >= 0) @intCast(u32, int) else @intCast(u32, ~int + a_len); |
| 768 | 768 | self.func.body.writeOperand(spec.LiteralInteger, unsigned); |
| 769 | 769 | } |
src/link/Dwarf.zig+1-1| ... | ... | @@ -409,7 +409,7 @@ pub const DeclState = struct { |
| 409 | 409 | // See https://github.com/ziglang/zig/issues/645 |
| 410 | 410 | var int_buffer: Value.Payload.U64 = undefined; |
| 411 | 411 | const field_int_val = value.enumToInt(ty, &int_buffer); |
| 412 | break :value @bitCast(u64, field_int_val.toSignedInt()); | |
| 412 | break :value @bitCast(u64, field_int_val.toSignedInt(target)); | |
| 413 | 413 | } else @intCast(u64, field_i); |
| 414 | 414 | mem.writeInt(u64, dbg_info_buffer.addManyAsArrayAssumeCapacity(8), value, target_endian); |
| 415 | 415 | } |
src/value.zig+15-6| ... | ... | @@ -1201,8 +1201,8 @@ pub const Value = extern union { |
| 1201 | 1201 | } |
| 1202 | 1202 | |
| 1203 | 1203 | /// Asserts the value is an integer and it fits in a i64 |
| 1204 | pub fn toSignedInt(self: Value) i64 { | |
| 1205 | switch (self.tag()) { | |
| 1204 | pub fn toSignedInt(val: Value, target: Target) i64 { | |
| 1205 | switch (val.tag()) { | |
| 1206 | 1206 | .zero, |
| 1207 | 1207 | .bool_false, |
| 1208 | 1208 | .the_only_possible_value, // i0, u0 |
| ... | ... | @@ -1212,10 +1212,19 @@ pub const Value = extern union { |
| 1212 | 1212 | .bool_true, |
| 1213 | 1213 | => return 1, |
| 1214 | 1214 | |
| 1215 | .int_u64 => return @intCast(i64, self.castTag(.int_u64).?.data), | |
| 1216 | .int_i64 => return self.castTag(.int_i64).?.data, | |
| 1217 | .int_big_positive => return self.castTag(.int_big_positive).?.asBigInt().to(i64) catch unreachable, | |
| 1218 | .int_big_negative => return self.castTag(.int_big_negative).?.asBigInt().to(i64) catch unreachable, | |
| 1215 | .int_u64 => return @intCast(i64, val.castTag(.int_u64).?.data), | |
| 1216 | .int_i64 => return val.castTag(.int_i64).?.data, | |
| 1217 | .int_big_positive => return val.castTag(.int_big_positive).?.asBigInt().to(i64) catch unreachable, | |
| 1218 | .int_big_negative => return val.castTag(.int_big_negative).?.asBigInt().to(i64) catch unreachable, | |
| 1219 | ||
| 1220 | .lazy_align => { | |
| 1221 | const ty = val.castTag(.lazy_align).?.data; | |
| 1222 | return @intCast(i64, ty.abiAlignment(target)); | |
| 1223 | }, | |
| 1224 | .lazy_size => { | |
| 1225 | const ty = val.castTag(.lazy_size).?.data; | |
| 1226 | return @intCast(i64, ty.abiSize(target)); | |
| 1227 | }, | |
| 1219 | 1228 | |
| 1220 | 1229 | .undef => unreachable, |
| 1221 | 1230 | else => unreachable, |
test/behavior.zig+1| ... | ... | @@ -90,6 +90,7 @@ test { |
| 90 | 90 | _ = @import("behavior/bugs/12430.zig"); |
| 91 | 91 | _ = @import("behavior/bugs/12486.zig"); |
| 92 | 92 | _ = @import("behavior/bugs/12488.zig"); |
| 93 | _ = @import("behavior/bugs/12498.zig"); | |
| 93 | 94 | _ = @import("behavior/bugs/12551.zig"); |
| 94 | 95 | _ = @import("behavior/bugs/12644.zig"); |
| 95 | 96 | _ = @import("behavior/bugs/12680.zig"); |
test/behavior/bugs/12498.zig created+8| ... | ... | @@ -0,0 +1,8 @@ |
| 1 | const std = @import("std"); | |
| 2 | const expect = std.testing.expect; | |
| 3 | ||
| 4 | const S = struct { a: usize }; | |
| 5 | test "lazy abi size used in comparison" { | |
| 6 | var rhs: i32 = 100; | |
| 7 | try expect(@sizeOf(S) < rhs); | |
| 8 | } |