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