xref: /aosp_15_r20/external/clang/test/CXX/dcl.decl/dcl.meaning/p1.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace PR8019 {
4*67e74705SXin Li   struct x;
5*67e74705SXin Li   template<typename T> struct x2;
6*67e74705SXin Li   struct y {
7*67e74705SXin Li     struct PR8019::x { int x; };  // expected-error{{non-friend class member 'x' cannot have a qualified name}}
8*67e74705SXin Li 
9*67e74705SXin Li     struct inner;
10*67e74705SXin Li     struct y::inner { }; // expected-error{{extra qualification on member 'inner'}}
11*67e74705SXin Li 
12*67e74705SXin Li     template<typename T>
13*67e74705SXin Li     struct PR8019::x2 { }; // expected-error{{non-friend class member 'x2' cannot have a qualified name}}
14*67e74705SXin Li 
15*67e74705SXin Li     template<typename T>
16*67e74705SXin Li     struct inner_template;
17*67e74705SXin Li 
18*67e74705SXin Li     template<typename T>
19*67e74705SXin Li     struct y::inner_template { }; // expected-error{{extra qualification on member 'inner_template'}}
20*67e74705SXin Li   };
21*67e74705SXin Li 
22*67e74705SXin Li }
23*67e74705SXin Li 
24*67e74705SXin Li namespace NS {
25*67e74705SXin Li   void foo();
26*67e74705SXin Li   extern int bar;
27*67e74705SXin Li   struct X;
28*67e74705SXin Li   template<typename T> struct Y;
29*67e74705SXin Li   template<typename T> void wibble(T);
30*67e74705SXin Li   struct Z;
31*67e74705SXin Li }
32*67e74705SXin Li namespace NS {
33*67e74705SXin Li   // Under DR482, these are all valid, except for forward-declaring a struct
34*67e74705SXin Li   // with a nested-name-specifier.
35*67e74705SXin Li   void NS::foo(); // expected-warning {{extra qualification}}
36*67e74705SXin Li   extern int NS::bar; // expected-warning {{extra qualification}}
37*67e74705SXin Li   struct NS::X; // expected-error {{forward declaration of struct cannot have a nested name specifier}} expected-warning {{extra qualification}}
38*67e74705SXin Li   template<typename T> struct NS::Y; // expected-error {{forward declaration of struct cannot have a nested name specifier}} expected-warning {{extra qualification}}
39*67e74705SXin Li   template<typename T> void NS::wibble(T); // expected-warning {{extra qualification}}
40*67e74705SXin Li 
foo()41*67e74705SXin Li   void NS::foo() {} // expected-warning{{extra qualification on member 'foo'}}
42*67e74705SXin Li   int NS::bar; // expected-warning{{extra qualification on member 'bar'}}
43*67e74705SXin Li   struct NS::X { }; // expected-warning{{extra qualification on member 'X'}}
44*67e74705SXin Li   template<typename T> struct NS::Y { }; // expected-warning{{extra qualification on member 'Y'}}
wibble(T)45*67e74705SXin Li   template<typename T> void NS::wibble(T) { } // expected-warning{{extra qualification on member 'wibble'}}
46*67e74705SXin Li }
47*67e74705SXin Li 
48*67e74705SXin Li struct ::{} a; // expected-error{{expected identifier}}
49*67e74705SXin Li struct NS::Z:: {} b; // expected-error{{expected identifier}}
50