https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53037
--- Comment #32 from Eric Botcazou <ebotcazou at gcc dot gnu.org> --- > Sparc defines STRICT_ALIGNMENT which leads to > > unsigned mode_align = GET_MODE_ALIGNMENT (TYPE_MODE (type)); > > /* Don't override a larger alignment requirement coming from a user > alignment of one of the fields. */ > if (mode_align >= TYPE_ALIGN (type)) > { > SET_TYPE_ALIGN (type, mode_align); > TYPE_USER_ALIGN (type) = 0; > } > > so __attribute__ ((packed)) is basically ignored on Sparc. I don't think that's correct. Simply, on strict-alignment targets, you cannot have an aggregate type less aligned than its scalar mode, if any; for other targets, that's only true for scalar types. But you can have an aggregate type with alignment 1 if it has BLKmode. > diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c > index 3028d55773a..6dd605810ac 100644 > --- a/gcc/stor-layout.c > +++ b/gcc/stor-layout.c > @@ -1784,7 +1784,7 @@ finalize_type_size (tree type) > > /* Don't override a larger alignment requirement coming from a user > alignment of one of the fields. */ > - if (mode_align >= TYPE_ALIGN (type)) > + if (mode_align > TYPE_ALIGN (type)) > { > SET_TYPE_ALIGN (type, mode_align); > TYPE_USER_ALIGN (type) = 0; > > works with cross compiler. The existing code works as intended: if the alignment given by the mode is larger than or equal to the type's alignment, then this alignment given by the mode becomes the natural alignment and TYPE_USER_ALIGN becomes obsolete/wrong. So I think that the absence of warning is correct on strict-alignment platforms and that, if you want to make the tests portable, then you must use structures whose rounded size is not a power of 2 or is larger than 128 bits, so that they don't get a scalar mode.