1a03c5eee51439b4d4d891284126831d10972e05cEli Friedman// RUN: %clang_cc1 -fsyntax-only -std=c++98 -verify -fblocks %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  };
116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int ax; // expected-note {{'ax' declared here}}
12ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  void Af();
13ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
14ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
15ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios KyrtzidisA:: ; // expected-error {{expected unqualified-id}}
166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines::A::ax::undef ex3; // expected-error {{'ax' is not a class, namespace, or scoped enumeration}}
17edc287751a4b05e3b4d8ff2b38fa30c5b59a548bJeffrey YasskinA::undef1::undef2 ex4; // expected-error {{no member named 'undef1'}}
18ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
19656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregorint A::C::Ag1() { return 0; }
20656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
21a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregorstatic int A::C::Ag2() { return 0; } // expected-error{{'static' can}}
22656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
23656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregorint A::C::cx = 17;
24656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
25656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
26a3a835149ed4b183e3b009a1f94a6123779d696bDouglas Gregorstatic int A::C::cx2 = 17; // expected-error{{'static' can}}
27656de633acefb7ced01a4b573dbd4f70b4300097Douglas Gregor
28ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisclass C2 {
291055393814ac989727aa7437a5f3c3c44b4f83e5Kaelyn Uhrain  void m(); // expected-note{{member declaration does not match because it is not const qualified}}
30584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
314d9d157afb35742bc6348defbe45bc6de780ec77Kaelyn Uhrain  void f(const int& parm); // expected-note{{type of 1st parameter of member declaration does not match definition ('const int &' vs 'int')}}
321055393814ac989727aa7437a5f3c3c44b4f83e5Kaelyn Uhrain  void f(int) const; // expected-note{{member declaration does not match because it is const qualified}}
33584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor  void f(float);
34584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
35ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  int x;
36ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis};
37ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
387c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallvoid C2::m() const { } // expected-error{{out-of-line definition of 'm' does not match any declaration in 'C2'}}
39584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
407c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallvoid C2::f(int) { } // expected-error{{out-of-line definition of 'f' does not match any declaration in 'C2'}}
41584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
42ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisvoid C2::m() {
43ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  x = 0;
44ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
45ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
46ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisnamespace B {
47a1c4f7c833093f87d5187c4449a3d4534cfa40a4Richard Smith  void ::A::Af() {} // expected-error {{cannot define or redeclare 'Af' here because namespace 'B' does not enclose namespace 'A'}}
48ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
49ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis
50ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidisvoid f1() {
51584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor  void A::Af(); // expected-error {{definition or redeclaration of 'Af' not allowed inside a function}}
52a03c5eee51439b4d4d891284126831d10972e05cEli Friedman  void (^x)() = ^{ void A::Af(); }; // expected-error {{definition or redeclaration of 'Af' not allowed inside a block}}
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'}}
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: Consider including the kind of entity that 'N' is ("variable 'N'
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // declared here", "template 'X' declared here", etc) to help explain what it
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // is if it's 'not a class, namespace, or scoped enumeration'.
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int N; // expected-note {{'N' declared here}}
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  N::x = 0; // expected-error {{'N' is not a class, namespace, or scoped enumeration}}
92ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  { int A;           A::ax = 0; }
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  { typedef int A;   A::ax = 0; } // expected-error{{'A' (aka 'int') is not a class, namespace, or scoped enumeration}}
94ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  { typedef A::C A;  A::ax = 0; } // expected-error {{no member named 'ax'}}
95ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis  { typedef A::C A;  A::cx = 0; }
96ef6e647b8d3268a765c2c4dd7f8a73cad281a8e6Argyrios Kyrtzidis}
9708b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis
9808b2c3743a29a2dddcf72e95f747760e213cdde7Argyrios Kyrtzidis// make sure the following doesn't hit any asserts
990576681bac125be07f77f66b02a3dba2c3a24557Richard Smithvoid f4(undef::C); // expected-error {{use of undeclared identifier 'undef'}}
100584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
101584049d49d956add7bce5669e9823491f7d8de78Douglas Gregortypedef void C2::f5(int); // expected-error{{typedef declarator cannot be qualified}}
102584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
103584049d49d956add7bce5669e9823491f7d8de78Douglas Gregorvoid f6(int A2::RC::x); // expected-error{{parameter declarator cannot be qualified}}
104584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
105584049d49d956add7bce5669e9823491f7d8de78Douglas Gregorint A2::RC::x; // expected-error{{non-static data member defined out-of-line}}
106584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor
10734fa29485d6e0b22f1f32852f34e483db0f90b0dChandler Carruthvoid A2::CC::NC::m(); // expected-error{{out-of-line declaration of a member must be a definition}}
1083dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor
1093dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor
1103dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregornamespace E {
1113dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor  int X = 5;
1123dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor
1133dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor  namespace Nested {
1143dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor    enum E {
1153dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor      X = 0
1163dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor    };
1173dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor
118ef094a1ab79c57269b627cb19748384d9a26fb31Kaelyn Uhrain    void f() {
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return E::X; // expected-error{{'E::Nested::E' is not a class, namespace, or scoped enumeration}}
1203dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor    }
1213dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor  }
1223dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor}
12370316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
12470316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
12570316a065bcf11c88143e22c88d530ebd320832fDouglas Gregorclass Operators {
1261055393814ac989727aa7437a5f3c3c44b4f83e5Kaelyn Uhrain  Operators operator+(const Operators&) const; // expected-note{{member declaration does not match because it is const qualified}}
12770316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  operator bool();
12870316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor};
12970316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
1307c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallOperators Operators::operator+(const Operators&) { // expected-error{{out-of-line definition of 'operator+' does not match any declaration in 'Operators'}}
13170316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  Operators ops;
13270316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  return ops;
13370316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor}
13470316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
13570316a065bcf11c88143e22c88d530ebd320832fDouglas GregorOperators Operators::operator+(const Operators&) const {
13670316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  Operators ops;
13770316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  return ops;
13870316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor}
13970316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor
14070316a065bcf11c88143e22c88d530ebd320832fDouglas GregorOperators::operator bool() {
14170316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor  return true;
14270316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor}
1434ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1444ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregornamespace A {
1454d9d157afb35742bc6348defbe45bc6de780ec77Kaelyn Uhrain  void g(int&); // expected-note{{type of 1st parameter of member declaration does not match definition ('int &' vs 'const int &')}}
1464ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor}
1474ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid A::f() {} // expected-error-re{{out-of-line definition of 'f' does not match any declaration in namespace 'A'{{$}}}}
1494ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1503f09327b26033d0a9676d52d80cf92c48f581affDouglas Gregorvoid A::g(const int&) { } // expected-error{{out-of-line definition of 'g' does not match any declaration in namespace 'A'}}
1514ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1524ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorstruct Struct { };
1534ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1547c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallvoid Struct::f() { } // expected-error{{out-of-line definition of 'f' does not match any declaration in 'Struct'}}
1554ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1564ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid global_func(int);
1574ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid global_func2(int);
1584ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1594ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregornamespace N {
1604ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor  void ::global_func(int) { } // expected-error{{definition or redeclaration of 'global_func' cannot name the global scope}}
1614ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1624ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor  void f();
1634ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor  // FIXME: if we move this to a separate definition of N, things break!
1644ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor}
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ::global_func2(int) { } // expected-warning{{extra qualification on member 'global_func2'}}
1664ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor
1674ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid N::f() { } // okay
1689fa14a547881e7abbe1edcdb92e6d3084be8d8bcDouglas Gregor
1697c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct Y;  // expected-note{{forward declaration of 'Y'}}
1709ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey YasskinY::foo y; // expected-error{{incomplete type 'Y' named in nested name specifier}}
1714fdf1faedbca40787fd277a6fbd5061fd69b2708Douglas Gregor
172b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard SmithX::X() : a(5) { } // expected-error{{use of undeclared identifier 'X'}}
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 {
24975379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor  void CLASS::foo2(); // expected-error {{extra qualification on member 'foo2'}}
250c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet};
251922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor
252922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregornamespace PR8159 {
253922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor  class B { };
254922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor
255922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor  class A {
25675379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor    int A::a; // expected-error{{extra qualification on member 'a'}}
25775379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor    static int A::b; // expected-error{{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}}
2648ef1b372b4a13e79ac827b15635cd0fe08170189Richard Smith  int A::f0() {} // expected-error {{return type of out-of-line definition of 'rdar7980179::A::f0' differs}}
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 *'}}
269a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis
270a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis// http://llvm.org/PR10109
271a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisnamespace PR10109 {
272a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidistemplate<typename T>
273a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisstruct A {
274a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisprotected:
275a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis  struct B;
276a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis  struct B::C; // expected-error {{requires a template parameter list}} \
27742aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor               // expected-error {{no struct named 'C'}} \
27842aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor    // expected-error{{non-friend class member 'C' cannot have a qualified name}}
279a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis};
280a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis
281a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidistemplate<typename T>
282a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisstruct A2 {
283a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisprotected:
284a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis  struct B;
285a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis};
286a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidistemplate <typename T>
287a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisstruct A2<T>::B::C; // expected-error {{no struct named 'C'}}
288a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis}
2898d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain
2908d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrainnamespace PR13033 {
2918d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrainnamespace NS {
2928d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain int a; // expected-note {{'NS::a' declared here}}
2938d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain int longer_b; //expected-note {{'NS::longer_b' declared here}}
2948d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain}
2958d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain
2968d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain// Suggest adding a namespace qualifier to both variable names even though one
2978d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain// is only a single character long.
2988d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrainint foobar = a + longer_b; // expected-error {{use of undeclared identifier 'a'; did you mean 'NS::a'?}} \
2998d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain                           // expected-error {{use of undeclared identifier 'longer_b'; did you mean 'NS::longer_b'?}}
3008d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain}
30186a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor
30286a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor// <rdar://problem/13853540>
30386a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregornamespace N {
30486a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor  struct X { };
30586a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor  namespace N {
30686a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor    struct Foo {
30786a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor      struct N::X *foo(); // expected-error{{no struct named 'X' in namespace 'N::N'}}
30886a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor    };
30986a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor  }
31086a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor}
311c02bea4e807de99dc0690ef814500b6266d9b6c9Eli Friedman
312c02bea4e807de99dc0690ef814500b6266d9b6c9Eli Friedmannamespace TypedefNamespace { typedef int F; };
313651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTypedefNamespace::F::NonexistentName BadNNSWithCXXScopeSpec; // expected-error {{'F' (aka 'int') is not a class, namespace, or scoped enumeration}}
314