http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47939
--- Comment #6 from joseph at codesourcery dot com <joseph at codesourcery dot com> 2011-03-01 16:52:37 UTC --- On Tue, 1 Mar 2011, rguenth at gcc dot gnu.org wrote: > The patch bootstrapped and tested ok. Removing > > if (!flag_gen_aux_info && (TYPE_QUALS (element_type))) > type = TYPE_MAIN_VARIANT (type); > > unconditionally breaks gcc.dg/array-quals-2.c (but nothing else). The point of the logic removing qualifiers here is as described in the comment /* Now figure out the structure of the declarator proper. Descend through it, creating more complex types, until we reach the declared identifier (or NULL_TREE, in an absolute declarator). At each stage we maintain an unqualified version of the type together with any qualifiers that should be applied to it with c_build_qualified_type; this way, array types including multidimensional array types are first built up in unqualified form and then the qualified form is created with TYPE_MAIN_VARIANT pointing to the unqualified form. */ to ensure consistency in TYPE_MAIN_VARIANT for array types; see <http://gcc.gnu.org/ml/gcc-patches/2005-01/msg02180.html>. > Probably a better general approach would be to make c_build_qualified_type > also take a desired name as argument instead of using TYPE_NAME. In general it's a desired name for an intermediate type at some level of array derivation, not for the type being constructed by c_build_qualified_type. I suppose you could pass both the name and the particular type that should have that name, or otherwise indicate the qualifiers and level of array nesting where the name should be used if possible. If you have typedef const int T[1]; T array[2][3]; then "const" is being applied to "int [2][3][1]", and it's the intermediate type "const int [1]" that you'd like to get the name T.