1 // Check that the compiler warns about inner-style forward declarations in
2 // contexts where they're not actually illegal, but merely useless.
3 
4 // Verify warnings for and within classes, and by extension, struct and union.
5 class C1;
6 class C1::C2;      // { dg-error "incomplete" }
7 class C1::C2::C3;  // { dg-error "has not been declared" }
8 
9 class C1 {
10  public:
11   class C2;
12   class C2::C3;    // { dg-error "incomplete" }
13   class C2 {
14    public:
15     class C3;
16     class C3 { };
17     class C3;
18   };
19   class C2;
20   class C2::C3;    // { dg-warning "declaration 'class C1::C2::C3' does not declare anything" }
21 };
22 
23 class C1;
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" }
26 
27 
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" }
31 
32 namespace N1 {
33   class C4;
34   class C4 { };
35   class C4;
36 
37   class N2::C5;    // { dg-error "has not been declared" }
38   namespace N2 {
39     class C5;
40     class C5 { };
41     class C5;
42   }
43   class N2::C5;    // { dg-warning "declaration 'class N1::N2::C5' does not declare anything" }
44 }
45 
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" }
48 
49 
50 // Verify that using declarations related to namespaces don't generate a
51 // warning.
52 using namespace N1;
53 using namespace N1::N2;
54 
55 namespace N3 {
56   using N1::C4;      // Valid using declaration, no warning
57   using N1::N2::C5;  // Valid using declaration, no warning
58 }
59 
60 
61 // Verify that explicit template instantiations, easy to confuse with
62 // forward declarations, don't generate a warning.
63 template<class C>
64 class TC6 {
65  public:
66   class TC7 { };
67 };
68 
69 template class TC6<int>::TC7;  // Valid explicit instantiation, no warning
70 
71 
72 // Verify that friend declarations, also easy to confuse with forward
73 // declrations, are similarly not warned about.
74 class C8 {
75  public:
76   class C9 { };
77 };
78 class C10 {
79  public:
80   friend class C8::C9;         // Valid friend declaration, no warning
81 };
82