Created attachment 22140 [details] Reproducer Inspired by: https://stackoverflow.com/questions/56760874/discrepancy-in-c-between-over-aligned-struct-and-enum-within-container Given an enumeration type with a specified alignment, the elements in a vector of such a type should be aligned correctly. This appears not to be the case - and can lead to UBSAN going off. In the reproducer, I also check the size of a 16-element array of these two types. Clang says they're different sizes - that suggests to me that there's a clang problem here. The alignment in the containers bit could be related to https://bugs.llvm.org/show_bug.cgi?id=22634. (might even be the same bug)
Now I'm very confused. ==== struct alignas(16) byte_struct {std::uint8_t value;}; enum alignas(16) byte_enum : std::uint8_t { one=1, two, three }; int main() { std::cout << "struct: " << sizeof(byte_struct) << std::endl; std::cout << "enum: " << sizeof(byte_enum ) << std::endl; std::cout << "01 structs: " << sizeof(byte_struct[1]) << std::endl; std::cout << "01 enums: " << sizeof(byte_enum [1]) << std::endl; std::cout << "02 structs: " << sizeof(byte_struct[2]) << std::endl; std::cout << "02 enums: " << sizeof(byte_enum [2]) << std::endl; std::cout << "16 structs: " << sizeof(byte_struct[16]) << std::endl; std::cout << "16 enums: " << sizeof(byte_enum [16]) << std::endl; } ==== prints (with a reasonably recent clang): ==== struct: 16 enum: 1 01 structs: 16 01 enums: 16 02 structs: 32 02 enums: 16 16 structs: 256 16 enums: 16 ====
Richard pointed out (on SO) that this is core issue 2354. Extended alignment and object representation, which was resolved in Kona by removing the ability to put 'alignas' on enumeration types. Closing as invalid.