On Wed, Apr 08, 2015 at 12:02:39PM +0200, Jakub Jelinek wrote: > The included (first) patch has been successfully bootstrapped/regtested on > x86_64-linux and i686-linux, the attached patch not, but I can > bootstrap/regtest it if you prefer it.
The attached version unfortunately regresses pr60226.c typedef int __attribute__ ((aligned (1 << 28))) int28; int28 foo[4] = {}; /* { dg-error "alignment of array elements is greater than element size" } */ error is not reported then. But the first version with the layout_type call in there works. > @@ -1057,21 +1064,23 @@ cp_build_qualified_type_real (tree type, > should be equivalent to those in check_qualified_type. */ > for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t)) > if (TREE_TYPE (t) == element_type > - && TYPE_NAME (t) == TYPE_NAME (type) > - && TYPE_CONTEXT (t) == TYPE_CONTEXT (type) > - && attribute_list_equal (TYPE_ATTRIBUTES (t), > - TYPE_ATTRIBUTES (type))) > + && check_base_type (t, type)) So, would instead of this change adding && TYPE_USER_ALIGN (t) == TYPE_USER_ALIGN (type) && (!TYPE_USER_ALIGN (t) || TYPE_ALIGN (t) == TYPE_ALIGN (type)) to the conditional work for you? Or supposedly no change at all, as the attributes would be either in TYPE_ATTRIBUTES, or on TYPE_DECL, but then it would be covered by the TYPE_NAME comparison. > break; > > if (!t) > { > t = build_cplus_array_type (element_type, TYPE_DOMAIN (type)); > > - /* Keep the typedef name. */ > - if (TYPE_NAME (t) != TYPE_NAME (type)) > + /* Keep the typedef name, context and alignment. */ > + if (TYPE_NAME (t) != TYPE_NAME (type) > + || TYPE_CONTEXT (t) != TYPE_CONTEXT (type) > + || TYPE_ALIGN (t) != TYPE_ALIGN (type)) Then supposedly similar change to the above one (the TYPE_USER_ALIGN stuff). Jakub