diff --git a/src/type.zig b/src/type.zig index 0744a50579fd..9fe975e8564d 100644 --- a/src/type.zig +++ b/src/type.zig @@ -3251,7 +3251,7 @@ pub const Type = extern union { .array_u8 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8).?.data }, .array_u8_sentinel_0 => return AbiSizeAdvanced{ .scalar = ty.castTag(.array_u8_sentinel_0).?.data + 1 }, - .array, .vector => { + .array => { const payload = ty.cast(Payload.Array).?.data; switch (try payload.elem_type.abiSizeAdvanced(target, strat)) { .scalar => |elem_size| return AbiSizeAdvanced{ .scalar = payload.len * elem_size }, @@ -3262,6 +3262,7 @@ pub const Type = extern union { }, } }, + .vector => return AbiSizeAdvanced{ .scalar = abiAlignment(ty, target) }, .array_sentinel => { const payload = ty.castTag(.array_sentinel).?.data; switch (try payload.elem_type.abiSizeAdvanced(target, strat)) { diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig index c13db2e26271..a12377c93491 100644 --- a/test/behavior/vector.zig +++ b/test/behavior/vector.zig @@ -1076,6 +1076,55 @@ test "alignment of vectors" { try expect(@alignOf(@Vector(2, u1)) == 1); try expect(@alignOf(@Vector(1, u1)) == 1); try expect(@alignOf(@Vector(2, u16)) == 4); + + try expect(@alignOf(@Vector(7, i8)) == 8); + try expect(@alignOf(@Vector(8, i8)) == 8); + try expect(@alignOf(@Vector(9, i8)) == 16); + try expect(@alignOf(@Vector(16, i8)) == 16); + try expect(@alignOf(@Vector(31, i8)) == 32); + try expect(@alignOf(@Vector(32, i8)) == 32); + try expect(@alignOf(@Vector(33, i8)) == 64); + + try expect(@alignOf(@Vector(3, u16)) == 8); + try expect(@alignOf(@Vector(3, f32)) == 16); + try expect(@alignOf(@Vector(3, u64)) == 32); + try expect(@alignOf(@Vector(1, *u8)) == @sizeOf(*u8) * 1); + try expect(@alignOf(@Vector(2, *u8)) == @sizeOf(*u8) * 2); + try expect(@alignOf(@Vector(3, *u8)) == @sizeOf(*u8) * 4); + + try expect(@alignOf(@Vector(8, bool)) == 1); + try expect(@alignOf(@Vector(8, u1)) == 1); + try expect(@alignOf(@Vector(9, u1)) == 2); + try expect(@alignOf(@Vector(32, u1)) == 4); + try expect(@alignOf(@Vector(33, u1)) == 8); +} + +test "size of vectors" { + try expect(@sizeOf(@Vector(2, u8)) == 2); + try expect(@sizeOf(@Vector(2, u1)) == 1); + try expect(@sizeOf(@Vector(1, u1)) == 1); + try expect(@sizeOf(@Vector(2, u16)) == 4); + + try expect(@sizeOf(@Vector(7, i8)) == 8); + try expect(@sizeOf(@Vector(8, i8)) == 8); + try expect(@sizeOf(@Vector(9, i8)) == 16); + try expect(@sizeOf(@Vector(16, i8)) == 16); + try expect(@sizeOf(@Vector(31, i8)) == 32); + try expect(@sizeOf(@Vector(32, i8)) == 32); + try expect(@sizeOf(@Vector(33, i8)) == 64); + + try expect(@sizeOf(@Vector(3, u16)) == 8); + try expect(@sizeOf(@Vector(3, f32)) == 16); + try expect(@sizeOf(@Vector(3, u64)) == 32); + try expect(@sizeOf(@Vector(1, *u8)) == @sizeOf(*u8) * 1); + try expect(@sizeOf(@Vector(2, *u8)) == @sizeOf(*u8) * 2); + try expect(@sizeOf(@Vector(3, *u8)) == @sizeOf(*u8) * 4); + + try expect(@sizeOf(@Vector(8, bool)) == 1); + try expect(@sizeOf(@Vector(8, u1)) == 1); + try expect(@sizeOf(@Vector(9, u1)) == 2); + try expect(@sizeOf(@Vector(32, u1)) == 4); + try expect(@sizeOf(@Vector(33, u1)) == 8); } test "loading the second vector from a slice of vectors" {