1*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -pedantic -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -pedantic -verify -std=c++98 %s
3*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -pedantic -verify -std=c++11 %s
4*67e74705SXin Li
f(int)5*67e74705SXin Li int* f(int) { return 0; }
f(float)6*67e74705SXin Li float* f(float) { return 0; }
7*67e74705SXin Li void f();
8*67e74705SXin Li
test_f(int iv,float fv)9*67e74705SXin Li void test_f(int iv, float fv) {
10*67e74705SXin Li float* fp = f(fv);
11*67e74705SXin Li int* ip = f(iv);
12*67e74705SXin Li }
13*67e74705SXin Li
14*67e74705SXin Li int* g(int, float, int); // expected-note {{candidate function}}
15*67e74705SXin Li float* g(int, int, int); // expected-note {{candidate function}}
16*67e74705SXin Li double* g(int, float, float); // expected-note {{candidate function}}
17*67e74705SXin Li char* g(int, float, ...); // expected-note {{candidate function}}
18*67e74705SXin Li void g();
19*67e74705SXin Li
test_g(int iv,float fv)20*67e74705SXin Li void test_g(int iv, float fv) {
21*67e74705SXin Li int* ip1 = g(iv, fv, 0);
22*67e74705SXin Li float* fp1 = g(iv, iv, 0);
23*67e74705SXin Li double* dp1 = g(iv, fv, fv);
24*67e74705SXin Li char* cp1 = g(0, 0);
25*67e74705SXin Li char* cp2 = g(0, 0, 0, iv, fv);
26*67e74705SXin Li
27*67e74705SXin Li double* dp2 = g(0, fv, 1.5); // expected-error {{call to 'g' is ambiguous}}
28*67e74705SXin Li }
29*67e74705SXin Li
30*67e74705SXin Li double* h(double f);
31*67e74705SXin Li int* h(int);
32*67e74705SXin Li
test_h(float fv,unsigned char cv)33*67e74705SXin Li void test_h(float fv, unsigned char cv) {
34*67e74705SXin Li double* dp = h(fv);
35*67e74705SXin Li int* ip = h(cv);
36*67e74705SXin Li }
37*67e74705SXin Li
38*67e74705SXin Li int* i(int);
39*67e74705SXin Li double* i(long);
40*67e74705SXin Li
test_i(short sv,int iv,long lv,unsigned char ucv)41*67e74705SXin Li void test_i(short sv, int iv, long lv, unsigned char ucv) {
42*67e74705SXin Li int* ip1 = i(sv);
43*67e74705SXin Li int* ip2 = i(iv);
44*67e74705SXin Li int* ip3 = i(ucv);
45*67e74705SXin Li double* dp1 = i(lv);
46*67e74705SXin Li }
47*67e74705SXin Li
48*67e74705SXin Li int* j(void*);
49*67e74705SXin Li double* j(bool);
50*67e74705SXin Li
test_j(int * ip)51*67e74705SXin Li void test_j(int* ip) {
52*67e74705SXin Li int* ip1 = j(ip);
53*67e74705SXin Li }
54*67e74705SXin Li
55*67e74705SXin Li int* k(char*);
56*67e74705SXin Li double* k(bool);
57*67e74705SXin Li
test_k()58*67e74705SXin Li void test_k() {
59*67e74705SXin Li int* ip1 = k("foo");
60*67e74705SXin Li #if __cplusplus <= 199711L
61*67e74705SXin Li // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}
62*67e74705SXin Li #else
63*67e74705SXin Li // expected-error@-4 {{cannot initialize a variable of type 'int *' with an rvalue of type 'double *'}}
64*67e74705SXin Li #endif
65*67e74705SXin Li
66*67e74705SXin Li int* ip2 = k(("foo"));
67*67e74705SXin Li #if __cplusplus <= 199711L
68*67e74705SXin Li // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}
69*67e74705SXin Li #else
70*67e74705SXin Li // expected-error@-4 {{cannot initialize a variable of type 'int *' with an rvalue of type 'double *'}}
71*67e74705SXin Li #endif
72*67e74705SXin Li double* dp1 = k(L"foo");
73*67e74705SXin Li }
74*67e74705SXin Li
75*67e74705SXin Li int* l(wchar_t*);
76*67e74705SXin Li double* l(bool);
77*67e74705SXin Li
test_l()78*67e74705SXin Li void test_l() {
79*67e74705SXin Li int* ip1 = l(L"foo");
80*67e74705SXin Li #if __cplusplus <= 199711L
81*67e74705SXin Li // expected-warning@-2 {{conversion from string literal to 'wchar_t *' is deprecated}}
82*67e74705SXin Li #else
83*67e74705SXin Li // expected-error@-4 {{cannot initialize a variable of type 'int *' with an rvalue of type 'double *'}}
84*67e74705SXin Li #endif
85*67e74705SXin Li double* dp1 = l("foo");
86*67e74705SXin Li }
87*67e74705SXin Li
88*67e74705SXin Li int* m(const char*);
89*67e74705SXin Li double* m(char*);
90*67e74705SXin Li
test_m()91*67e74705SXin Li void test_m() {
92*67e74705SXin Li int* ip = m("foo");
93*67e74705SXin Li }
94*67e74705SXin Li
95*67e74705SXin Li int* n(char*);
96*67e74705SXin Li double* n(void*);
97*67e74705SXin Li class E;
98*67e74705SXin Li
test_n(E * e)99*67e74705SXin Li void test_n(E* e) {
100*67e74705SXin Li char ca[7];
101*67e74705SXin Li int* ip1 = n(ca);
102*67e74705SXin Li int* ip2 = n("foo");
103*67e74705SXin Li #if __cplusplus <= 199711L
104*67e74705SXin Li // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}
105*67e74705SXin Li #else
106*67e74705SXin Li // expected-warning@-4 {{ISO C++11 does not allow conversion from string literal to 'char *'}}
107*67e74705SXin Li #endif
108*67e74705SXin Li float fa[7];
109*67e74705SXin Li double* dp1 = n(fa);
110*67e74705SXin Li
111*67e74705SXin Li double* dp2 = n(e);
112*67e74705SXin Li }
113*67e74705SXin Li
114*67e74705SXin Li enum PromotesToInt {
115*67e74705SXin Li PromotesToIntValue = -1
116*67e74705SXin Li };
117*67e74705SXin Li
118*67e74705SXin Li enum PromotesToUnsignedInt {
119*67e74705SXin Li PromotesToUnsignedIntValue = __INT_MAX__ * 2U
120*67e74705SXin Li };
121*67e74705SXin Li
122*67e74705SXin Li int* o(int);
123*67e74705SXin Li double* o(unsigned int);
124*67e74705SXin Li float* o(long);
125*67e74705SXin Li
test_o()126*67e74705SXin Li void test_o() {
127*67e74705SXin Li int* ip1 = o(PromotesToIntValue);
128*67e74705SXin Li double* dp1 = o(PromotesToUnsignedIntValue);
129*67e74705SXin Li }
130*67e74705SXin Li
131*67e74705SXin Li int* p(int);
132*67e74705SXin Li double* p(double);
133*67e74705SXin Li
test_p()134*67e74705SXin Li void test_p() {
135*67e74705SXin Li int* ip = p((short)1);
136*67e74705SXin Li double* dp = p(1.0f);
137*67e74705SXin Li }
138*67e74705SXin Li
139*67e74705SXin Li struct Bits {
140*67e74705SXin Li signed short int_bitfield : 5;
141*67e74705SXin Li unsigned int uint_bitfield : 8;
142*67e74705SXin Li };
143*67e74705SXin Li
144*67e74705SXin Li int* bitfields(int, int);
145*67e74705SXin Li float* bitfields(unsigned int, int);
146*67e74705SXin Li
test_bitfield(Bits bits,int x)147*67e74705SXin Li void test_bitfield(Bits bits, int x) {
148*67e74705SXin Li int* ip = bitfields(bits.int_bitfield, 0);
149*67e74705SXin Li float* fp = bitfields(bits.uint_bitfield, 0u);
150*67e74705SXin Li }
151*67e74705SXin Li
152*67e74705SXin Li int* multiparm(long, int, long); // expected-note {{candidate function}}
153*67e74705SXin Li float* multiparm(int, int, int); // expected-note {{candidate function}}
154*67e74705SXin Li double* multiparm(int, int, short); // expected-note {{candidate function}}
155*67e74705SXin Li
test_multiparm(long lv,short sv,int iv)156*67e74705SXin Li void test_multiparm(long lv, short sv, int iv) {
157*67e74705SXin Li int* ip1 = multiparm(lv, iv, lv);
158*67e74705SXin Li int* ip2 = multiparm(lv, sv, lv);
159*67e74705SXin Li float* fp1 = multiparm(iv, iv, iv);
160*67e74705SXin Li float* fp2 = multiparm(sv, iv, iv);
161*67e74705SXin Li double* dp1 = multiparm(sv, sv, sv);
162*67e74705SXin Li double* dp2 = multiparm(iv, sv, sv);
163*67e74705SXin Li multiparm(sv, sv, lv); // expected-error {{call to 'multiparm' is ambiguous}}
164*67e74705SXin Li }
165*67e74705SXin Li
166*67e74705SXin Li // Test overloading based on qualification vs. no qualification
167*67e74705SXin Li // conversion.
168*67e74705SXin Li int* quals1(int const * p);
169*67e74705SXin Li char* quals1(int * p);
170*67e74705SXin Li
171*67e74705SXin Li int* quals2(int const * const * pp);
172*67e74705SXin Li char* quals2(int * * pp);
173*67e74705SXin Li
174*67e74705SXin Li int* quals3(int const * * const * ppp);
175*67e74705SXin Li char* quals3(int *** ppp);
176*67e74705SXin Li
test_quals(int * p,int ** pp,int *** ppp)177*67e74705SXin Li void test_quals(int * p, int * * pp, int * * * ppp) {
178*67e74705SXin Li char* q1 = quals1(p);
179*67e74705SXin Li char* q2 = quals2(pp);
180*67e74705SXin Li char* q3 = quals3(ppp);
181*67e74705SXin Li }
182*67e74705SXin Li
183*67e74705SXin Li // Test overloading based on qualification ranking (C++ 13.3.2)p3.
184*67e74705SXin Li int* quals_rank1(int const * p);
185*67e74705SXin Li float* quals_rank1(int const volatile *p);
186*67e74705SXin Li char* quals_rank1(char*);
187*67e74705SXin Li double* quals_rank1(const char*);
188*67e74705SXin Li
189*67e74705SXin Li int* quals_rank2(int const * const * pp);
190*67e74705SXin Li float* quals_rank2(int * const * pp);
191*67e74705SXin Li
192*67e74705SXin Li void quals_rank3(int const * const * const volatile * p); // expected-note{{candidate function}}
193*67e74705SXin Li void quals_rank3(int const * const volatile * const * p); // expected-note{{candidate function}}
194*67e74705SXin Li
195*67e74705SXin Li void quals_rank3(int const *); // expected-note{{candidate function}}
196*67e74705SXin Li void quals_rank3(int volatile *); // expected-note{{candidate function}}
197*67e74705SXin Li
test_quals_ranking(int * p,int volatile * pq,int ** pp,int *** ppp)198*67e74705SXin Li void test_quals_ranking(int * p, int volatile *pq, int * * pp, int * * * ppp) {
199*67e74705SXin Li int* q1 = quals_rank1(p);
200*67e74705SXin Li float* q2 = quals_rank1(pq);
201*67e74705SXin Li double* q3 = quals_rank1("string literal");
202*67e74705SXin Li char a[17];
203*67e74705SXin Li const char* ap = a;
204*67e74705SXin Li char* q4 = quals_rank1(a);
205*67e74705SXin Li double* q5 = quals_rank1(ap);
206*67e74705SXin Li
207*67e74705SXin Li float* q6 = quals_rank2(pp);
208*67e74705SXin Li
209*67e74705SXin Li quals_rank3(ppp); // expected-error {{call to 'quals_rank3' is ambiguous}}
210*67e74705SXin Li
211*67e74705SXin Li quals_rank3(p); // expected-error {{call to 'quals_rank3' is ambiguous}}
212*67e74705SXin Li quals_rank3(pq);
213*67e74705SXin Li }
214*67e74705SXin Li
215*67e74705SXin Li // Test overloading based on derived-to-base conversions
216*67e74705SXin Li class A { };
217*67e74705SXin Li class B : public A { };
218*67e74705SXin Li class C : public B { };
219*67e74705SXin Li class D : public C { };
220*67e74705SXin Li
221*67e74705SXin Li int* derived1(A*);
222*67e74705SXin Li char* derived1(const A*);
223*67e74705SXin Li float* derived1(void*);
224*67e74705SXin Li
225*67e74705SXin Li int* derived2(A*);
226*67e74705SXin Li float* derived2(B*);
227*67e74705SXin Li
228*67e74705SXin Li int* derived3(A*);
229*67e74705SXin Li float* derived3(const B*);
230*67e74705SXin Li char* derived3(C*);
231*67e74705SXin Li
test_derived(B * b,B const * bc,C * c,const C * cc,void * v,D * d)232*67e74705SXin Li void test_derived(B* b, B const* bc, C* c, const C* cc, void* v, D* d) {
233*67e74705SXin Li int* d1 = derived1(b);
234*67e74705SXin Li char* d2 = derived1(bc);
235*67e74705SXin Li int* d3 = derived1(c);
236*67e74705SXin Li char* d4 = derived1(cc);
237*67e74705SXin Li float* d5 = derived1(v);
238*67e74705SXin Li
239*67e74705SXin Li float* d6 = derived2(b);
240*67e74705SXin Li float* d7 = derived2(c);
241*67e74705SXin Li
242*67e74705SXin Li char* d8 = derived3(d);
243*67e74705SXin Li }
244*67e74705SXin Li
245*67e74705SXin Li void derived4(C*); // expected-note{{candidate function not viable: cannot convert from base class pointer 'A *' to derived class pointer 'C *' for 1st argument}}
246*67e74705SXin Li
test_base(A * a)247*67e74705SXin Li void test_base(A* a) {
248*67e74705SXin Li derived4(a); // expected-error{{no matching function for call to 'derived4}}
249*67e74705SXin Li }
250*67e74705SXin Li
251*67e74705SXin Li // Test overloading of references.
252*67e74705SXin Li // (FIXME: tests binding to determine candidate sets, not overload
253*67e74705SXin Li // resolution per se).
254*67e74705SXin Li int* intref(int&);
255*67e74705SXin Li float* intref(const int&);
256*67e74705SXin Li
intref_test()257*67e74705SXin Li void intref_test() {
258*67e74705SXin Li float* ir1 = intref(5);
259*67e74705SXin Li float* ir2 = intref(5.5); // expected-warning{{implicit conversion from 'double' to 'int' changes value from 5.5 to 5}}
260*67e74705SXin Li }
261*67e74705SXin Li
262*67e74705SXin Li void derived5(C&); // expected-note{{candidate function not viable: cannot bind base class object of type 'A' to derived class reference 'C &' for 1st argument}}
263*67e74705SXin Li
test_base(A & a)264*67e74705SXin Li void test_base(A& a) {
265*67e74705SXin Li derived5(a); // expected-error{{no matching function for call to 'derived5}}
266*67e74705SXin Li }
267*67e74705SXin Li
268*67e74705SXin Li // Test reference binding vs. standard conversions.
269*67e74705SXin Li int& bind_vs_conv(const double&);
270*67e74705SXin Li float& bind_vs_conv(int);
271*67e74705SXin Li
bind_vs_conv_test()272*67e74705SXin Li void bind_vs_conv_test()
273*67e74705SXin Li {
274*67e74705SXin Li int& i1 = bind_vs_conv(1.0f);
275*67e74705SXin Li float& f1 = bind_vs_conv((short)1);
276*67e74705SXin Li }
277*67e74705SXin Li
278*67e74705SXin Li // Test that cv-qualifiers get subsumed in the reference binding.
279*67e74705SXin Li struct X { };
280*67e74705SXin Li struct Y { };
281*67e74705SXin Li struct Z : X, Y { };
282*67e74705SXin Li
283*67e74705SXin Li int& cvqual_subsume(X&); // expected-note{{candidate function}}
284*67e74705SXin Li float& cvqual_subsume(const Y&); // expected-note{{candidate function}}
285*67e74705SXin Li
286*67e74705SXin Li int& cvqual_subsume2(X&); // expected-note{{candidate function}}
287*67e74705SXin Li float& cvqual_subsume2(volatile Y&); // expected-note{{candidate function}}
288*67e74705SXin Li
cvqual_subsume_test(Z z)289*67e74705SXin Li void cvqual_subsume_test(Z z) {
290*67e74705SXin Li cvqual_subsume(z); // expected-error{{call to 'cvqual_subsume' is ambiguous}}
291*67e74705SXin Li cvqual_subsume2(z); // expected-error{{call to 'cvqual_subsume2' is ambiguous}}
292*67e74705SXin Li }
293*67e74705SXin Li
294*67e74705SXin Li // Test overloading with cv-qualification differences in reference
295*67e74705SXin Li // binding.
296*67e74705SXin Li int& cvqual_diff(X&);
297*67e74705SXin Li float& cvqual_diff(const X&);
298*67e74705SXin Li
cvqual_diff_test(X x,Z z)299*67e74705SXin Li void cvqual_diff_test(X x, Z z) {
300*67e74705SXin Li int& i1 = cvqual_diff(x);
301*67e74705SXin Li int& i2 = cvqual_diff(z);
302*67e74705SXin Li }
303*67e74705SXin Li
304*67e74705SXin Li // Test overloading with derived-to-base differences in reference
305*67e74705SXin Li // binding.
306*67e74705SXin Li struct Z2 : Z { };
307*67e74705SXin Li
308*67e74705SXin Li int& db_rebind(X&);
309*67e74705SXin Li long& db_rebind(Y&);
310*67e74705SXin Li float& db_rebind(Z&);
311*67e74705SXin Li
db_rebind_test(Z2 z2)312*67e74705SXin Li void db_rebind_test(Z2 z2) {
313*67e74705SXin Li float& f1 = db_rebind(z2);
314*67e74705SXin Li }
315*67e74705SXin Li
316*67e74705SXin Li class string { };
317*67e74705SXin Li class opt : public string { };
318*67e74705SXin Li
319*67e74705SXin Li struct SR {
320*67e74705SXin Li SR(const string&);
321*67e74705SXin Li };
322*67e74705SXin Li
f(SR)323*67e74705SXin Li void f(SR) { }
324*67e74705SXin Li
g(opt o)325*67e74705SXin Li void g(opt o) {
326*67e74705SXin Li f(o);
327*67e74705SXin Li }
328*67e74705SXin Li
329*67e74705SXin Li
330*67e74705SXin Li namespace PR5756 {
331*67e74705SXin Li int &a(void*, int);
332*67e74705SXin Li float &a(void*, float);
b()333*67e74705SXin Li void b() {
334*67e74705SXin Li int &ir = a(0,0);
335*67e74705SXin Li (void)ir;
336*67e74705SXin Li }
337*67e74705SXin Li }
338*67e74705SXin Li
339*67e74705SXin Li // Tests the exact text used to note the candidates
340*67e74705SXin Li namespace test1 {
341*67e74705SXin Li 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}}
342*67e74705SXin Li void foo(int n, char N); // expected-note {{candidate function not viable: no known conversion from 'const char [6]' to 'char' for 2nd argument}}
343*67e74705SXin Li void foo(int n, const char *s, int t); // expected-note {{candidate function not viable: requires 3 arguments, but 2 were provided}}
344*67e74705SXin Li void foo(int n, const char *s, int t, ...); // expected-note {{candidate function not viable: requires at least 3 arguments, but 2 were provided}}
345*67e74705SXin Li 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}}
346*67e74705SXin Li
347*67e74705SXin Li // PR 11857
348*67e74705SXin Li void foo(int n); // expected-note {{candidate function not viable: requires single argument 'n', but 2 arguments were provided}}
349*67e74705SXin Li void foo(unsigned n = 10); // expected-note {{candidate function not viable: allows at most single argument 'n', but 2 arguments were provided}}
350*67e74705SXin Li void bar(int n, int u = 0); // expected-note {{candidate function not viable: requires at least argument 'n', but no arguments were provided}}
351*67e74705SXin Li void baz(int n = 0, int u = 0); // expected-note {{candidate function not viable: requires at most 2 arguments, but 3 were provided}}
352*67e74705SXin Li
test()353*67e74705SXin Li void test() {
354*67e74705SXin Li foo(4, "hello"); //expected-error {{no matching function for call to 'foo'}}
355*67e74705SXin Li bar(); //expected-error {{no matching function for call to 'bar'}}
356*67e74705SXin Li baz(3, 4, 5); // expected-error {{no matching function for call to 'baz'}}
357*67e74705SXin Li }
358*67e74705SXin Li }
359*67e74705SXin Li
360*67e74705SXin Li // PR 6014
361*67e74705SXin Li namespace test2 {
362*67e74705SXin Li struct QFixed {
363*67e74705SXin Li QFixed(int i);
364*67e74705SXin Li QFixed(long i);
365*67e74705SXin Li };
366*67e74705SXin Li
367*67e74705SXin Li bool operator==(const QFixed &f, int i);
368*67e74705SXin Li
369*67e74705SXin Li class qrgb666 {
370*67e74705SXin Li inline operator unsigned int () const;
371*67e74705SXin Li
372*67e74705SXin Li inline bool operator==(const qrgb666 &v) const;
operator !=(const qrgb666 & v) const373*67e74705SXin Li inline bool operator!=(const qrgb666 &v) const { return !(*this == v); }
374*67e74705SXin Li };
375*67e74705SXin Li }
376*67e74705SXin Li
377*67e74705SXin Li // PR 6117
378*67e74705SXin Li namespace IncompleteConversion {
379*67e74705SXin Li struct Complete {};
380*67e74705SXin Li struct Incomplete;
381*67e74705SXin Li
382*67e74705SXin Li void completeFunction(Complete *); // expected-note 2 {{cannot convert argument of incomplete type}}
383*67e74705SXin Li void completeFunction(Complete &); // expected-note 2 {{cannot convert argument of incomplete type}}
384*67e74705SXin Li
testTypeConversion(Incomplete * P)385*67e74705SXin Li void testTypeConversion(Incomplete *P) {
386*67e74705SXin Li completeFunction(P); // expected-error {{no matching function for call to 'completeFunction'}}
387*67e74705SXin Li completeFunction(*P); // expected-error {{no matching function for call to 'completeFunction'}}
388*67e74705SXin Li }
389*67e74705SXin Li
390*67e74705SXin Li 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 &}}
391*67e74705SXin Li 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 *}}
392*67e74705SXin Li
testPointerReferenceConversion(Incomplete & reference,Incomplete * pointer)393*67e74705SXin Li void testPointerReferenceConversion(Incomplete &reference, Incomplete *pointer) {
394*67e74705SXin Li incompletePointerFunction(reference); // expected-error {{no matching function for call to 'incompletePointerFunction'}}
395*67e74705SXin Li incompleteReferenceFunction(pointer); // expected-error {{no matching function for call to 'incompleteReferenceFunction'}}
396*67e74705SXin Li }
397*67e74705SXin Li }
398*67e74705SXin Li
399*67e74705SXin Li namespace DerivedToBaseVsVoid {
400*67e74705SXin Li struct A { };
401*67e74705SXin Li struct B : A { };
402*67e74705SXin Li
403*67e74705SXin Li float &f(void *);
404*67e74705SXin Li int &f(const A*);
405*67e74705SXin Li
g(B * b)406*67e74705SXin Li void g(B *b) {
407*67e74705SXin Li int &ir = f(b);
408*67e74705SXin Li }
409*67e74705SXin Li }
410*67e74705SXin Li
411*67e74705SXin Li // PR 6398 + PR 6421
412*67e74705SXin Li namespace test4 {
413*67e74705SXin Li class A;
414*67e74705SXin Li class B {
415*67e74705SXin Li static void foo(); // expected-note {{not viable}}
416*67e74705SXin Li static void foo(int*); // expected-note {{not viable}}
417*67e74705SXin Li static void foo(long*); // expected-note {{not viable}}
418*67e74705SXin Li
bar(A * a)419*67e74705SXin Li void bar(A *a) {
420*67e74705SXin Li foo(a); // expected-error {{no matching function for call}}
421*67e74705SXin Li }
422*67e74705SXin Li };
423*67e74705SXin Li }
424*67e74705SXin Li
425*67e74705SXin Li namespace DerivedToBase {
426*67e74705SXin Li struct A { };
427*67e74705SXin Li struct B : A { };
428*67e74705SXin Li struct C : B { };
429*67e74705SXin Li
430*67e74705SXin Li int &f0(const A&);
431*67e74705SXin Li float &f0(B);
432*67e74705SXin Li
g()433*67e74705SXin Li void g() {
434*67e74705SXin Li float &fr = f0(C());
435*67e74705SXin Li }
436*67e74705SXin Li }
437*67e74705SXin Li
438*67e74705SXin Li namespace PR6483 {
439*67e74705SXin Li struct X0 {
440*67e74705SXin Li operator const unsigned int & () const;
441*67e74705SXin Li };
442*67e74705SXin Li
443*67e74705SXin Li struct X1 {
444*67e74705SXin Li operator unsigned int & () const;
445*67e74705SXin Li };
446*67e74705SXin Li
447*67e74705SXin Li void f0(const bool &);
448*67e74705SXin Li void f1(bool &); // expected-note 2{{not viable}}
449*67e74705SXin Li
g(X0 x0,X1 x1)450*67e74705SXin Li void g(X0 x0, X1 x1) {
451*67e74705SXin Li f0(x0);
452*67e74705SXin Li f1(x0); // expected-error{{no matching function for call}}
453*67e74705SXin Li f0(x1);
454*67e74705SXin Li f1(x1); // expected-error{{no matching function for call}}
455*67e74705SXin Li }
456*67e74705SXin Li }
457*67e74705SXin Li
458*67e74705SXin Li namespace PR6078 {
459*67e74705SXin Li struct A {
460*67e74705SXin Li A(short); // expected-note{{candidate constructor}}
461*67e74705SXin Li A(long); // expected-note{{candidate constructor}}
462*67e74705SXin Li };
463*67e74705SXin Li struct S {
464*67e74705SXin Li typedef void ft(A);
465*67e74705SXin Li operator ft*();
466*67e74705SXin Li };
467*67e74705SXin Li
f()468*67e74705SXin Li void f() {
469*67e74705SXin Li S()(0); // expected-error{{conversion from 'int' to 'PR6078::A' is ambiguous}}
470*67e74705SXin Li }
471*67e74705SXin Li }
472*67e74705SXin Li
473*67e74705SXin Li namespace PR6177 {
474*67e74705SXin Li struct String { String(char const*); };
475*67e74705SXin Li
476*67e74705SXin Li void f(bool const volatile&);
477*67e74705SXin Li int &f(String);
478*67e74705SXin Li
g()479*67e74705SXin Li void g() { int &r = f(""); }
480*67e74705SXin Li }
481*67e74705SXin Li
482*67e74705SXin Li namespace PR7095 {
483*67e74705SXin Li struct X { };
484*67e74705SXin Li
485*67e74705SXin Li struct Y {
486*67e74705SXin Li operator const X*();
487*67e74705SXin Li
488*67e74705SXin Li private:
489*67e74705SXin Li operator X*();
490*67e74705SXin Li };
491*67e74705SXin Li
492*67e74705SXin Li void f(const X *);
g(Y y)493*67e74705SXin Li void g(Y y) { f(y); }
494*67e74705SXin Li }
495*67e74705SXin Li
496*67e74705SXin Li namespace PR7224 {
497*67e74705SXin Li class A {};
498*67e74705SXin Li class B : public A {};
499*67e74705SXin Li
500*67e74705SXin Li int &foo(A *const d);
501*67e74705SXin Li float &foo(const A *const d);
502*67e74705SXin Li
bar()503*67e74705SXin Li void bar()
504*67e74705SXin Li {
505*67e74705SXin Li B *const d = 0;
506*67e74705SXin Li B const *const d2 = 0;
507*67e74705SXin Li int &ir = foo(d);
508*67e74705SXin Li float &fr = foo(d2);
509*67e74705SXin Li }
510*67e74705SXin Li }
511*67e74705SXin Li
512*67e74705SXin Li namespace NontrivialSubsequence {
513*67e74705SXin Li struct X0;
514*67e74705SXin Li
515*67e74705SXin Li class A {
516*67e74705SXin Li operator X0 *();
517*67e74705SXin Li public:
518*67e74705SXin Li operator const X0 *();
519*67e74705SXin Li };
520*67e74705SXin Li
521*67e74705SXin Li A a;
522*67e74705SXin Li void foo( void const * );
523*67e74705SXin Li
g()524*67e74705SXin Li void g() {
525*67e74705SXin Li foo(a);
526*67e74705SXin Li }
527*67e74705SXin Li }
528*67e74705SXin Li
529*67e74705SXin Li // rdar://rdar8499524
530*67e74705SXin Li namespace rdar8499524 {
531*67e74705SXin Li struct W {};
532*67e74705SXin Li struct S {
533*67e74705SXin Li S(...);
534*67e74705SXin Li };
535*67e74705SXin Li
536*67e74705SXin Li void g(const S&);
f()537*67e74705SXin Li void f() {
538*67e74705SXin Li g(W());
539*67e74705SXin Li }
540*67e74705SXin Li }
541*67e74705SXin Li
542*67e74705SXin Li namespace rdar9173984 {
543*67e74705SXin Li template <typename T, unsigned long N> int &f(const T (&)[N]);
544*67e74705SXin Li template <typename T> float &f(const T *);
545*67e74705SXin Li
test()546*67e74705SXin Li void test() {
547*67e74705SXin Li int arr[2] = {0, 0};
548*67e74705SXin Li int *arrp = arr;
549*67e74705SXin Li int &ir = f(arr);
550*67e74705SXin Li float &fr = f(arrp);
551*67e74705SXin Li }
552*67e74705SXin Li }
553*67e74705SXin Li
554*67e74705SXin Li namespace PR9507 {
555*67e74705SXin Li void f(int * const&); // expected-note{{candidate function}}
556*67e74705SXin Li void f(int const(&)[1]); // expected-note{{candidate function}}
557*67e74705SXin Li
main()558*67e74705SXin Li int main() {
559*67e74705SXin Li int n[1];
560*67e74705SXin Li f(n); // expected-error{{call to 'f' is ambiguous}}
561*67e74705SXin Li }
562*67e74705SXin Li }
563*67e74705SXin Li
564*67e74705SXin Li namespace rdar9803316 {
565*67e74705SXin Li void foo(float);
566*67e74705SXin Li int &foo(int);
567*67e74705SXin Li
bar()568*67e74705SXin Li void bar() {
569*67e74705SXin Li int &ir = (&foo)(0);
570*67e74705SXin Li }
571*67e74705SXin Li }
572*67e74705SXin Li
573*67e74705SXin Li namespace IncompleteArg {
574*67e74705SXin Li // Ensure that overload resolution attempts to complete argument types when
575*67e74705SXin Li // performing ADL.
576*67e74705SXin Li template<typename T> struct S {
577*67e74705SXin Li friend int f(const S&);
578*67e74705SXin Li };
579*67e74705SXin Li extern S<int> s;
580*67e74705SXin Li int k = f(s);
581*67e74705SXin Li
582*67e74705SXin Li template<typename T> struct Op {
583*67e74705SXin Li friend bool operator==(const Op &, const Op &);
584*67e74705SXin Li };
585*67e74705SXin Li extern Op<char> op;
586*67e74705SXin Li bool b = op == op;
587*67e74705SXin Li
588*67e74705SXin Li // ... and not in other cases! Nothing here requires U<int()> to be complete.
589*67e74705SXin Li // (Note that instantiating U<int()> will fail.)
590*67e74705SXin Li template<typename T> struct U {
591*67e74705SXin Li T t;
592*67e74705SXin Li };
593*67e74705SXin Li struct Consumer {
594*67e74705SXin Li template<typename T>
595*67e74705SXin Li int operator()(const U<T> &);
596*67e74705SXin Li };
597*67e74705SXin Li template<typename T> U<T> &make();
598*67e74705SXin Li Consumer c;
599*67e74705SXin Li int n = sizeof(c(make<int()>()));
600*67e74705SXin Li }
601*67e74705SXin Li
602*67e74705SXin Li namespace PR12142 {
603*67e74705SXin Li void fun(int (*x)[10]); // expected-note{{candidate function not viable: 1st argument ('const int (*)[10]') would lose const qualifier}}
g()604*67e74705SXin Li void g() { fun((const int(*)[10])0); } // expected-error{{no matching function for call to 'fun'}}
605*67e74705SXin Li }
606*67e74705SXin Li
607*67e74705SXin Li // DR1152: Take 'volatile' into account when handling reference bindings in
608*67e74705SXin Li // overload resolution.
609*67e74705SXin Li namespace PR12931 {
610*67e74705SXin Li void f(const int &, ...);
611*67e74705SXin Li void f(const volatile int &, int);
g()612*67e74705SXin Li void g() { f(0, 0); }
613*67e74705SXin Li }
614*67e74705SXin Li
test5()615*67e74705SXin Li void test5() {
616*67e74705SXin Li struct {
617*67e74705SXin Li typedef void F1(int);
618*67e74705SXin Li typedef void F2(double);
619*67e74705SXin Li operator F1*(); // expected-note{{conversion candidate}}
620*67e74705SXin Li operator F2*(); // expected-note{{conversion candidate}}
621*67e74705SXin Li } callable;
622*67e74705SXin Li callable(); // expected-error{{no matching function for call}}
623*67e74705SXin Li }
624*67e74705SXin Li
625*67e74705SXin Li namespace PR20218 {
626*67e74705SXin Li void f(void (*const &)()); // expected-note 2{{candidate}}
627*67e74705SXin Li void f(void (&&)()) = delete; // expected-note 2{{candidate}}
628*67e74705SXin Li #if __cplusplus <= 199711L
629*67e74705SXin Li // expected-warning@-2 {{rvalue references are a C++11 extension}}
630*67e74705SXin Li // expected-warning@-3 {{deleted function definitions are a C++11 extension}}
631*67e74705SXin Li #endif
632*67e74705SXin Li void g(void (&&)()) = delete; // expected-note 2{{candidate}}
633*67e74705SXin Li #if __cplusplus <= 199711L
634*67e74705SXin Li // expected-warning@-2 {{rvalue references are a C++11 extension}}
635*67e74705SXin Li // expected-warning@-3 {{deleted function definitions are a C++11 extension}}
636*67e74705SXin Li #endif
637*67e74705SXin Li void g(void (*const &)()); // expected-note 2{{candidate}}
638*67e74705SXin Li
639*67e74705SXin Li void x();
640*67e74705SXin Li typedef void (&fr)();
641*67e74705SXin Li struct Y { operator fr(); } y;
642*67e74705SXin Li
h()643*67e74705SXin Li void h() {
644*67e74705SXin Li f(x); // expected-error {{ambiguous}}
645*67e74705SXin Li g(x); // expected-error {{ambiguous}}
646*67e74705SXin Li f(y); // expected-error {{ambiguous}}
647*67e74705SXin Li g(y); // expected-error {{ambiguous}}
648*67e74705SXin Li }
649*67e74705SXin Li }
650