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