// 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