nested-name-spec.cpp revision 0576681bac125be07f77f66b02a3dba2c3a24557
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 { 301055393814ac989727aa7437a5f3c3c44b4f83e5Kaelyn Uhrain void m(); // expected-note{{member declaration does not match because it is not const qualified}} 31584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor 324d9d157afb35742bc6348defbe45bc6de780ec77Kaelyn Uhrain void f(const int& parm); // expected-note{{type of 1st parameter of member declaration does not match definition ('const int &' vs 'int')}} 331055393814ac989727aa7437a5f3c3c44b4f83e5Kaelyn Uhrain void f(int) const; // expected-note{{member declaration does not match because it is const qualified}} 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 { 48a1c4f7c833093f87d5187c4449a3d4534cfa40a4Richard Smith void ::A::Af() {} // expected-error {{cannot define or redeclare 'Af' here because namespace 'B' does not enclose namespace '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 960576681bac125be07f77f66b02a3dba2c3a24557Richard Smithvoid f4(undef::C); // expected-error {{use of undeclared identifier 'undef'}} 97584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor 98584049d49d956add7bce5669e9823491f7d8de78Douglas Gregortypedef void C2::f5(int); // expected-error{{typedef declarator cannot be qualified}} 99584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor 100584049d49d956add7bce5669e9823491f7d8de78Douglas Gregorvoid f6(int A2::RC::x); // expected-error{{parameter declarator cannot be qualified}} 101584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor 102584049d49d956add7bce5669e9823491f7d8de78Douglas Gregorint A2::RC::x; // expected-error{{non-static data member defined out-of-line}} 103584049d49d956add7bce5669e9823491f7d8de78Douglas Gregor 10434fa29485d6e0b22f1f32852f34e483db0f90b0dChandler Carruthvoid A2::CC::NC::m(); // expected-error{{out-of-line declaration of a member must be a definition}} 1053dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor 1063dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor 1073dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregornamespace E { 1083dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor int X = 5; 1093dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor 1103dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor namespace Nested { 1113dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor enum E { 1123dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor X = 0 1133dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor }; 1143dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor 115ef094a1ab79c57269b627cb19748384d9a26fb31Kaelyn Uhrain void f() { 1163dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor return E::X; // expected-error{{expected a class or namespace}} 1173dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor } 1183dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor } 1193dde5a3fa28cae4b8b2fb060abc0bfc2b4425ed8Douglas Gregor} 12070316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor 12170316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor 12270316a065bcf11c88143e22c88d530ebd320832fDouglas Gregorclass Operators { 1231055393814ac989727aa7437a5f3c3c44b4f83e5Kaelyn Uhrain Operators operator+(const Operators&) const; // expected-note{{member declaration does not match because it is const qualified}} 12470316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor operator bool(); 12570316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor}; 12670316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor 1277c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallOperators Operators::operator+(const Operators&) { // expected-error{{out-of-line definition of 'operator+' does not match any declaration in 'Operators'}} 12870316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor Operators ops; 12970316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor return ops; 13070316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor} 13170316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor 13270316a065bcf11c88143e22c88d530ebd320832fDouglas GregorOperators Operators::operator+(const Operators&) const { 13370316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor Operators ops; 13470316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor return ops; 13570316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor} 13670316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor 13770316a065bcf11c88143e22c88d530ebd320832fDouglas GregorOperators::operator bool() { 13870316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor return true; 13970316a065bcf11c88143e22c88d530ebd320832fDouglas Gregor} 1404ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor 1414ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregornamespace A { 1424d9d157afb35742bc6348defbe45bc6de780ec77Kaelyn Uhrain void g(int&); // expected-note{{type of 1st parameter of member declaration does not match definition ('int &' vs 'const int &')}} 1434ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor} 1444ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor 145ef094a1ab79c57269b627cb19748384d9a26fb31Kaelyn Uhrainvoid A::f() {} // expected-error-re{{out-of-line definition of 'f' does not match any declaration in namespace 'A'$}} 1464ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor 1473f09327b26033d0a9676d52d80cf92c48f581affDouglas Gregorvoid A::g(const int&) { } // expected-error{{out-of-line definition of 'g' does not match any declaration in namespace 'A'}} 1484ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor 1494ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorstruct Struct { }; 1504ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor 1517c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallvoid Struct::f() { } // expected-error{{out-of-line definition of 'f' does not match any declaration in 'Struct'}} 1524ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor 1534ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid global_func(int); 1544ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid global_func2(int); 1554ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor 1564ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregornamespace N { 1574ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor void ::global_func(int) { } // expected-error{{definition or redeclaration of 'global_func' cannot name the global scope}} 1584ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor 1594ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor void f(); 1604ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor // FIXME: if we move this to a separate definition of N, things break! 1614ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor} 1626960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregorvoid ::global_func2(int) { } // expected-warning{{extra qualification on member 'global_func2'}} 1634ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregor 1644ce205f94c984ddc4776ba0c3de7e398d251653aDouglas Gregorvoid N::f() { } // okay 1659fa14a547881e7abbe1edcdb92e6d3084be8d8bcDouglas Gregor 1667c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct Y; // expected-note{{forward declaration of 'Y'}} 1679ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey YasskinY::foo y; // expected-error{{incomplete type 'Y' named in nested name specifier}} 1684fdf1faedbca40787fd277a6fbd5061fd69b2708Douglas Gregor 1699fa14a547881e7abbe1edcdb92e6d3084be8d8bcDouglas GregorX::X() : a(5) { } // expected-error{{use of undeclared identifier 'X'}} \ 170a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson // expected-error{{C++ requires a type specifier for all declarations}} \ 171a7b3521ef52d983bd0e7fa562bb9ef1393f14634Anders Carlsson // expected-error{{only constructors take base initializers}} 172c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner 173f37006bc8a9d398d40d6ce329f023ed1a92fe484Argyrios Kyrtzidisstruct foo_S { 174f37006bc8a9d398d40d6ce329f023ed1a92fe484Argyrios Kyrtzidis static bool value; 175f37006bc8a9d398d40d6ce329f023ed1a92fe484Argyrios Kyrtzidis}; 176f37006bc8a9d398d40d6ce329f023ed1a92fe484Argyrios Kyrtzidisbool (foo_S::value); 177c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner 178c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner 179c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattnernamespace somens { 180220ccbf2c9ef97034cce80561f9f46c4f1f63bc7John McCall struct a { }; // expected-note{{candidate constructor (the implicit copy constructor)}} 181c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner} 182c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner 183c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattnertemplate <typename T> 184c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattnerclass foo { 185c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner}; 186c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner 187c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner 18846646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner// PR4452 / PR4451 18946646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattnerfoo<somens:a> a2; // expected-error {{unexpected ':' in nested name specifier}} 190c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner 1917abfbdbc97ad8e7f340789f751df1e32b10118b4Douglas Gregorsomens::a a3 = a2; // expected-error {{no viable conversion}} 192c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner 1931d7c52803e49d651a66cee782e264f62078c1da5John McCall// typedefs and using declarations. 1941d7c52803e49d651a66cee782e264f62078c1da5John McCallnamespace test1 { 1951d7c52803e49d651a66cee782e264f62078c1da5John McCall namespace ns { 1967002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall class Counter { public: static int count; }; 1971d7c52803e49d651a66cee782e264f62078c1da5John McCall typedef Counter counter; 1981d7c52803e49d651a66cee782e264f62078c1da5John McCall } 1991d7c52803e49d651a66cee782e264f62078c1da5John McCall using ns::counter; 200c8e27cc402043ec86c1698c09e4ee9e415b16207Chris Lattner 2011d7c52803e49d651a66cee782e264f62078c1da5John McCall class Test { 2021d7c52803e49d651a66cee782e264f62078c1da5John McCall void test1() { 2031d7c52803e49d651a66cee782e264f62078c1da5John McCall counter c; 2041d7c52803e49d651a66cee782e264f62078c1da5John McCall c.count++; 2051d7c52803e49d651a66cee782e264f62078c1da5John McCall counter::count++; 2061d7c52803e49d651a66cee782e264f62078c1da5John McCall } 2071d7c52803e49d651a66cee782e264f62078c1da5John McCall }; 2081d7c52803e49d651a66cee782e264f62078c1da5John McCall} 209731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall 210731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall// We still need to do lookup in the lexical scope, even if we push a 211731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall// non-lexical scope. 212731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCallnamespace test2 { 213731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall namespace ns { 21478a527af9995e936c0fc7dc01a061810cabf4c31Sebastian Redl extern int *count_ptr; 215731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall } 216731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall namespace { 217731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall int count = 0; 218731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall } 219731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall 220731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall int *ns::count_ptr = &count; 221731ad843b7bf1862f6547ac79539f0f5b4c539bdJohn McCall} 2224c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall 2234c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall// PR6259, invalid case 2244c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCallnamespace test3 { 2259ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskin class A; // expected-note {{forward declaration}} 2264c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall void foo(const char *path) { 2279ab14541716928894821cf5d53d6b4c95ffdf3a3Jeffrey Yasskin A::execute(path); // expected-error {{incomplete type 'test3::A' named in nested name specifier}} 2284c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall } 2294c72d3ec68b88868a75b3e6bbe5520dcefe86a95John McCall} 23000b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor 23100b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregornamespace PR7133 { 23200b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor namespace A { 23300b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor class Foo; 23400b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor } 23500b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor 23600b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor namespace A { 23700b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor namespace B { 23800b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor bool foo(Foo &); 23900b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor } 24000b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor } 24100b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor 24200b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor bool A::B::foo(Foo &) { 24300b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor return false; 24400b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor } 24500b4b039f02d338ae4774797053235a7e65abbdeDouglas Gregor} 246c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet 247c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichetclass CLASS { 248c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet void CLASS::foo2(); // expected-warning {{extra qualification on member 'foo2'}} 249c71d8eb6592ae3ef498fc57db3563d1dfae48dffFrancois Pichet}; 250922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor 251922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregornamespace PR8159 { 252922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor class B { }; 253922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor 254922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor class A { 255922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor int A::a; // expected-warning{{extra qualification on member 'a'}} 256922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor static int A::b; // expected-warning{{extra qualification on member 'b'}} 257922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor int ::c; // expected-error{{non-friend class member 'c' cannot have a qualified name}} 258922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor }; 259922fff2c9ef458fc04839e45a79552513f41ec7eDouglas Gregor} 2601de34dd8a6932fbb316e35304bf468ddb4a0841bArgyrios Kyrtzidis 2611de34dd8a6932fbb316e35304bf468ddb4a0841bArgyrios Kyrtzidisnamespace rdar7980179 { 2621de34dd8a6932fbb316e35304bf468ddb4a0841bArgyrios Kyrtzidis class A { void f0(); }; // expected-note {{previous}} 263239cad79cb5be7a0b29f9e0883203695d40079a8John McCall int A::f0() {} // expected-error {{out-of-line definition of 'rdar7980179::A::f0' differs from the declaration in the return type}} 2641de34dd8a6932fbb316e35304bf468ddb4a0841bArgyrios Kyrtzidis} 265fa0b48fd2af19f862242dc3643e4e95baea25d4eDouglas Gregor 266fa0b48fd2af19f862242dc3643e4e95baea25d4eDouglas Gregornamespace alias = A; 267fa0b48fd2af19f862242dc3643e4e95baea25d4eDouglas Gregordouble *dp = (alias::C*)0; // expected-error{{cannot initialize a variable of type 'double *' with an rvalue of type 'alias::C *'}} 268a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis 269a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis// http://llvm.org/PR10109 270a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisnamespace PR10109 { 271a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidistemplate<typename T> 272a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisstruct A { 273a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisprotected: 274a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis struct B; 275a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis struct B::C; // expected-error {{requires a template parameter list}} \ 27642aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor // expected-error {{no struct named 'C'}} \ 27742aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor // expected-error{{non-friend class member 'C' cannot have a qualified name}} 278a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis}; 279a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis 280a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidistemplate<typename T> 281a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisstruct A2 { 282a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisprotected: 283a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis struct B; 284a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis}; 285a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidistemplate <typename T> 286a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidisstruct A2<T>::B::C; // expected-error {{no struct named 'C'}} 287a7bf7bbdb1f89c35a09bc525c6862525ae82778fArgyrios Kyrtzidis} 2888d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain 2898d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrainnamespace PR13033 { 2908d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrainnamespace NS { 2918d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain int a; // expected-note {{'NS::a' declared here}} 2928d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain int longer_b; //expected-note {{'NS::longer_b' declared here}} 2938d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain} 2948d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain 2958d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain// Suggest adding a namespace qualifier to both variable names even though one 2968d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain// is only a single character long. 2978d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrainint foobar = a + longer_b; // expected-error {{use of undeclared identifier 'a'; did you mean 'NS::a'?}} \ 2988d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain // expected-error {{use of undeclared identifier 'longer_b'; did you mean 'NS::longer_b'?}} 2998d3607bf22a6a70acce3722a758f02d4ea84fc3aKaelyn Uhrain} 300