187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple %itanium_abi_triple -pedantic -verify %s 287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple %itanium_abi_triple -pedantic -verify -std=c++98 %s 387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple %itanium_abi_triple -pedantic -verify -std=c++11 %s 487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 56fc17ff5bf73c4d190517ebc5773f2ae557598abDouglas Gregorint* f(int) { return 0; } 66fc17ff5bf73c4d190517ebc5773f2ae557598abDouglas Gregorfloat* f(float) { return 0; } 78e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid f(); 88e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 98e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_f(int iv, float fv) { 108e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor float* fp = f(fv); 118e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip = f(iv); 128e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 138e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 142fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieuint* g(int, float, int); // expected-note {{candidate function}} 152fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieufloat* g(int, int, int); // expected-note {{candidate function}} 162fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieudouble* g(int, float, float); // expected-note {{candidate function}} 172fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieuchar* g(int, float, ...); // expected-note {{candidate function}} 188e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid g(); 198e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 208e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_g(int iv, float fv) { 218e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip1 = g(iv, fv, 0); 228e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor float* fp1 = g(iv, iv, 0); 238e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp1 = g(iv, fv, fv); 248e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor char* cp1 = g(0, 0); 258e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor char* cp2 = g(0, 0, 0, iv, fv); 268e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 272fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu double* dp2 = g(0, fv, 1.5); // expected-error {{call to 'g' is ambiguous}} 288e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 298e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 308e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregordouble* h(double f); 318e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* h(int); 328e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 338e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_h(float fv, unsigned char cv) { 348e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp = h(fv); 358e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip = h(cv); 368e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 378e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 388e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* i(int); 398e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregordouble* i(long); 408e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 418e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_i(short sv, int iv, long lv, unsigned char ucv) { 428e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip1 = i(sv); 438e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip2 = i(iv); 448e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip3 = i(ucv); 458e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp1 = i(lv); 468e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 478e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 488e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* j(void*); 498e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregordouble* j(bool); 508e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 518e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_j(int* ip) { 528e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip1 = j(ip); 538e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 548e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 558e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* k(char*); 568e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregordouble* k(bool); 578e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 588e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_k() { 5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar int* ip1 = k("foo"); 6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus <= 199711L 6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}} 6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#else 6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-error@-4 {{cannot initialize a variable of type 'int *' with an rvalue of type 'double *'}} 6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif 6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar int* ip2 = k(("foo")); 6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus <= 199711L 6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}} 6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#else 7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-error@-4 {{cannot initialize a variable of type 'int *' with an rvalue of type 'double *'}} 7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif 728e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp1 = k(L"foo"); 738e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 748e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 758e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* l(wchar_t*); 768e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregordouble* l(bool); 778e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 788e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_l() { 7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar int* ip1 = l(L"foo"); 8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus <= 199711L 8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-2 {{conversion from string literal to 'wchar_t *' is deprecated}} 8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#else 8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-error@-4 {{cannot initialize a variable of type 'int *' with an rvalue of type 'double *'}} 8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif 858e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp1 = l("foo"); 868e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 878e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 888e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* m(const char*); 898e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregordouble* m(char*); 908e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 918e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_m() { 928e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip = m("foo"); 938e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 948e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 958e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* n(char*); 968e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregordouble* n(void*); 970f669f54f19233b703f38ef2fb3793c26c6caabbDouglas Gregorclass E; 988e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 990f669f54f19233b703f38ef2fb3793c26c6caabbDouglas Gregorvoid test_n(E* e) { 1008e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor char ca[7]; 1018e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip1 = n(ca); 10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar int* ip2 = n("foo"); 10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus <= 199711L 10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}} 10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#else 10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-4 {{ISO C++11 does not allow conversion from string literal to 'char *'}} 10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif 1088e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor float fa[7]; 1098e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp1 = n(fa); 1100f669f54f19233b703f38ef2fb3793c26c6caabbDouglas Gregor 1110f669f54f19233b703f38ef2fb3793c26c6caabbDouglas Gregor double* dp2 = n(e); 1128e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 1138e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1148e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorenum PromotesToInt { 115c9467cf4cff1bb09f38667b871268c47ed823f97Douglas Gregor PromotesToIntValue = -1 1168e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor}; 1178e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1188e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorenum PromotesToUnsignedInt { 119842aef8d942a880eeb9535d40de31a86838264cbJohn McCall PromotesToUnsignedIntValue = __INT_MAX__ * 2U 1208e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor}; 1218e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1228e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* o(int); 1238e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregordouble* o(unsigned int); 1248e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorfloat* o(long); 1258e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1268e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_o() { 1278e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip1 = o(PromotesToIntValue); 1288e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp1 = o(PromotesToUnsignedIntValue); 1298e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 1308e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1318e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* p(int); 1328e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregordouble* p(double); 1338e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1348e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_p() { 1358e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip = p((short)1); 1368e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp = p(1.0f); 1378e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 1388e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1398e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorstruct Bits { 1408e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor signed short int_bitfield : 5; 1418e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor unsigned int uint_bitfield : 8; 1428e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor}; 1438e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1448e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorint* bitfields(int, int); 1458e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorfloat* bitfields(unsigned int, int); 1468e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1478e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_bitfield(Bits bits, int x) { 1488e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip = bitfields(bits.int_bitfield, 0); 1498e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor float* fp = bitfields(bits.uint_bitfield, 0u); 1508e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 1518e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1522fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieuint* multiparm(long, int, long); // expected-note {{candidate function}} 1532fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieufloat* multiparm(int, int, int); // expected-note {{candidate function}} 1542fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieudouble* multiparm(int, int, short); // expected-note {{candidate function}} 1558e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor 1568e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorvoid test_multiparm(long lv, short sv, int iv) { 1578e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip1 = multiparm(lv, iv, lv); 1588e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int* ip2 = multiparm(lv, sv, lv); 1598e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor float* fp1 = multiparm(iv, iv, iv); 1608e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor float* fp2 = multiparm(sv, iv, iv); 1618e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp1 = multiparm(sv, sv, sv); 1628e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor double* dp2 = multiparm(iv, sv, sv); 1632fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu multiparm(sv, sv, lv); // expected-error {{call to 'multiparm' is ambiguous}} 1648e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} 1659b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor 1669b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor// Test overloading based on qualification vs. no qualification 1679b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor// conversion. 1689b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorint* quals1(int const * p); 1699b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorchar* quals1(int * p); 1709b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor 1719b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorint* quals2(int const * const * pp); 1729b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorchar* quals2(int * * pp); 1739b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor 1749b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorint* quals3(int const * * const * ppp); 1759b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorchar* quals3(int *** ppp); 1769b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor 1779b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorvoid test_quals(int * p, int * * pp, int * * * ppp) { 1789b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor char* q1 = quals1(p); 1799b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor char* q2 = quals2(pp); 1809b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor char* q3 = quals3(ppp); 1819b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor} 1829b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor 1839b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor// Test overloading based on qualification ranking (C++ 13.3.2)p3. 1849b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorint* quals_rank1(int const * p); 1859b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorfloat* quals_rank1(int const volatile *p); 18657373266011f73418381b736015d8d2bb0381176Douglas Gregorchar* quals_rank1(char*); 18757373266011f73418381b736015d8d2bb0381176Douglas Gregordouble* quals_rank1(const char*); 1889b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor 1899b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorint* quals_rank2(int const * const * pp); 1909b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorfloat* quals_rank2(int * const * pp); 1919b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor 19257373266011f73418381b736015d8d2bb0381176Douglas Gregorvoid quals_rank3(int const * const * const volatile * p); // expected-note{{candidate function}} 19357373266011f73418381b736015d8d2bb0381176Douglas Gregorvoid quals_rank3(int const * const volatile * const * p); // expected-note{{candidate function}} 19457373266011f73418381b736015d8d2bb0381176Douglas Gregor 19557373266011f73418381b736015d8d2bb0381176Douglas Gregorvoid quals_rank3(int const *); // expected-note{{candidate function}} 19657373266011f73418381b736015d8d2bb0381176Douglas Gregorvoid quals_rank3(int volatile *); // expected-note{{candidate function}} 19757373266011f73418381b736015d8d2bb0381176Douglas Gregor 1989b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregorvoid test_quals_ranking(int * p, int volatile *pq, int * * pp, int * * * ppp) { 19957373266011f73418381b736015d8d2bb0381176Douglas Gregor int* q1 = quals_rank1(p); 2009b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor float* q2 = quals_rank1(pq); 20157373266011f73418381b736015d8d2bb0381176Douglas Gregor double* q3 = quals_rank1("string literal"); 20257373266011f73418381b736015d8d2bb0381176Douglas Gregor char a[17]; 20357373266011f73418381b736015d8d2bb0381176Douglas Gregor const char* ap = a; 20457373266011f73418381b736015d8d2bb0381176Douglas Gregor char* q4 = quals_rank1(a); 20557373266011f73418381b736015d8d2bb0381176Douglas Gregor double* q5 = quals_rank1(ap); 20657373266011f73418381b736015d8d2bb0381176Douglas Gregor 20757373266011f73418381b736015d8d2bb0381176Douglas Gregor float* q6 = quals_rank2(pp); 20857373266011f73418381b736015d8d2bb0381176Douglas Gregor 2092fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu quals_rank3(ppp); // expected-error {{call to 'quals_rank3' is ambiguous}} 21057373266011f73418381b736015d8d2bb0381176Douglas Gregor 2112fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu quals_rank3(p); // expected-error {{call to 'quals_rank3' is ambiguous}} 21257373266011f73418381b736015d8d2bb0381176Douglas Gregor quals_rank3(pq); 2139b6e2d209cc2931a9bb2ae51e744a8698b54db73Douglas Gregor} 21457373266011f73418381b736015d8d2bb0381176Douglas Gregor 215bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor// Test overloading based on derived-to-base conversions 216bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorclass A { }; 217bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorclass B : public A { }; 218bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorclass C : public B { }; 219bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorclass D : public C { }; 220bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor 221bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorint* derived1(A*); 222bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorchar* derived1(const A*); 223bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorfloat* derived1(void*); 224bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor 225bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorint* derived2(A*); 226bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorfloat* derived2(B*); 227bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor 228bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorint* derived3(A*); 229bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorfloat* derived3(const B*); 230bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorchar* derived3(C*); 231bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor 232bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregorvoid test_derived(B* b, B const* bc, C* c, const C* cc, void* v, D* d) { 233bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor int* d1 = derived1(b); 234bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor char* d2 = derived1(bc); 235bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor int* d3 = derived1(c); 236bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor char* d4 = derived1(cc); 237bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor float* d5 = derived1(v); 238bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor 239bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor float* d6 = derived2(b); 240bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor float* d7 = derived2(c); 241bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor 242bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor char* d8 = derived3(d); 243bc0805a6ca84e3c38a08c9f47441e138945244d4Douglas Gregor} 24427c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor 2458578981ada66dae44a5a0752f949a5e65b477588Douglas Gregorvoid derived4(C*); // expected-note{{candidate function not viable: cannot convert from base class pointer 'A *' to derived class pointer 'C *' for 1st argument}} 2468578981ada66dae44a5a0752f949a5e65b477588Douglas Gregor 2478578981ada66dae44a5a0752f949a5e65b477588Douglas Gregorvoid test_base(A* a) { 2488578981ada66dae44a5a0752f949a5e65b477588Douglas Gregor derived4(a); // expected-error{{no matching function for call to 'derived4}} 2498578981ada66dae44a5a0752f949a5e65b477588Douglas Gregor} 2508578981ada66dae44a5a0752f949a5e65b477588Douglas Gregor 25127c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor// Test overloading of references. 25227c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor// (FIXME: tests binding to determine candidate sets, not overload 25327c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor// resolution per se). 25427c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregorint* intref(int&); 25527c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregorfloat* intref(const int&); 25627c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor 25727c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregorvoid intref_test() { 25827c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor float* ir1 = intref(5); 259be0ee875d8a91c031a085cbbd73ad9e8dc1aa8ffDavid Blaikie float* ir2 = intref(5.5); // expected-warning{{implicit conversion from 'double' to 'int' changes value from 5.5 to 5}} 26027c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor} 26115da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor 2622f9d8740f557bc1f8746a2d5c4498b324b63eeb9Douglas Gregorvoid derived5(C&); // expected-note{{candidate function not viable: cannot bind base class object of type 'A' to derived class reference 'C &' for 1st argument}} 2632f9d8740f557bc1f8746a2d5c4498b324b63eeb9Douglas Gregor 2642f9d8740f557bc1f8746a2d5c4498b324b63eeb9Douglas Gregorvoid test_base(A& a) { 2652f9d8740f557bc1f8746a2d5c4498b324b63eeb9Douglas Gregor derived5(a); // expected-error{{no matching function for call to 'derived5}} 2662f9d8740f557bc1f8746a2d5c4498b324b63eeb9Douglas Gregor} 2672f9d8740f557bc1f8746a2d5c4498b324b63eeb9Douglas Gregor 26815da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor// Test reference binding vs. standard conversions. 26915da57e66cade0c2cab752f925e838b22daadafcDouglas Gregorint& bind_vs_conv(const double&); 27015da57e66cade0c2cab752f925e838b22daadafcDouglas Gregorfloat& bind_vs_conv(int); 27115da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor 27215da57e66cade0c2cab752f925e838b22daadafcDouglas Gregorvoid bind_vs_conv_test() 27315da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor{ 27415da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor int& i1 = bind_vs_conv(1.0f); 27515da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor float& f1 = bind_vs_conv((short)1); 27615da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor} 27715da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor 27815da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor// Test that cv-qualifiers get subsumed in the reference binding. 27915da57e66cade0c2cab752f925e838b22daadafcDouglas Gregorstruct X { }; 28015da57e66cade0c2cab752f925e838b22daadafcDouglas Gregorstruct Y { }; 28115da57e66cade0c2cab752f925e838b22daadafcDouglas Gregorstruct Z : X, Y { }; 28215da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor 28315da57e66cade0c2cab752f925e838b22daadafcDouglas Gregorint& cvqual_subsume(X&); // expected-note{{candidate function}} 28415da57e66cade0c2cab752f925e838b22daadafcDouglas Gregorfloat& cvqual_subsume(const Y&); // expected-note{{candidate function}} 28515da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor 2868ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smithint& cvqual_subsume2(X&); // expected-note{{candidate function}} 2878ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smithfloat& cvqual_subsume2(volatile Y&); // expected-note{{candidate function}} 28815da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor 28915da57e66cade0c2cab752f925e838b22daadafcDouglas Gregorvoid cvqual_subsume_test(Z z) { 2902fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu cvqual_subsume(z); // expected-error{{call to 'cvqual_subsume' is ambiguous}} 2918ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith cvqual_subsume2(z); // expected-error{{call to 'cvqual_subsume2' is ambiguous}} 29215da57e66cade0c2cab752f925e838b22daadafcDouglas Gregor} 293f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor 294f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor// Test overloading with cv-qualification differences in reference 295f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor// binding. 296f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregorint& cvqual_diff(X&); 297f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregorfloat& cvqual_diff(const X&); 298f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor 299f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregorvoid cvqual_diff_test(X x, Z z) { 300f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor int& i1 = cvqual_diff(x); 301f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor int& i2 = cvqual_diff(z); 302f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor} 303f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor 304f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor// Test overloading with derived-to-base differences in reference 305f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor// binding. 306f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregorstruct Z2 : Z { }; 307f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor 308f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregorint& db_rebind(X&); 309f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregorlong& db_rebind(Y&); 310f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregorfloat& db_rebind(Z&); 311f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor 312f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregorvoid db_rebind_test(Z2 z2) { 313f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor float& f1 = db_rebind(z2); 314f70bdb9463a6e3ea2c6307b2c7a5f3e2c6b7e489Douglas Gregor} 315b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregor 316b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregorclass string { }; 317b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregorclass opt : public string { }; 318b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregor 319b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregorstruct SR { 320b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregor SR(const string&); 321b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregor}; 322b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregor 323b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregorvoid f(SR) { } 324b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregor 325b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregorvoid g(opt o) { 326b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregor f(o); 327b7a86f5c5f9cdea126817247cc1fd3a7441388daDouglas Gregor} 328335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregor 329335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregor 330335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregornamespace PR5756 { 331335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregor int &a(void*, int); 332335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregor float &a(void*, float); 333335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregor void b() { 334335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregor int &ir = a(0,0); 335335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregor (void)ir; 336335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregor } 337335b07ae470045dab25739ded6541744ec8fe40bDouglas Gregor} 3383c80f573dfbc01f29cc292f6c1fc794705823d52John McCall 3393c80f573dfbc01f29cc292f6c1fc794705823d52John McCall// Tests the exact text used to note the candidates 3403c80f573dfbc01f29cc292f6c1fc794705823d52John McCallnamespace test1 { 34158f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattner template <class T> void foo(T t, unsigned N); // expected-note {{candidate function [with T = int] not viable: no known conversion from 'const char [6]' to 'unsigned int' for 2nd argument}} 34258f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattner void foo(int n, char N); // expected-note {{candidate function not viable: no known conversion from 'const char [6]' to 'char' for 2nd argument}} 343adbb8f8aa44216d30d204e843c4a74abab929daeJohn McCall void foo(int n, const char *s, int t); // expected-note {{candidate function not viable: requires 3 arguments, but 2 were provided}} 344adbb8f8aa44216d30d204e843c4a74abab929daeJohn McCall void foo(int n, const char *s, int t, ...); // expected-note {{candidate function not viable: requires at least 3 arguments, but 2 were provided}} 345adbb8f8aa44216d30d204e843c4a74abab929daeJohn McCall void foo(int n, const char *s, int t, int u = 0); // expected-note {{candidate function not viable: requires at least 3 arguments, but 2 were provided}} 3463c80f573dfbc01f29cc292f6c1fc794705823d52John McCall 347f7b8056f1ff0c0409a9523a34f78b69ab8314becRichard Smith // PR 11857 348c608c3c0781e15b74fbbda03f8708cc85a3dd488Richard Smith void foo(int n); // expected-note {{candidate function not viable: requires single argument 'n', but 2 arguments were provided}} 349c608c3c0781e15b74fbbda03f8708cc85a3dd488Richard Smith void foo(unsigned n = 10); // expected-note {{candidate function not viable: allows at most single argument 'n', but 2 arguments were provided}} 350c608c3c0781e15b74fbbda03f8708cc85a3dd488Richard Smith void bar(int n, int u = 0); // expected-note {{candidate function not viable: requires at least argument 'n', but no arguments were provided}} 351f7b8056f1ff0c0409a9523a34f78b69ab8314becRichard Smith void baz(int n = 0, int u = 0); // expected-note {{candidate function not viable: requires at most 2 arguments, but 3 were provided}} 352f7b8056f1ff0c0409a9523a34f78b69ab8314becRichard Smith 3533c80f573dfbc01f29cc292f6c1fc794705823d52John McCall void test() { 3543c80f573dfbc01f29cc292f6c1fc794705823d52John McCall foo(4, "hello"); //expected-error {{no matching function for call to 'foo'}} 355f7b8056f1ff0c0409a9523a34f78b69ab8314becRichard Smith bar(); //expected-error {{no matching function for call to 'bar'}} 356f7b8056f1ff0c0409a9523a34f78b69ab8314becRichard Smith baz(3, 4, 5); // expected-error {{no matching function for call to 'baz'}} 3573c80f573dfbc01f29cc292f6c1fc794705823d52John McCall } 3583c80f573dfbc01f29cc292f6c1fc794705823d52John McCall} 359adbb8f8aa44216d30d204e843c4a74abab929daeJohn McCall 360cefd3ada97faf5a759dac4705900053d3aa071e9John McCall// PR 6014 361cefd3ada97faf5a759dac4705900053d3aa071e9John McCallnamespace test2 { 362cefd3ada97faf5a759dac4705900053d3aa071e9John McCall struct QFixed { 363cefd3ada97faf5a759dac4705900053d3aa071e9John McCall QFixed(int i); 364cefd3ada97faf5a759dac4705900053d3aa071e9John McCall QFixed(long i); 365cefd3ada97faf5a759dac4705900053d3aa071e9John McCall }; 366cefd3ada97faf5a759dac4705900053d3aa071e9John McCall 367cefd3ada97faf5a759dac4705900053d3aa071e9John McCall bool operator==(const QFixed &f, int i); 368cefd3ada97faf5a759dac4705900053d3aa071e9John McCall 369cefd3ada97faf5a759dac4705900053d3aa071e9John McCall class qrgb666 { 370cefd3ada97faf5a759dac4705900053d3aa071e9John McCall inline operator unsigned int () const; 371cefd3ada97faf5a759dac4705900053d3aa071e9John McCall 372cefd3ada97faf5a759dac4705900053d3aa071e9John McCall inline bool operator==(const qrgb666 &v) const; 373cefd3ada97faf5a759dac4705900053d3aa071e9John McCall inline bool operator!=(const qrgb666 &v) const { return !(*this == v); } 374cefd3ada97faf5a759dac4705900053d3aa071e9John McCall }; 375cefd3ada97faf5a759dac4705900053d3aa071e9John McCall} 376258b203b853e1c684c290fccd0088d1f340c137fJohn McCall 377258b203b853e1c684c290fccd0088d1f340c137fJohn McCall// PR 6117 3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace IncompleteConversion { 3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct Complete {}; 380258b203b853e1c684c290fccd0088d1f340c137fJohn McCall struct Incomplete; 381258b203b853e1c684c290fccd0088d1f340c137fJohn McCall 3824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void completeFunction(Complete *); // expected-note 2 {{cannot convert argument of incomplete type}} 3834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void completeFunction(Complete &); // expected-note 2 {{cannot convert argument of incomplete type}} 3844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void testTypeConversion(Incomplete *P) { 3864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar completeFunction(P); // expected-error {{no matching function for call to 'completeFunction'}} 3874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar completeFunction(*P); // expected-error {{no matching function for call to 'completeFunction'}} 3884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 3894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void incompletePointerFunction(Incomplete *); // expected-note {{candidate function not viable: cannot convert argument of incomplete type 'IncompleteConversion::Incomplete' to 'IncompleteConversion::Incomplete *' for 1st argument; take the address of the argument with &}} 3914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void incompleteReferenceFunction(Incomplete &); // expected-note {{candidate function not viable: cannot convert argument of incomplete type 'IncompleteConversion::Incomplete *' to 'IncompleteConversion::Incomplete &' for 1st argument; dereference the argument with *}} 3924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void testPointerReferenceConversion(Incomplete &reference, Incomplete *pointer) { 3944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar incompletePointerFunction(reference); // expected-error {{no matching function for call to 'incompletePointerFunction'}} 3954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar incompleteReferenceFunction(pointer); // expected-error {{no matching function for call to 'incompleteReferenceFunction'}} 396258b203b853e1c684c290fccd0088d1f340c137fJohn McCall } 397258b203b853e1c684c290fccd0088d1f340c137fJohn McCall} 398ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor 399ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregornamespace DerivedToBaseVsVoid { 400ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor struct A { }; 401ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor struct B : A { }; 402ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor 403ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor float &f(void *); 404ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor int &f(const A*); 405ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor 406ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor void g(B *b) { 407ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor int &ir = f(b); 408ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor } 409ad323a856c0bf759e07d37d749510ddf4f8c6b96Douglas Gregor} 410b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall 4113a8133727659077d0c918226e5dad6c16c8274f6John McCall// PR 6398 + PR 6421 412b1bdc6232d7b4d8574b5436982435ad57f429a91John McCallnamespace test4 { 413b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall class A; 414b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall class B { 415b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall static void foo(); // expected-note {{not viable}} 416b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall static void foo(int*); // expected-note {{not viable}} 4173a8133727659077d0c918226e5dad6c16c8274f6John McCall static void foo(long*); // expected-note {{not viable}} 418b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall 419b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall void bar(A *a) { 420b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall foo(a); // expected-error {{no matching function for call}} 421b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall } 422b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall }; 423b1bdc6232d7b4d8574b5436982435ad57f429a91John McCall} 4249e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor 4259e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregornamespace DerivedToBase { 4269e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor struct A { }; 4279e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor struct B : A { }; 4289e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor struct C : B { }; 4299e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor 4309e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor int &f0(const A&); 4319e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor float &f0(B); 4329e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor 4339e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor void g() { 4349e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor float &fr = f0(C()); 4359e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor } 4369e23932aca7997315a78ea50e9415631a1880fa0Douglas Gregor} 437a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor 438a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregornamespace PR6483 { 439a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor struct X0 { 440a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor operator const unsigned int & () const; 441a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor }; 442a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor 443a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor struct X1 { 444a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor operator unsigned int & () const; 445a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor }; 446a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor 447a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor void f0(const bool &); 448a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor void f1(bool &); // expected-note 2{{not viable}} 449a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor 450a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor void g(X0 x0, X1 x1) { 451a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor f0(x0); 452a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor f1(x0); // expected-error{{no matching function for call}} 453a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor f0(x1); 454a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor f1(x1); // expected-error{{no matching function for call}} 455a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor } 456a1a9f035852e35ed88f4902a855eb952cf08bebbDouglas Gregor} 457aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor 458aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregornamespace PR6078 { 459d1a272204cef9304df3930d94f66713b05db27d6Douglas Gregor struct A { 460aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor A(short); // expected-note{{candidate constructor}} 461aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor A(long); // expected-note{{candidate constructor}} 462aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor }; 463aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor struct S { 464aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor typedef void ft(A); 465aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor operator ft*(); 466aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor }; 467aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor 468aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor void f() { 469aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor S()(0); // expected-error{{conversion from 'int' to 'PR6078::A' is ambiguous}} 470aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor } 471aa0be17ee35e3218b722d90b74789f9e7c602bdaDouglas Gregor} 47266821b5515df8a366579d023e472f843ecfa59b2Douglas Gregor 47366821b5515df8a366579d023e472f843ecfa59b2Douglas Gregornamespace PR6177 { 47466821b5515df8a366579d023e472f843ecfa59b2Douglas Gregor struct String { String(char const*); }; 47566821b5515df8a366579d023e472f843ecfa59b2Douglas Gregor 4768ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith void f(bool const volatile&); 4778ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith int &f(String); 47866821b5515df8a366579d023e472f843ecfa59b2Douglas Gregor 4798ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith void g() { int &r = f(""); } 48066821b5515df8a366579d023e472f843ecfa59b2Douglas Gregor} 481ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor 482ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregornamespace PR7095 { 483ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor struct X { }; 484ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor 485ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor struct Y { 486ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor operator const X*(); 487ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor 488ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor private: 489ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor operator X*(); 490ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor }; 491ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor 492ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor void f(const X *); 493ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor void g(Y y) { f(y); } 494ae65f4bd588f5f5ec26ed188830bf6d14800b09eDouglas Gregor} 495af7bea5fb496921c386459dc695485490bb06963Douglas Gregor 496af7bea5fb496921c386459dc695485490bb06963Douglas Gregornamespace PR7224 { 497af7bea5fb496921c386459dc695485490bb06963Douglas Gregor class A {}; 498af7bea5fb496921c386459dc695485490bb06963Douglas Gregor class B : public A {}; 499af7bea5fb496921c386459dc695485490bb06963Douglas Gregor 500af7bea5fb496921c386459dc695485490bb06963Douglas Gregor int &foo(A *const d); 501af7bea5fb496921c386459dc695485490bb06963Douglas Gregor float &foo(const A *const d); 502af7bea5fb496921c386459dc695485490bb06963Douglas Gregor 503af7bea5fb496921c386459dc695485490bb06963Douglas Gregor void bar() 504af7bea5fb496921c386459dc695485490bb06963Douglas Gregor { 505af7bea5fb496921c386459dc695485490bb06963Douglas Gregor B *const d = 0; 506af7bea5fb496921c386459dc695485490bb06963Douglas Gregor B const *const d2 = 0; 507af7bea5fb496921c386459dc695485490bb06963Douglas Gregor int &ir = foo(d); 508af7bea5fb496921c386459dc695485490bb06963Douglas Gregor float &fr = foo(d2); 509af7bea5fb496921c386459dc695485490bb06963Douglas Gregor } 510af7bea5fb496921c386459dc695485490bb06963Douglas Gregor} 5115a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 5125a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregornamespace NontrivialSubsequence { 5135a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor struct X0; 5145a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 5155a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor class A { 5165a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor operator X0 *(); 5175a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor public: 5185a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor operator const X0 *(); 5195a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor }; 5205a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 5215a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor A a; 5225a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor void foo( void const * ); 5235a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor 5245a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor void g() { 5255a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor foo(a); 5265a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor } 5275a57efd7bf88a4a13018e0471ded8063a4abe8afDouglas Gregor} 52825e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis 52925e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis// rdar://rdar8499524 53025e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidisnamespace rdar8499524 { 53125e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis struct W {}; 53225e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis struct S { 53325e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis S(...); 53425e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis }; 53525e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis 53625e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis void g(const S&); 53725e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis void f() { 53825e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis g(W()); 53925e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis } 54025e7e1672886b78a00ce25a084c0581704b73a7bArgyrios Kyrtzidis} 5414ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor 5424ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregornamespace rdar9173984 { 5434ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor template <typename T, unsigned long N> int &f(const T (&)[N]); 5444ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor template <typename T> float &f(const T *); 5454ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor 5464ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor void test() { 5474ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor int arr[2] = {0, 0}; 5484ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor int *arrp = arr; 5494ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor int &ir = f(arr); 5504ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor float &fr = f(arrp); 5514ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor } 5524ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor} 5534ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor 5544ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregornamespace PR9507 { 5554ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor void f(int * const&); // expected-note{{candidate function}} 5564ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor void f(int const(&)[1]); // expected-note{{candidate function}} 5574ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor 5584ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor int main() { 5594ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor int n[1]; 5604ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor f(n); // expected-error{{call to 'f' is ambiguous}} 5614ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor } 5624ae5b7208ef72dec2a79d3d1c602cb47e9750d69Douglas Gregor} 563ee697e69a2063b65bfd0534248e4848461aca3f4Douglas Gregor 564ee697e69a2063b65bfd0534248e4848461aca3f4Douglas Gregornamespace rdar9803316 { 565ee697e69a2063b65bfd0534248e4848461aca3f4Douglas Gregor void foo(float); 566ee697e69a2063b65bfd0534248e4848461aca3f4Douglas Gregor int &foo(int); 567ee697e69a2063b65bfd0534248e4848461aca3f4Douglas Gregor 568ee697e69a2063b65bfd0534248e4848461aca3f4Douglas Gregor void bar() { 569ee697e69a2063b65bfd0534248e4848461aca3f4Douglas Gregor int &ir = (&foo)(0); 570ee697e69a2063b65bfd0534248e4848461aca3f4Douglas Gregor } 571ee697e69a2063b65bfd0534248e4848461aca3f4Douglas Gregor} 57276f3f69db1416425070177243e9f390122c553e0Richard Smith 57376f3f69db1416425070177243e9f390122c553e0Richard Smithnamespace IncompleteArg { 574f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith // Ensure that overload resolution attempts to complete argument types when 575f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith // performing ADL. 57676f3f69db1416425070177243e9f390122c553e0Richard Smith template<typename T> struct S { 57776f3f69db1416425070177243e9f390122c553e0Richard Smith friend int f(const S&); 57876f3f69db1416425070177243e9f390122c553e0Richard Smith }; 57976f3f69db1416425070177243e9f390122c553e0Richard Smith extern S<int> s; 58076f3f69db1416425070177243e9f390122c553e0Richard Smith int k = f(s); 581f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith 582f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith template<typename T> struct Op { 583f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith friend bool operator==(const Op &, const Op &); 584f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith }; 585f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith extern Op<char> op; 586f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith bool b = op == op; 587f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith 588f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith // ... and not in other cases! Nothing here requires U<int()> to be complete. 589f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith // (Note that instantiating U<int()> will fail.) 590f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith template<typename T> struct U { 591f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith T t; 592f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith }; 593f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith struct Consumer { 594f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith template<typename T> 595f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith int operator()(const U<T> &); 596f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith }; 597f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith template<typename T> U<T> &make(); 598f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith Consumer c; 599f5cd5cc9a7ec114ef1a4c08491a37d2327697c4aRichard Smith int n = sizeof(c(make<int()>())); 60076f3f69db1416425070177243e9f390122c553e0Richard Smith} 601db762ef262987403b4e2a3bb8d5762277306a224Douglas Gregor 602db762ef262987403b4e2a3bb8d5762277306a224Douglas Gregornamespace PR12142 { 603db762ef262987403b4e2a3bb8d5762277306a224Douglas Gregor void fun(int (*x)[10]); // expected-note{{candidate function not viable: 1st argument ('const int (*)[10]') would lose const qualifier}} 604db762ef262987403b4e2a3bb8d5762277306a224Douglas Gregor void g() { fun((const int(*)[10])0); } // expected-error{{no matching function for call to 'fun'}} 605db762ef262987403b4e2a3bb8d5762277306a224Douglas Gregor} 6068ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith 6078ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith// DR1152: Take 'volatile' into account when handling reference bindings in 6088ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith// overload resolution. 6098ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smithnamespace PR12931 { 6108ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith void f(const int &, ...); 6118ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith void f(const volatile int &, int); 6128ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith void g() { f(0, 0); } 6138ab10aa6bef39dffde2207dd2257c521bb2e731fRichard Smith} 6146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 6156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid test5() { 6166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct { 6176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef void F1(int); 6186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef void F2(double); 6196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines operator F1*(); // expected-note{{conversion candidate}} 6206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines operator F2*(); // expected-note{{conversion candidate}} 6216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } callable; 6226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines callable(); // expected-error{{no matching function for call}} 6236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 624176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 625176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace PR20218 { 626176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void f(void (*const &)()); // expected-note 2{{candidate}} 62787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void f(void (&&)()) = delete; // expected-note 2{{candidate}} 62887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus <= 199711L 62987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-2 {{rvalue references are a C++11 extension}} 63087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-3 {{deleted function definitions are a C++11 extension}} 63187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif 63287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar void g(void (&&)()) = delete; // expected-note 2{{candidate}} 63387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if __cplusplus <= 199711L 63487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-2 {{rvalue references are a C++11 extension}} 63587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // expected-warning@-3 {{deleted function definitions are a C++11 extension}} 63687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif 637176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void g(void (*const &)()); // expected-note 2{{candidate}} 638176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 639176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void x(); 640176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines typedef void (&fr)(); 641176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct Y { operator fr(); } y; 642176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 643176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void h() { 644176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines f(x); // expected-error {{ambiguous}} 645176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines g(x); // expected-error {{ambiguous}} 646176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines f(y); // expected-error {{ambiguous}} 647176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines g(y); // expected-error {{ambiguous}} 648176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 649176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 650