Consider the following code sample: struct A { }; typedef struct A A; struct A a; // [1] struct wrapper { struct B { }; typedef struct B B; struct B b; // [2] }; Mainline gives an error for line [2], but not for line [1]. My reading of the standard is that there shouldn't be any difference. In both cases we're using an elaborated type specifier with a name that resolves to a typedef-name. A program that does that is ill formed, so the compiler is required to admit a diagnostic. We're doing that for line [2], but we're failing to do it for line [1]. Relevant passages in the standard: 3.4.4/2, 7.1.3/4, 7.1.5.3/2.
Confirmed. [2] was PR 11036 by the way.
I've raised this issue on the C++ standardization committee's core language reflector. I now find it a little less clear than I did before. This is closely related to open issue 407. See http://www.open- std.org/jtc1/sc22/wg21/docs/cwg_active.html#407
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#407 is no longer open, I think [2] should be accepted
Un-suspending, and changing from accepts-invalid to rejects-valid. Both [1] and [2] are valid now and should be accepted.