On Thu, 10 Mar 2011, Joseph S. Myers wrote: > On Wed, 2 Mar 2011, Richard Guenther wrote: > > > 2011-03-02 Richard Guenther <rguent...@suse.de> > > > > PR c/47939 > > * c-decl.c (grokdeclarator): Drop to the main variant only > > for array types. Drop flag_gen_aux_info check. > > I can't convince myself that this is safe - that is, that it will maintain > the invariant that TYPE_MAIN_VARIANT for an array type always points to a > version where the ultimate element type is unqualified. The problem would > be where the type from the declaration specifiers is a qualified type, not > an array type, but becomes an array element type through array declarators > being processed by grokdeclarator, and so arrays are built up directly > with qualified element type without the unqualified variants being built > first to become the main variants. It certainly appears that in a case > such as > > typedef const int T; > T a[10]; > const int b[10]; > > you get multiple copies of the const int[10] type, some of which have a > const int[10] variant as their main variant (incorrect) and some of which > have an int[10] variant as their main variant (correct); the canonical > types look rather odd as well. It's reasonable have multiple copies here > - for the type T[10] to remember the type name T it was derived from - but > in such a case they should still all be on the variant chain for a single > int[10] main variant.
Indeed. I tried to let the array case alone (because it's so complicated) but failed to do so. Appearantly if (declarator->kind == cdk_array && TYPE_QUALS (element_type)) type = TYPE_MAIN_VARIANT (type); leaves it alone (and doesn't emit a DW_TAG_typedef for T for your testcase). Thus out of the set of testcases I added the array case now fails with the above (as I'd have expected but were of course positively surprised as it didn't ...). I verified the main variants and canonical types are sane with the above variant for your testcase. If you think such change isn't safe either I'll pursue a dwarf2out.c local change, somehow forcing out the typedef DIE even if it is unused. I don't feel at home in the grokdeclarator dungeon. Thanks, Richard.