https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43798
Alexander Monakov <amonakov at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amonakov at gcc dot gnu.org --- Comment #15 from Alexander Monakov <amonakov at gcc dot gnu.org> --- Not 100% sure if it's known, the comments don't seem to mention this, so I'll note for completeness sake: placement of the attribute makes a difference, here it looks like the attribute on the type introduced via a typedef leads to weird semantics, while the attribute on the struct itself leads to logical 32/16 size/align: typedef struct __attribute__((aligned(16))) { unsigned long long w[3]; } UINT192; int a1 = __alignof(UINT192); int s1 = sizeof(UINT192); a1: .long 16 s1: .long 32 Also one cannot create a 64-bit aligned/128-bit sized typedef to 'long double' on 32-bit: typedef long double T __attribute__((aligned(8))); int a1 = __alignof(T); int s1 = sizeof(T); a1: .long 8 s1: .long 12