// Check that the compiler warns about inner-style forward declarations in // contexts where they're not actually illegal, but merely useless. // Verify warnings for and within classes, and by extension, struct and union. class C1; class C1::C2; // { dg-error "does not name a type" } class C1::C2::C3; // { dg-error "has not been declared" } class C1 { public: class C2; class C2::C3; // { dg-error "does not name a type" } class C2 { public: class C3; class C3 { }; class C3; }; class C2; class C2::C3; // { dg-warning "declaration 'class C1::C2::C3' does not declare anything" } }; class C1; class C1::C2; // { dg-warning "declaration 'class C1::C2' does not declare anything" } class C1::C2::C3; // { dg-warning "declaration 'class C1::C2::C3' does not declare anything" } // Verify warnings for namespace scopes. class N1::C4; // { dg-error "has not been declared" } class N1::N2::C5; // { dg-error "has not been declared" } namespace N1 { class C4; class C4 { }; class C4; class N2::C5; // { dg-error "has not been declared" } namespace N2 { class C5; class C5 { }; class C5; } class N2::C5; // { dg-warning "declaration 'class N1::N2::C5' does not declare anything" } } class N1::C4; // { dg-warning "declaration 'class N1::C4' does not declare anything" } class N1::N2::C5; // { dg-warning "declaration 'class N1::N2::C5' does not declare anything" } // Verify that using declarations related to namespaces don't generate a // warning. using namespace N1; using namespace N1::N2; namespace N3 { using N1::C4; // Valid using declaration, no warning using N1::N2::C5; // Valid using declaration, no warning } // Verify that explicit template instantiations, easy to confuse with // forward declarations, don't generate a warning. template class TC6 { public: class TC7 { }; }; template class TC6::TC7; // Valid explicit instantiation, no warning // Verify that friend declarations, also easy to confuse with forward // declrations, are similarly not warned about. class C8 { public: class C9 { }; }; class C10 { public: friend class C8::C9; // Valid friend declaration, no warning };