> 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