For this: struct A { }; struct B { B(A); }; void fn () { B(A()); // extern struct B A (void); A a; } we issue: q.C: In function ‘void fn()’: q.C:8:4: error: expected ‘;’ before ‘a’ 8 | A a; | ^~ | ; Eh, what? clang++: q.C:8:3: error: must use 'struct' tag to refer to type 'A' in this scope A a; ^ struct q.C:7:5: note: struct 'A' is hidden by a non-type declaration of 'A' here B(A()); // extern struct B A (void); ^
Extended test: // PR c++/97531 struct A { }; void A(int); void fn0 () { A a; static A *a2; } int B; struct B { }; void fn1 () { B b; static B *b2; } enum E { }; void E(); void fn2 () { E e; static E *e2; } class C { }; void C(int); void fn3 () { C c; static C *c2; } union U { }; void U(int); void fn4 () { U u; static U *u2; }