| // RUN: not %clang_cc1 -fdiagnostics-parseable-fixits -x c++ %s 2> %t | 
 | // RUN: FileCheck %s < %t | 
 | // PR5941 | 
 | // END. | 
 |  | 
 | /* Test fixits for * and & mismatch in function arguments. | 
 |  * Since fixits are on the notes, they cannot be applied automatically. */ | 
 |  | 
 | typedef int intTy; | 
 | typedef int intTy2; | 
 |  | 
 | void f0(int *a); | 
 | void f1(double *a); | 
 | void f1(intTy &a); | 
 |  | 
 | void f2(intTy2 *a) { | 
 | // CHECK: error: no matching function for call to 'f1 | 
 | // CHECK: dereference the argument with * | 
 | // CHECK: void f1(intTy &a); | 
 | // CHECK: fix-it{{.*}}*( | 
 | // CHECK-NEXT: fix-it{{.*}}) | 
 | // CHECK: void f1(double *a); | 
 |   f1(a + 1); | 
 |  | 
 | // This call cannot be fixed since without resulting in null pointer dereference. | 
 | // CHECK: error: no matching function for call to 'f1 | 
 | // CHECK-NOT: dereference the argument with * | 
 | // CHECK-NOT: fix-it | 
 |   f1((int *)0); | 
 | } | 
 |  | 
 | void f3(int &a) { | 
 | // CHECK: error: no matching function for call to 'f0 | 
 | // CHECK: fix-it{{.*}}& | 
 |  f0(a); | 
 | } | 
 |  | 
 |  | 
 | void m(int *a, const int *b); // match 2 | 
 | void m(double *a, int *b); // no match | 
 | void m(int *a, double *b); // no match | 
 | void m(intTy &a, int *b); // match 1 | 
 |  | 
 | void mcaller(intTy2 a, int b) { | 
 | // CHECK: error: no matching function for call to 'm | 
 | // CHECK: take the address of the argument with & | 
 | // CHECK: fix-it{{.*}}& | 
 | // CHECK: take the address of the argument with & | 
 | // CHECK: fix-it{{.*}}& | 
 | // CHECK: fix-it{{.*}}& | 
 |   m(a, b); | 
 |  | 
 | // This call cannot be fixed because (a + 1) is not an l-value. | 
 | // CHECK: error: no matching function for call to 'm | 
 | // CHECK-NOT: fix-it | 
 |   m(a + 1, b); | 
 | } | 
 |  | 
 | // Test derived to base conversions. | 
 | struct A { | 
 |   int xx; | 
 | }; | 
 |  | 
 | struct B : public A { | 
 |   double y; | 
 | }; | 
 |  | 
 | class C : A {}; | 
 |  | 
 | bool br(A &a); | 
 | bool bp(A *a); | 
 | bool dv(B b); | 
 |  | 
 | void u(int x); | 
 | void u(const C *x); | 
 | void u(double x); | 
 |  | 
 | void dbcaller(A *ptra, B *ptrb, C &c, B &refb) { | 
 |   B b; | 
 |  | 
 | // CHECK: error: no matching function for call to 'br | 
 | // CHECK: fix-it{{.*}}* | 
 |   br(ptrb); // good | 
 |  | 
 | // CHECK: error: no matching function for call to 'bp | 
 | // CHECK: fix-it{{.*}}& | 
 |   bp(b); // good | 
 |  | 
 | // CHECK: error: no matching function for call to 'dv | 
 | // CHECK-NOT: fix-it | 
 |   dv(ptra); // bad: base to derived | 
 |  | 
 | // CHECK: error: no matching function for call to 'dv | 
 | // CHECK: remove & | 
 |   dv(&b); | 
 |  | 
 | // CHECK: error: no matching function for call to 'bp | 
 | // CHECK: remove * | 
 |   bp(*ptra); | 
 |  | 
 | // CHECK: error: no viable overloaded '=' | 
 | // CHECK: remove & | 
 |   b = &refb; | 
 |  | 
 | // TODO: Test that we do not provide a fixit when inheritance is private. | 
 | // CHECK: error: no matching function for call to 'bp | 
 | // There should not be a fixit here: | 
 | // CHECK: fix-it | 
 |   bp(c); | 
 |  | 
 | // CHECK: no matching function for call to 'u' | 
 | // CHECK: candidate function not viable: no known conversion from 'C' to 'const C *' for 1st argument; take the address of the argument with & | 
 | // CHECK: candidate function not viable | 
 | // CHECK: candidate function not viable | 
 |   u(c); | 
 | } | 
 |  | 
 | // CHECK: errors generated |