1*3ab15558SRichard Smith // RUN: not %clang_cc1 -fdiagnostics-parseable-fixits -x c++ %s 2> %t
2df92ddf8SAnna Zaks // RUN: FileCheck %s < %t
3df92ddf8SAnna Zaks // PR5941
4df92ddf8SAnna Zaks // END.
5df92ddf8SAnna Zaks 
6df92ddf8SAnna Zaks /* Test fixits for * and & mismatch in function arguments.
7df92ddf8SAnna Zaks  * Since fixits are on the notes, they cannot be applied automatically. */
8df92ddf8SAnna Zaks 
9df92ddf8SAnna Zaks typedef int intTy;
10df92ddf8SAnna Zaks typedef int intTy2;
11df92ddf8SAnna Zaks 
12df92ddf8SAnna Zaks void f0(int *a);
13df92ddf8SAnna Zaks void f1(double *a);
14df92ddf8SAnna Zaks void f1(intTy &a);
15df92ddf8SAnna Zaks 
f2(intTy2 * a)16df92ddf8SAnna Zaks void f2(intTy2 *a) {
17df92ddf8SAnna Zaks // CHECK: error: no matching function for call to 'f1
18df92ddf8SAnna Zaks // CHECK: dereference the argument with *
19df92ddf8SAnna Zaks // CHECK: void f1(intTy &a);
20df92ddf8SAnna Zaks // CHECK: fix-it{{.*}}*(
21df92ddf8SAnna Zaks // CHECK-NEXT: fix-it{{.*}})
22df92ddf8SAnna Zaks // CHECK: void f1(double *a);
23df92ddf8SAnna Zaks   f1(a + 1);
24df92ddf8SAnna Zaks 
25df92ddf8SAnna Zaks // This call cannot be fixed since without resulting in null pointer dereference.
26df92ddf8SAnna Zaks // CHECK: error: no matching function for call to 'f1
279ccf84e3SAnna Zaks // CHECK-NOT: dereference the argument with *
28df92ddf8SAnna Zaks // CHECK-NOT: fix-it
29df92ddf8SAnna Zaks   f1((int *)0);
30df92ddf8SAnna Zaks }
31df92ddf8SAnna Zaks 
f3(int & a)32df92ddf8SAnna Zaks void f3(int &a) {
33df92ddf8SAnna Zaks // CHECK: error: no matching function for call to 'f0
34df92ddf8SAnna Zaks // CHECK: fix-it{{.*}}&
35df92ddf8SAnna Zaks  f0(a);
36df92ddf8SAnna Zaks }
37df92ddf8SAnna Zaks 
38df92ddf8SAnna Zaks 
39df92ddf8SAnna Zaks void m(int *a, const int *b); // match 2
40df92ddf8SAnna Zaks void m(double *a, int *b); // no match
41df92ddf8SAnna Zaks void m(int *a, double *b); // no match
42df92ddf8SAnna Zaks void m(intTy &a, int *b); // match 1
43df92ddf8SAnna Zaks 
mcaller(intTy2 a,int b)44df92ddf8SAnna Zaks void mcaller(intTy2 a, int b) {
45df92ddf8SAnna Zaks // CHECK: error: no matching function for call to 'm
46df92ddf8SAnna Zaks // CHECK: take the address of the argument with &
47df92ddf8SAnna Zaks // CHECK: fix-it{{.*}}&
48df92ddf8SAnna Zaks // CHECK: take the address of the argument with &
49df92ddf8SAnna Zaks // CHECK: fix-it{{.*}}&
50df92ddf8SAnna Zaks // CHECK: fix-it{{.*}}&
51df92ddf8SAnna Zaks   m(a, b);
52df92ddf8SAnna Zaks 
53df92ddf8SAnna Zaks // This call cannot be fixed because (a + 1) is not an l-value.
54df92ddf8SAnna Zaks // CHECK: error: no matching function for call to 'm
55df92ddf8SAnna Zaks // CHECK-NOT: fix-it
56df92ddf8SAnna Zaks   m(a + 1, b);
57df92ddf8SAnna Zaks }
58df92ddf8SAnna Zaks 
59df92ddf8SAnna Zaks // Test derived to base conversions.
60df92ddf8SAnna Zaks struct A {
61df92ddf8SAnna Zaks   int xx;
62df92ddf8SAnna Zaks };
63df92ddf8SAnna Zaks 
64df92ddf8SAnna Zaks struct B : public A {
65df92ddf8SAnna Zaks   double y;
66df92ddf8SAnna Zaks };
67df92ddf8SAnna Zaks 
689ccf84e3SAnna Zaks class C : A {};
699ccf84e3SAnna Zaks 
70df92ddf8SAnna Zaks bool br(A &a);
71df92ddf8SAnna Zaks bool bp(A *a);
72df92ddf8SAnna Zaks bool dv(B b);
73df92ddf8SAnna Zaks 
7467a70481SAnna Zaks void u(int x);
7567a70481SAnna Zaks void u(const C *x);
7667a70481SAnna Zaks void u(double x);
7767a70481SAnna Zaks 
dbcaller(A * ptra,B * ptrb,C & c,B & refb)7867a70481SAnna Zaks void dbcaller(A *ptra, B *ptrb, C &c, B &refb) {
79df92ddf8SAnna Zaks   B b;
80df92ddf8SAnna Zaks 
81df92ddf8SAnna Zaks // CHECK: error: no matching function for call to 'br
82df92ddf8SAnna Zaks // CHECK: fix-it{{.*}}*
83df92ddf8SAnna Zaks   br(ptrb); // good
849ccf84e3SAnna Zaks 
85df92ddf8SAnna Zaks // CHECK: error: no matching function for call to 'bp
86df92ddf8SAnna Zaks // CHECK: fix-it{{.*}}&
87df92ddf8SAnna Zaks   bp(b); // good
88df92ddf8SAnna Zaks 
89df92ddf8SAnna Zaks // CHECK: error: no matching function for call to 'dv
90df92ddf8SAnna Zaks // CHECK-NOT: fix-it
91df92ddf8SAnna Zaks   dv(ptra); // bad: base to derived
929ccf84e3SAnna Zaks 
939ccf84e3SAnna Zaks // CHECK: error: no matching function for call to 'dv
949ccf84e3SAnna Zaks // CHECK: remove &
959ccf84e3SAnna Zaks   dv(&b);
969ccf84e3SAnna Zaks 
979ccf84e3SAnna Zaks // CHECK: error: no matching function for call to 'bp
989ccf84e3SAnna Zaks // CHECK: remove *
999ccf84e3SAnna Zaks   bp(*ptra);
1009ccf84e3SAnna Zaks 
10167a70481SAnna Zaks // CHECK: error: no viable overloaded '='
10267a70481SAnna Zaks // CHECK: remove &
10367a70481SAnna Zaks   b = &refb;
10467a70481SAnna Zaks 
1059ccf84e3SAnna Zaks // TODO: Test that we do not provide a fixit when inheritance is private.
1069ccf84e3SAnna Zaks // CHECK: error: no matching function for call to 'bp
1079ccf84e3SAnna Zaks // There should not be a fixit here:
1089ccf84e3SAnna Zaks // CHECK: fix-it
1099ccf84e3SAnna Zaks   bp(c);
11067a70481SAnna Zaks 
11167a70481SAnna Zaks // CHECK: no matching function for call to 'u'
11267a70481SAnna Zaks // CHECK: candidate function not viable: no known conversion from 'C' to 'const C *' for 1st argument; take the address of the argument with &
11367a70481SAnna Zaks // CHECK: candidate function not viable
11467a70481SAnna Zaks // CHECK: candidate function not viable
11567a70481SAnna Zaks   u(c);
116df92ddf8SAnna Zaks }
117df92ddf8SAnna Zaks 
118df92ddf8SAnna Zaks // CHECK: errors generated
119