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