1546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s 2ba5f6eced29937e4e4851a2c0980744768413d66Nick Lewycky// RUN: cp %s %t 327766d2501259c7b12b1056e0c491a927b304e10Douglas Gregor// RUN: not %clang_cc1 -fsyntax-only -fixit -x c++ %t 4ba5f6eced29937e4e4851a2c0980744768413d66Nick Lewycky// RUN: %clang_cc1 -fsyntax-only -pedantic -Werror -x c++ %t 527766d2501259c7b12b1056e0c491a927b304e10Douglas Gregor// RUN: grep test_string %t 69a632eaa0ee73e4db701a8df74e92909d1fa350eDouglas Gregor 7546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregornamespace std { 8b2567ddad9a1142d7224e5363029d640e8f4f59dKaelyn Uhrain template<typename T> class basic_string { // expected-note 3{{'basic_string' declared here}} 97002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall public: 1067dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor int find(const char *substr); // expected-note{{'find' declared here}} 1167dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor static const int npos = -1; // expected-note{{'npos' declared here}} 12bb092bafa984e9fa05136b5cef40fd4374dea0f6Douglas Gregor }; 13bb092bafa984e9fa05136b5cef40fd4374dea0f6Douglas Gregor 1467dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor typedef basic_string<char> string; // expected-note 2{{'string' declared here}} 15546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregor} 16546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregor 176699220f73f11e471b5e5aa42eaf064afeaa079eDouglas Gregornamespace otherstd { // expected-note 2{{'otherstd' declared here}} \ 18ed8407692d47833abddd31a8cf30bf560e771c9bDouglas Gregor // expected-note{{namespace 'otherstd' defined here}} 19546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregor using namespace std; 20546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregor} 21546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregor 22546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregorusing namespace std; 23546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregor 24175a65686eba7c7a9cb02412136fddd2d2c56dd7Douglas Gregorother_std::strng str1; // expected-error{{use of undeclared identifier 'other_std'; did you mean 'otherstd'?}} \ 25175a65686eba7c7a9cb02412136fddd2d2c56dd7Douglas Gregor// expected-error{{no type named 'strng' in namespace 'otherstd'; did you mean 'string'?}} 26546be3c5c000626c8cdf65e32e8ed9b90c424eddDouglas Gregortring str2; // expected-error{{unknown type name 'tring'; did you mean 'string'?}} 27bb092bafa984e9fa05136b5cef40fd4374dea0f6Douglas Gregor 286c409a031946c069b7f8c33e7d71175563028afbDouglas Gregor::other_std::string str3; // expected-error{{no member named 'other_std' in the global namespace; did you mean 'otherstd'?}} 296c409a031946c069b7f8c33e7d71175563028afbDouglas Gregor 30539c5c34063066753f27bb0f39fdcde1acc06328Douglas Gregorfloat area(float radius, // expected-note{{'radius' declared here}} 31539c5c34063066753f27bb0f39fdcde1acc06328Douglas Gregor float pi) { 32539c5c34063066753f27bb0f39fdcde1acc06328Douglas Gregor return radious * pi; // expected-error{{did you mean 'radius'?}} 33bb092bafa984e9fa05136b5cef40fd4374dea0f6Douglas Gregor} 34bb092bafa984e9fa05136b5cef40fd4374dea0f6Douglas Gregor 356699220f73f11e471b5e5aa42eaf064afeaa079eDouglas Gregorusing namespace othestd; // expected-error{{no namespace named 'othestd'; did you mean 'otherstd'?}} 36ed8407692d47833abddd31a8cf30bf560e771c9bDouglas Gregornamespace blargh = otherstd; // expected-note 3{{namespace 'blargh' defined here}} 376699220f73f11e471b5e5aa42eaf064afeaa079eDouglas Gregorusing namespace ::blarg; // expected-error{{no namespace named 'blarg' in the global namespace; did you mean 'blargh'?}} 386699220f73f11e471b5e5aa42eaf064afeaa079eDouglas Gregor 390e8c4b9fac447c6c9849e3ef8beb1ef273ac0f97Douglas Gregornamespace wibble = blarg; // expected-error{{no namespace named 'blarg'; did you mean 'blargh'?}} 400e8c4b9fac447c6c9849e3ef8beb1ef273ac0f97Douglas Gregornamespace wobble = ::blarg; // expected-error{{no namespace named 'blarg' in the global namespace; did you mean 'blargh'?}} 410e8c4b9fac447c6c9849e3ef8beb1ef273ac0f97Douglas Gregor 42bb092bafa984e9fa05136b5cef40fd4374dea0f6Douglas Gregorbool test_string(std::string s) { 43bfea239cafdb13256982eb891b151c5c07c1e7a9Douglas Gregor basc_string<char> b1; // expected-error{{no template named 'basc_string'; did you mean 'basic_string'?}} 44bfea239cafdb13256982eb891b151c5c07c1e7a9Douglas Gregor std::basic_sting<char> b2; // expected-error{{no template named 'basic_sting' in namespace 'std'; did you mean 'basic_string'?}} 45bfea239cafdb13256982eb891b151c5c07c1e7a9Douglas Gregor (void)b1; 46bfea239cafdb13256982eb891b151c5c07c1e7a9Douglas Gregor (void)b2; 477c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall return s.fnd("hello") // expected-error{{no member named 'fnd' in 'std::basic_string<char>'; did you mean 'find'?}} 487c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall == std::string::pos; // expected-error{{no member named 'pos' in 'std::basic_string<char>'; did you mean 'npos'?}} 49bb092bafa984e9fa05136b5cef40fd4374dea0f6Douglas Gregor} 50fe0241e31dd2d1af60116adf6f71dedc88cd1f68Douglas Gregor 51fe0241e31dd2d1af60116adf6f71dedc88cd1f68Douglas Gregorstruct Base { }; 527c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct Derived : public Base { // expected-note{{base class 'Base' specified here}} 5367dd1d4df1b28973e12e0981129b2517d2033b66Douglas Gregor int member; // expected-note 3{{'member' declared here}} 54fe0241e31dd2d1af60116adf6f71dedc88cd1f68Douglas Gregor 55fe0241e31dd2d1af60116adf6f71dedc88cd1f68Douglas Gregor Derived() : base(), // expected-error{{initializer 'base' does not name a non-static data member or base class; did you mean the base class 'Base'?}} 56fe0241e31dd2d1af60116adf6f71dedc88cd1f68Douglas Gregor ember() { } // expected-error{{initializer 'ember' does not name a non-static data member or base class; did you mean the member 'member'?}} 57e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregor 58e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregor int getMember() const { 59e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregor return ember; // expected-error{{use of undeclared identifier 'ember'; did you mean 'member'?}} 60e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregor } 61e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregor 62e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregor int &getMember(); 63fe0241e31dd2d1af60116adf6f71dedc88cd1f68Douglas Gregor}; 64e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregor 65e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregorint &Derived::getMember() { 66e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregor return ember; // expected-error{{use of undeclared identifier 'ember'; did you mean 'member'?}} 67e3582011a63a78cdfa0917077ed87ccb9b3a87b5Douglas Gregor} 683b887354b1b667c97d070ddc67b5354353c4c07bDouglas Gregor 693b887354b1b667c97d070ddc67b5354353c4c07bDouglas Gregortypedef int Integer; // expected-note{{'Integer' declared here}} 703b887354b1b667c97d070ddc67b5354353c4c07bDouglas Gregorint global_value; // expected-note{{'global_value' declared here}} 713b887354b1b667c97d070ddc67b5354353c4c07bDouglas Gregor 723b887354b1b667c97d070ddc67b5354353c4c07bDouglas Gregorint foo() { 733b887354b1b667c97d070ddc67b5354353c4c07bDouglas Gregor integer * i = 0; // expected-error{{unknown type name 'integer'; did you mean 'Integer'?}} 743b887354b1b667c97d070ddc67b5354353c4c07bDouglas Gregor unsinged *ptr = 0; // expected-error{{use of undeclared identifier 'unsinged'; did you mean 'unsigned'?}} 753b887354b1b667c97d070ddc67b5354353c4c07bDouglas Gregor return *i + *ptr + global_val; // expected-error{{use of undeclared identifier 'global_val'; did you mean 'global_value'?}} 763b887354b1b667c97d070ddc67b5354353c4c07bDouglas Gregor} 77d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor 78d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregornamespace nonstd { 796952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie typedef std::basic_string<char> yarn; // expected-note 2 {{'nonstd::yarn' declared here}} 806952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie int narf; // expected-note{{'nonstd::narf' declared here}} 81d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor} 82d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor 83d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregoryarn str4; // expected-error{{unknown type name 'yarn'; did you mean 'nonstd::yarn'?}} 846952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikiewibble::yarn str5; // expected-error{{no type named 'yarn' in namespace 'otherstd'; did you mean 'nonstd::yarn'?}} 856952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie 868d90b4ab994c48c4b6d53122282dc93ac722bfc7Kaelyn Uhrainnamespace another { 878d90b4ab994c48c4b6d53122282dc93ac722bfc7Kaelyn Uhrain template<typename T> class wide_string {}; // expected-note {{'another::wide_string' declared here}} 888d90b4ab994c48c4b6d53122282dc93ac722bfc7Kaelyn Uhrain} 896952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikieint poit() { 90b2567ddad9a1142d7224e5363029d640e8f4f59dKaelyn Uhrain nonstd::basic_string<char> str; // expected-error{{no template named 'basic_string' in namespace 'nonstd'; did you mean simply 'basic_string'?}} 918d90b4ab994c48c4b6d53122282dc93ac722bfc7Kaelyn Uhrain nonstd::wide_string<char> str2; // expected-error{{no template named 'wide_string' in namespace 'nonstd'; did you mean 'another::wide_string'?}} 926952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie return wibble::narf; // expected-error{{no member named 'narf' in namespace 'otherstd'; did you mean 'nonstd::narf'?}} 936952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie} 9407f4a06c402a2ccdd9eae7a3d710990b22040001Douglas Gregor 9507f4a06c402a2ccdd9eae7a3d710990b22040001Douglas Gregornamespace check_bool { 9607f4a06c402a2ccdd9eae7a3d710990b22040001Douglas Gregor void f() { 9707f4a06c402a2ccdd9eae7a3d710990b22040001Douglas Gregor Bool b; // expected-error{{use of undeclared identifier 'Bool'; did you mean 'bool'?}} 9807f4a06c402a2ccdd9eae7a3d710990b22040001Douglas Gregor } 9907f4a06c402a2ccdd9eae7a3d710990b22040001Douglas Gregor} 1006952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie 1016952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikienamespace outr { 1026952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie} 1036952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikienamespace outer { 1046952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie namespace inner { // expected-note{{'outer::inner' declared here}} \ 1056952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie // expected-note{{namespace 'outer::inner' defined here}} \ 1066952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie // expected-note{{'inner' declared here}} 1076952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie int i; 1086952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie } 1096952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie} 1106952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie 1116952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikieusing namespace outr::inner; // expected-error{{no namespace named 'inner' in namespace 'outr'; did you mean 'outer::inner'?}} 1126952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie 1136952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikievoid func() { 1146952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie outr::inner::i = 3; // expected-error{{no member named 'inner' in namespace 'outr'; did you mean 'outer::inner'?}} 1156952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie outer::innr::i = 4; // expected-error{{no member named 'innr' in namespace 'outer'; did you mean 'inner'?}} 1166952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie} 1176952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie 1186952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikiestruct base { 1196952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie}; 1206952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikiestruct derived : base { 1216952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie int i; 1226952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie}; 1236952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie 1246952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikievoid func2() { 1256952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie derived d; 1266952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie // FIXME: we should offer a fix here. We do if the 'i' is misspelled, but we don't do name qualification changes 1276952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie // to replace base::i with derived::i as we would for other qualified name misspellings. 1286952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie // d.base::i = 3; 1296952c018318a8ce57e336d7ed2a4819a98182fa2David Blaikie} 1306c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain 1316c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrainclass A { 1326c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain void bar(int); 1336c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain}; 1346c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrainvoid bar(int, int); // expected-note{{'::bar' declared here}} 1356c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrainvoid A::bar(int x) { 1366c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain bar(x, 5); // expected-error{{too many arguments to function call, expected 1, have 2; did you mean '::bar'?}} 1376c4898b6ff23950cddca6948ef3fa0dd1848f6f1Kaelyn Uhrain} 138