> >
> > Why not just make all anonymous types their own canonical type?
> > (of course considering type variants)
>
> If C++ FE sets canonical type always to main variant, it should work.
> Is it always the case? I noticed you do this for variadic types.
> I tought there is reason why canonical types differ from main variants
> and the way canonical types are built in FE seems more complex too, than
> just setting CANONICAL=MAIN_VARIANT
> >
> > > 2) update canonical type hash so it can deal with types that already
> > > have
> > > canonical type set.
> > > I insert even anonymous types there because I am not able to get rid
> > > of cases where non-anonmous type explicitly mentions anonymous.
> > > Consider:
> > > namespace {
> > > struct B {};
> > > }
> > > struct A
> > > {
> > > void t(B);
> > > void t2();
> > > };
> > > void
> > > A::t(B)
> > > {
> > > }
> > > void
> > > A::t2()
> > > {
> > > }
> > > Here we end up having type of method T non-anonymous but it builds
> > > from B that
> > > is anonymous.
> >
> > But that makes B non-anonymous as well? How is A::t mangled? Consider
> > also the simpler case
> >
> > struct A { struct B b; };
>
> Yep, A seems to be not anonymous and mangled as A. I think it is ODR
> violation
> to declare such type in more than one compilation unit (and we will warn on
> it). We can make it anonymous, but I think it is C++ FE to do so.
If I update my testcase to also have struct B b as a field I get:
.type _ZN1A2t2Ev, @function
_ZN1A2t2Ev:
.LFB1:
.cfi_startproc
rep ret
.cfi_endproc
I.e. a::t is static (based on its anonymous namespace argument B) while a::t2
is normal
externally visible method for type mangled as A.