diff --git a/src/type.zig b/src/type.zig index c9a6f49d3e..6122afda62 100644 --- a/src/type.zig +++ b/src/type.zig @@ -3596,12 +3596,12 @@ pub const Type = extern union { fn intAbiSize(bits: u16, target: Target) u64 { const alignment = intAbiAlignment(bits, target); - return std.mem.alignForwardGeneric(u64, (bits + 7) / 8, alignment); + return std.mem.alignForwardGeneric(u64, @intCast(u16, (@as(u17, bits) + 7) / 8), alignment); } fn intAbiAlignment(bits: u16, target: Target) u32 { return @min( - std.math.ceilPowerOfTwoPromote(u16, (bits + 7) / 8), + std.math.ceilPowerOfTwoPromote(u16, @intCast(u16, (@as(u17, bits) + 7) / 8)), target.maxIntAlignment(), ); } diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig index 8727d0dd41..073be26288 100644 --- a/test/behavior/basic.zig +++ b/test/behavior/basic.zig @@ -1124,3 +1124,24 @@ test "runtime-known globals initialized with undefined" { try expect(S.s[0] == 1); try expect(S.s[4] == 5); } + +test "arrays and vectors with big integers" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; + + // TODO: only aarch64-windows didn't pass in the PR that added this code. + // figure out why if you can run this target. + if (builtin.os.tag == .windows and builtin.cpu.arch == .aarch64) return error.SkipZigTest; + + inline for (.{ u65528, u65529, u65535 }) |Int| { + var a: [1]Int = undefined; + a[0] = std.math.maxInt(Int); + try expect(a[0] == comptime std.math.maxInt(Int)); + var b: @Vector(1, Int) = undefined; + b[0] = std.math.maxInt(Int); + try expect(b[0] == comptime std.math.maxInt(Int)); + } +}