https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97569

--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Ah right, so

  int main()
  {
      struct A
      {
        struct B *b;
        struct C {} *c;
      };

      using U = B;
      using V = C;   
  }

For the `struct C {}` case that explicitly defines (and declares) a new struct
in the scope of A, i.e. A::C, and so it's definitely correct that it isn't
declared in the enclosing block scope. That case is substantially different,
and all compilers agree on that.

For `struct B *b` the standard says that implicitly declares a new type, but
not as a member of A. [basic.scope.pdecl] p7 (7.2) says that the the identifier
B "is declared in the smallest namespace or block scope that contains the
declaration." And that's the block scope of main. So I think GCC is correct,
and Clang is wrong. EDG agrees with GCC FWIW.

Reply via email to