1 // Check that the compiler warns about inner-style forward declarations in
2 // contexts where they're not actually illegal, but merely useless.
4 // Verify warnings for and within classes, and by extension, struct and union.
6 class C1::C2; // { dg-error "incomplete" }
7 class C1::C2::C3; // { dg-error "has not been declared" }
12 class C2::C3; // { dg-error "incomplete" }
20 class C2::C3; // { dg-warning "declaration 'class C1::C2::C3' does not declare anything" }
24 class C1::C2; // { dg-warning "declaration 'class C1::C2' does not declare anything" }
25 class C1::C2::C3; // { dg-warning "declaration 'class C1::C2::C3' does not declare anything" }
28 // Verify warnings for namespace scopes.
29 class N1::C4; // { dg-error "has not been declared" }
30 class N1::N2::C5; // { dg-error "has not been declared" }
37 class N2::C5; // { dg-error "has not been declared" }
43 class N2::C5; // { dg-warning "declaration 'class N1::N2::C5' does not declare anything" }
46 class N1::C4; // { dg-warning "declaration 'class N1::C4' does not declare anything" }
47 class N1::N2::C5; // { dg-warning "declaration 'class N1::N2::C5' does not declare anything" }
50 // Verify that using declarations related to namespaces don't generate a
53 using namespace N1::N2;
56 using N1::C4; // Valid using declaration, no warning
57 using N1::N2::C5; // Valid using declaration, no warning
61 // Verify that explicit template instantiations, easy to confuse with
62 // forward declarations, don't generate a warning.
69 template class TC6<int>::TC7; // Valid explicit instantiation, no warning
72 // Verify that friend declarations, also easy to confuse with forward
73 // declrations, are similarly not warned about.
80 friend class C8::C9; // Valid friend declaration, no warning