Enable TBAA on anonymous types with LTO

Jan Hubicka hubicka@ucw.cz
Tue Sep 30 16:29:00 GMT 2014


> On 09/29/2014 11:36 AM, Jan Hubicka wrote:
> >If C++ FE sets canonical type always to main variant, it should work.
> >Is it always the case?
> 
> No.  For a compound type like a pointer or function the canonical
> type strips all typedefs, but a main variant does not.
> 
> >>>       namespace {
> >>>       struct B {};
> >>>       }
> >>>       struct A
> >>>       {
> >>>	void t(B);
> >>>	void t2();
> >>>       };
> >
> >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.
> 
> Yes, it's an ODR violation.  The FE currently warns about a field
> with internal type, and I suppose could warn about other members as
> well.

The testcase seems to get around without a warning for both G++ and clang
(at least without -Wall)
> 
> >I really think that anonymous types are meant to not be accessible from other
> >compilation unit and I do not see why other languages need different rule.
> 
> Agreed.
> 
> >This does not work for types build from ODR types that are not ODR themselves.
> 
> I'm not sure what you mean.  In C++ the only types not subject to
> the ODR are local to one translation unit, so merging isn't an
> issue.  Do you mean types from other languages?

Yes, Richard would like

namespace {
  struct A {int a;};
}

to be considered with aliasing with 

  struct B {int b;};

in the other unit if that unit is built in C language (or any other than C++).

Honza
> Jason



More information about the Gcc-patches mailing list