On Wed, Mar 9, 2011 at 6:59 PM, Jason Merrill <ja...@redhat.com> wrote: > In this testcase, when we first declare the myvectypes and mytype3, > vector<string> has not been instantiated, so we mark the array, and the > pointer to the array, for structural equality comparison. When we actually > go to instantiate mytype3, we complete vector<string> and rebuild the array > and pointer types, and use those to look up the template specialization. > Which fails to find the one we already had because the new pointer type has > TYPE_CANONICAL and therefore hashes > differently from the one that didn't. > > We deal with ARRAY_TYPE specially in iterative_hash_template_arg, but that > doesn't cover a compound type which uses an ARRAY_TYPE, such as the pointer > in this case. > > The business of having an array with the same element type and domain have > different TYPE_CANONICAL dependending on whether or not the element type is > complete has always seemed strange and fragile to me, so I tried removing > the relevant code from layout_type; this produced only a single test > failure, which was fixed by changing type_hash_eq to not trust TYPE_ALIGN if > the type isn't complete yet. I imagine that's what Doug was talking about > in his comment about alignment. > > Tested (c,c++,fortran,java,lto,objc) x86_64-pc-linux-gnu. OK for 4.5 and > 4.6? > > commit 45deb1cd5953c5730e14e00c5a8f800dadea66bd > Author: Jason Merrill <ja...@redhat.com> > Date: Wed Mar 9 16:47:10 2011 -0500 > > PR c++/48029 > * stor-layout.c (layout_type): Don't set structural equality > on arrays of incomplete type. > * tree.c (type_hash_eq): Handle comparing them properly. > * cp/pt.c (iterative_hash_template_arg): Remove special case for > ARRAY_TYPE. >
This caused: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48069 -- H.J.