11d23c4219527d9a2bc75f5cdb1ffcaefb8bcc61bDavid Blaikie// RUN: %clang_cc1 -fsyntax-only -verify -Wno-bool-conversion %s 21be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 31be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregortypedef __typeof__(((int*)0)-((int*)0)) ptrdiff_t; 41be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 51be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregornamespace DontResolveTooEarly_WaitForOverloadResolution 61be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor{ 71be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor template <class T> T* f(int); // #1 81be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor template <class T, class U> T& f(U); // #2 91be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 101be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor void g() { 111be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor int *ip = f<int>(1); // calls #1 121be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor } 131be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 141be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor template <class T> 151be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor T* f2(int); 161be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor template <class T, class U> 171be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor T& f2(U); 181be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 191be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor void g2() { 201be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor int*ip = (f2<int>)(1); // ok 211be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor } 221be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 231be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor} // End namespace 241be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 25353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregornamespace DontAllowUnresolvedOverloadedExpressionInAnUnusedExpression 26353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor{ 27353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor void one() { } 28353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor template<class T> void oneT() { } 29353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor 306dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall void two() { } // expected-note 2 {{possible target for call}} 316dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall void two(int) { } // expected-note 2 {{possible target for call}} 326dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall template<class T> void twoT() { } // expected-note 2 {{possible target for call}} 336dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall template<class T> void twoT(T) { } // expected-note 2 {{possible target for call}} 34353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor 35353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor void check() 36353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor { 37353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor one; // expected-warning {{expression result unused}} 386dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall two; // expected-error{{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}} 39353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor oneT<int>; // expected-warning {{expression result unused}} 406dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall twoT<int>; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} 41353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor } 42353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor 43353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor // check the template function case 44353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor template<class T> void check() 45353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor { 46353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor one; // expected-warning {{expression result unused}} 476dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall two; // expected-error{{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}} 48353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor oneT<int>; // expected-warning {{expression result unused}} 496dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall twoT<int>; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} 50353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor 51353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor } 52353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor 53353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor} 54353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor 551be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor template<typename T> 561be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor void twoT() { } 571be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor template<typename T, typename U> 581be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor void twoT(T) { } 591be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 601be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 611be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor void two() { }; //expected-note 5{{candidate}} 621be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor void two(int) { }; //expected-note 5{{candidate}} 631be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 641be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 651be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 661be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor void one() { } 671be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor template<class T> 681be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor void oneT() { } 691be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 701be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor template<class T> 711be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor void cant_resolve() { } //expected-note 3{{candidate}} 721be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 731be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor template<class T> void cant_resolve(T) { }//expected-note 3{{candidate}} 741be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 751be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 761be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregorint main() 771be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor{ 78353ee246e754e38db9b738240d18f1ecf2bb389bDouglas Gregor 791be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { static_cast<void>(one); } 801be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void)(one); } 811be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { static_cast<void>(oneT<int>); } 821be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void)(oneT<int>); } 831be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 84fb8721ce4c6fef3739b1cbd1e38e3f1949462033John McCall { static_cast<void>(two); } // expected-error {{address of overloaded function 'two' cannot be static_cast to type 'void'}} 85fb8721ce4c6fef3739b1cbd1e38e3f1949462033John McCall { (void)(two); } // expected-error {{address of overloaded function 'two' cannot be cast to type 'void'}} 861be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { static_cast<void>(twoT<int>); } 871be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void)(twoT<int>); } 881be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 891be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 901be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { ptrdiff_t x = reinterpret_cast<ptrdiff_t>(oneT<int>); } 911be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void) reinterpret_cast<int (*)(char, double)>(oneT<int>); } 921be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void) reinterpret_cast<ptrdiff_t>(one); } 931be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void) reinterpret_cast<int (*)(char, double)>(one); } 941be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 951be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { ptrdiff_t x = reinterpret_cast<ptrdiff_t>(twoT<int>); } 961be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void) reinterpret_cast<int (*)(char, double)>(twoT<int>); } 971be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void) reinterpret_cast<void (*)(int)>(two); } //expected-error {{reinterpret_cast}} 981be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void) static_cast<void (*)(int)>(two); } //ok 991be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 1001be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void) reinterpret_cast<int>(two); } //expected-error {{reinterpret_cast}} 1011be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void) reinterpret_cast<int (*)(char, double)>(two); } //expected-error {{reinterpret_cast}} 1021be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 1032def77399ab3088106a2d61372344f5b7104e1a2David Blaikie { bool b = (twoT<int>); } 1042def77399ab3088106a2d61372344f5b7104e1a2David Blaikie { bool b = (twoT<int, int>); } 1051be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 1061be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { bool b = &twoT<int>; //&foo<int>; } 1071be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor b = &(twoT<int>); } 1081be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 1091be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { ptrdiff_t x = (ptrdiff_t) &twoT<int>; 1101be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor x = (ptrdiff_t) &twoT<int>; } 1111be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 1121be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { ptrdiff_t x = (ptrdiff_t) twoT<int>; 1131be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor x = (ptrdiff_t) twoT<int>; } 1141be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 1151be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 1161be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { ptrdiff_t x = (ptrdiff_t) &twoT<int,int>; 1171be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor x = (ptrdiff_t) &twoT<int>; } 1181be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 1192fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu { oneT<int>; &oneT<int>; } //expected-warning 2{{expression result unused}} 1201be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { static_cast<void>(cant_resolve<int>); } // expected-error {{address of overload}} 1211be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { bool b = cant_resolve<int>; } // expected-error {{address of overload}} 1221be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor { (void) cant_resolve<int>; } // expected-error {{address of overload}} 1231be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 1241be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor} 1251be8eec3ddd2a23c19b453c2639226174eb5d4a8Douglas Gregor 12690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruthnamespace member_pointers { 12790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth struct S { 128c2fe81898b1b3b948791ca4ababd3d495601f22aDavid Blaikie template <typename T> bool f(T) { return false; } // expected-note 4 {{possible target for call}} 12990434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth template <typename T> static bool g(T) { return false; } 13090434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth 1316dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall template <typename T> bool h(T) { return false; } // expected-note 3 {{possible target for call}} 1326dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall template <int N> static bool h(int) { return false; } // expected-note 3 {{possible target for call}} 13390434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth }; 13490434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth 13590434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth void test(S s) { 13690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (S::f<char>) return; // expected-error {{call to non-static member function without an object argument}} 13790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (S::f<int>) return; // expected-error {{call to non-static member function without an object argument}} 13890434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (&S::f<char>) return; 13990434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (&S::f<int>) return; 1406dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (s.f<char>) return; // expected-error {{reference to non-static member function must be called}} 1416dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (s.f<int>) return; // expected-error {{reference to non-static member function must be called}} 142864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall if (&s.f<char>) return; // expected-error {{cannot create a non-constant pointer to member function}} 143864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall if (&s.f<int>) return; // expected-error {{cannot create a non-constant pointer to member function}} 14490434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth 1452def77399ab3088106a2d61372344f5b7104e1a2David Blaikie if (S::g<char>) return; 1462def77399ab3088106a2d61372344f5b7104e1a2David Blaikie if (S::g<int>) return; 14790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (&S::g<char>) return; 14890434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (&S::g<int>) return; 1492def77399ab3088106a2d61372344f5b7104e1a2David Blaikie if (s.g<char>) return; 1502def77399ab3088106a2d61372344f5b7104e1a2David Blaikie if (s.g<int>) return; 15190434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (&s.g<char>) return; 15290434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (&s.g<int>) return; 15390434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth 1542def77399ab3088106a2d61372344f5b7104e1a2David Blaikie if (S::h<42>) return; 1556dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (S::h<int>) return; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} 15690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (&S::h<42>) return; 15790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (&S::h<int>) return; 1582def77399ab3088106a2d61372344f5b7104e1a2David Blaikie if (s.h<42>) return; 1596dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (s.h<int>) return; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} 16090434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth if (&s.h<42>) return; 1616dbba4fc128e2e2f5b26be996392bd32c0707f13John McCall if (&s.h<int>) return; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} 16290434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth 16390434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = S::f<char>; } // expected-error {{call to non-static member function without an object argument}} 16490434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = S::f<int>; } // expected-error {{call to non-static member function without an object argument}} 16590434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &S::f<char>; } 16690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &S::f<int>; } 167864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall // These next two errors are terrible. 1685acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall { bool b = s.f<char>; } // expected-error {{reference to non-static member function must be called}} 1695acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall { bool b = s.f<int>; } // expected-error {{reference to non-static member function must be called}} 170864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall { bool b = &s.f<char>; } // expected-error {{cannot create a non-constant pointer to member function}} 171864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall { bool b = &s.f<int>; } // expected-error {{cannot create a non-constant pointer to member function}} 17290434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth 1732def77399ab3088106a2d61372344f5b7104e1a2David Blaikie { bool b = S::g<char>; } 1742def77399ab3088106a2d61372344f5b7104e1a2David Blaikie { bool b = S::g<int>; } 17590434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &S::g<char>; } 17690434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &S::g<int>; } 1772def77399ab3088106a2d61372344f5b7104e1a2David Blaikie { bool b = s.g<char>; } 1782def77399ab3088106a2d61372344f5b7104e1a2David Blaikie { bool b = s.g<int>; } 17990434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &s.g<char>; } 18090434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &s.g<int>; } 18190434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth 1822def77399ab3088106a2d61372344f5b7104e1a2David Blaikie { bool b = S::h<42>; } 18390434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = S::h<int>; } // expected-error {{can't form member pointer of type 'bool' without '&' and class name}} 18490434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &S::h<42>; } 18590434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &S::h<int>; } 1862def77399ab3088106a2d61372344f5b7104e1a2David Blaikie { bool b = s.h<42>; } 18790434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = s.h<int>; } // expected-error {{can't form member pointer of type 'bool' without '&' and class name}} 18890434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &s.h<42>; } 18990434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth { bool b = &s.h<int>; } // expected-error {{can't form member pointer of type 'bool' without '&' and class name}} 19090434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth } 19190434238b7edfc806437f1d40742a60ff92fbf6aChandler Carruth} 192