nested-name-spec.cpp revision fa0b48fd2af19f862242dc3643e4e95baea25d4e
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -std=c++98 -verify %s
2ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisnamespace A {
3ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  struct C {
4ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis    static int cx;
5656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
6656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor    static int cx2;
7656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
8656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor    static int Ag1();
9656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor    static int Ag2();
10ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  };
11ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  int ax;
12ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  void Af();
13ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
14ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
15ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios KyrtzidisA:: ; // expected-error {{expected unqualified-id}}
16edc287751a4b05e3b4d8ff2b38fa30c5b59a548bJeffrey Yasskin// FIXME: there is a member 'ax'; it's just not a class.
17edc287751a4b05e3b4d8ff2b38fa30c5b59a548bJeffrey Yasskin::A::ax::undef ex3; // expected-error {{no member named 'ax'}}
18edc287751a4b05e3b4d8ff2b38fa30c5b59a548bJeffrey YasskinA::undef1::undef2 ex4; // expected-error {{no member named 'undef1'}}
19ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
20656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregorint A::C::Ag1() { return 0; }
21656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
22a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregorstatic int A::C::Ag2() { return 0; } // expected-error{{'static' can}}
23656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
24656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregorint A::C::cx = 17;
25656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
26656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
27a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregorstatic int A::C::cx2 = 17; // expected-error{{'static' can}}
28656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
29ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisclass C2 {
30584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor  void m(); // expected-note{{member declaration nearly matches}}
31584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
32584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor  void f(const int& parm); // expected-note{{member declaration nearly matches}}
33584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor  void f(int) const; // expected-note{{member declaration nearly matches}}
34584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor  void f(float);
35584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
36ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  int x;
37ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis};
38ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
397c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallvoid C2::m() const { } // expected-error{{out-of-line definition of 'm' does not match any declaration in 'C2'}}
40584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
417c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallvoid C2::f(int) { } // expected-error{{out-of-line definition of 'f' does not match any declaration in 'C2'}}
42584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
43ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisvoid C2::m() {
44ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  x = 0;
45ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
46ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
47ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisnamespace B {
48011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner  void ::A::Af() {} // expected-error {{definition or redeclaration of 'Af' not in a namespace enclosing 'A'}}
49ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
50ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
51ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisvoid f1() {
52584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor  void A::Af(); // expected-error {{definition or redeclaration of 'Af' not allowed inside a function}}
53ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
54ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
55ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisvoid f2() {
56ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  A:: ; // expected-error {{expected unqualified-id}}
57ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  A::C::undef = 0; // expected-error {{no member named 'undef'}}
58ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  ::A::C::cx = 0;
59ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  int x = ::A::ax = A::C::cx;
60ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  x = sizeof(A::C);
61ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  x = sizeof(::A::C::cx);
62ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
63ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
64ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios KyrtzidisA::C c1;
65ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisstruct A::C c2;
66ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisstruct S : public A::C {};
671eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregorstruct A::undef; // expected-error {{no struct named 'undef' in namespace 'A'}}
68ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
695239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidisnamespace A2 {
705239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis  typedef int INT;
715239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis  struct RC;
7277407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis  struct CC {
7377407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis    struct NC;
7477407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis  };
755239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis}
765239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis
775239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidisstruct A2::RC {
785239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis  INT x;
795239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis};
805239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis
8177407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidisstruct A2::CC::NC {
8277407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis  void m() {}
8377407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis};
8477407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis
85ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisvoid f3() {
86ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  N::x = 0; // expected-error {{use of undeclared identifier 'N'}}
87ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  int N;
88ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  N::x = 0; // expected-error {{expected a class or namespace}}
89ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  { int A;           A::ax = 0; }
903dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor  { typedef int A;   A::ax = 0; } // expected-error{{expected a class or namespace}}
91ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  { typedef A::C A;  A::ax = 0; } // expected-error {{no member named 'ax'}}
92ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  { typedef A::C A;  A::cx = 0; }
93ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
9408b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis
9508b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis// make sure the following doesn't hit any asserts
968129edbb576c297df8631c3db4ac1339f4a9e8adChris Lattnervoid f4(undef::C); // expected-error {{use of undeclared identifier 'undef'}} \
978129edbb576c297df8631c3db4ac1339f4a9e8adChris Lattner                      expected-error {{variable has incomplete type 'void'}}
98584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
99584049d49d956add7bce5669e9823491f7d8de78Douglas Gregortypedef void C2::f5(int); // expected-error{{typedef declarator cannot be qualified}}
100584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
101584049d49d956add7bce5669e9823491f7d8de78Douglas Gregorvoid f6(int A2::RC::x); // expected-error{{parameter declarator cannot be qualified}}
102584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
103584049d49d956add7bce5669e9823491f7d8de78Douglas Gregorint A2::RC::x; // expected-error{{non-static data member defined out-of-line}}
104584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
10534fa29485d6e0b22f1f32852f34e483db0f90b0dChandler Carruthvoid A2::CC::NC::m(); // expected-error{{out-of-line declaration of a member must be a definition}}
1063dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor
1073dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor
1083dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregornamespace E {
1093dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor  int X = 5;
1103dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor
1113dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor  namespace Nested {
1123dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor    enum E {
1133dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor      X = 0
1143dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor    };
1153dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor
1163dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor    void f() {
1173dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor      return E::X; // expected-error{{expected a class or namespace}}
1183dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor    }
1193dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor  }
1203dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor}
12170316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
12270316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
12370316a065bcf11c88143e22c88d530ebd320832fDouglas Gregorclass Operators {
12470316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  Operators operator+(const Operators&) const; // expected-note{{member declaration nearly matches}}
12570316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  operator bool();
12670316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor};
12770316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
1287c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallOperators Operators::operator+(const Operators&) { // expected-error{{out-of-line definition of 'operator+' does not match any declaration in 'Operators'}}
12970316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  Operators ops;
13070316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  return ops;
13170316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor}
13270316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
13370316a065bcf11c88143e22c88d530ebd320832fDouglas GregorOperators Operators::operator+(const Operators&) const {
13470316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  Operators ops;
13570316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  return ops;
13670316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor}
13770316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
13870316a065bcf11c88143e22c88d530ebd320832fDouglas GregorOperators::operator bool() {
13970316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  return true;
14070316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor}
1414ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1424ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregornamespace A {
1434ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor  void g(int&); // expected-note{{member declaration nearly matches}}
1444ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor}
1454ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1463f09327b26033d0a9676d52d80cf92c48f581affDouglas Gregorvoid A::f() {} // expected-error{{out-of-line definition of 'f' does not match any declaration in namespace 'A'}}
1474ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1483f09327b26033d0a9676d52d80cf92c48f581affDouglas Gregorvoid A::g(const int&) { } // expected-error{{out-of-line definition of 'g' does not match any declaration in namespace 'A'}}
1494ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1504ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorstruct Struct { };
1514ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1527c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallvoid Struct::f() { } // expected-error{{out-of-line definition of 'f' does not match any declaration in 'Struct'}}
1534ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1544ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid global_func(int);
1554ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid global_func2(int);
1564ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1574ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregornamespace N {
1584ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor  void ::global_func(int) { } // expected-error{{definition or redeclaration of 'global_func' cannot name the global scope}}
1594ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1604ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor  void f();
1614ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor  // FIXME: if we move this to a separate definition of N, things break!
1624ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor}
1634ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid ::global_func2(int) { } // expected-error{{definition or redeclaration of 'global_func2' cannot name the global scope}}
1644ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1654ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid N::f() { } // okay
1669fa14a547881e7abbe1edcdb92e6d3084be8d8bcDouglas Gregor
1677c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct Y;  // expected-note{{forward declaration of 'Y'}}
1689ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey YasskinY::foo y; // expected-error{{incomplete type 'Y' named in nested name specifier}}
1694fdf1faedbca40787fd277a6fbd5061fd69b2708Douglas Gregor
1709fa14a547881e7abbe1edcdb92e6d3084be8d8bcDouglas GregorX::X() : a(5) { } // expected-error{{use of undeclared identifier 'X'}} \
171a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson      // expected-error{{C++ requires a type specifier for all declarations}} \
172a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson      // expected-error{{only constructors take base initializers}}
173c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner
174f37006bc8a9d398d40d6ce329f023ed1a92fe484Argyrios Kyrtzidisstruct foo_S {
175f37006bc8a9d398d40d6ce329f023ed1a92fe484Argyrios Kyrtzidis  static bool value;
176f37006bc8a9d398d40d6ce329f023ed1a92fe484Argyrios Kyrtzidis};
177f37006bc8a9d398d40d6ce329f023ed1a92fe484Argyrios Kyrtzidisbool (foo_S::value);
178c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner
179c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner
180c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattnernamespace somens {
181220ccbf2c9ef97034cce80561f9f46c4f1f63bc7John McCall  struct a { }; // expected-note{{candidate constructor (the implicit copy constructor)}}
182c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner}
183c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner
184c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattnertemplate <typename T>
185c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattnerclass foo {
186c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner};
187c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner
188c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner
18946646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner// PR4452 / PR4451
19046646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattnerfoo<somens:a> a2;  // expected-error {{unexpected ':' in nested name specifier}}
191c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner
1927abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregorsomens::a a3 = a2; // expected-error {{no viable conversion}}
193c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner
1941d7c52803e49d651a66cee782e264f62078c1da5John McCall// typedefs and using declarations.
1951d7c52803e49d651a66cee782e264f62078c1da5John McCallnamespace test1 {
1961d7c52803e49d651a66cee782e264f62078c1da5John McCall  namespace ns {
1977002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall    class Counter { public: static int count; };
1981d7c52803e49d651a66cee782e264f62078c1da5John McCall    typedef Counter counter;
1991d7c52803e49d651a66cee782e264f62078c1da5John McCall  }
2001d7c52803e49d651a66cee782e264f62078c1da5John McCall  using ns::counter;
201c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner
2021d7c52803e49d651a66cee782e264f62078c1da5John McCall  class Test {
2031d7c52803e49d651a66cee782e264f62078c1da5John McCall    void test1() {
2041d7c52803e49d651a66cee782e264f62078c1da5John McCall      counter c;
2051d7c52803e49d651a66cee782e264f62078c1da5John McCall      c.count++;
2061d7c52803e49d651a66cee782e264f62078c1da5John McCall      counter::count++;
2071d7c52803e49d651a66cee782e264f62078c1da5John McCall    }
2081d7c52803e49d651a66cee782e264f62078c1da5John McCall  };
2091d7c52803e49d651a66cee782e264f62078c1da5John McCall}
210731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall
211731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall// We still need to do lookup in the lexical scope, even if we push a
212731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall// non-lexical scope.
213731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCallnamespace test2 {
214731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall  namespace ns {
21578a527af9995e936c0fc7dc01a061810cabf4c31Sebastian Redl    extern int *count_ptr;
216731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall  }
217731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall  namespace {
218731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall    int count = 0;
219731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall  }
220731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall
221731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall  int *ns::count_ptr = &count;
222731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall}
2234c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall
2244c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall// PR6259, invalid case
2254c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCallnamespace test3 {
2269ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskin  class A; // expected-note {{forward declaration}}
2274c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall  void foo(const char *path) {
2289ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskin    A::execute(path); // expected-error {{incomplete type 'test3::A' named in nested name specifier}}
2294c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall  }
2304c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall}
23100b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor
23200b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregornamespace PR7133 {
23300b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor  namespace A {
23400b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor    class Foo;
23500b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor  }
23600b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor
23700b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor  namespace A {
23800b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor    namespace B {
23900b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor      bool foo(Foo &);
24000b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor    }
24100b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor  }
24200b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor
24300b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor  bool A::B::foo(Foo &) {
24400b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor    return false;
24500b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor  }
24600b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor}
247c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet
248c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichetclass CLASS {
249c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet  void CLASS::foo2(); // expected-warning {{extra qualification on member 'foo2'}}
250c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet};
251922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor
252922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregornamespace PR8159 {
253922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor  class B { };
254922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor
255922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor  class A {
256922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor    int A::a; // expected-warning{{extra qualification on member 'a'}}
257922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor    static int A::b; // expected-warning{{extra qualification on member 'b'}}
258922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor    int ::c; // expected-error{{non-friend class member 'c' cannot have a qualified name}}
259922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor  };
260922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor}
2611de34dd8a6932fbb316e35304bf468ddb4a0841bArgyrios Kyrtzidis
2621de34dd8a6932fbb316e35304bf468ddb4a0841bArgyrios Kyrtzidisnamespace rdar7980179 {
2631de34dd8a6932fbb316e35304bf468ddb4a0841bArgyrios Kyrtzidis  class A { void f0(); }; // expected-note {{previous}}
2641de34dd8a6932fbb316e35304bf468ddb4a0841bArgyrios Kyrtzidis  int A::f0() {} // expected-error {{out-of-line definition of 'rdar7980179::A::f0' differ from the declaration in the return type}}
2651de34dd8a6932fbb316e35304bf468ddb4a0841bArgyrios Kyrtzidis}
266fa0b48fd2af19f862242dc3643e4e95baea25d4eDouglas Gregor
267fa0b48fd2af19f862242dc3643e4e95baea25d4eDouglas Gregornamespace alias = A;
268fa0b48fd2af19f862242dc3643e4e95baea25d4eDouglas Gregordouble *dp = (alias::C*)0; // expected-error{{cannot initialize a variable of type 'double *' with an rvalue of type 'alias::C *'}}
269