Richard Smith | 2315318 | 2011-09-06 03:01:15 +0000 | [diff] [blame] | 1 | // RUN: not %clang_cc1 -fdiagnostics-parseable-fixits -x c++ %s 2> %t |
Anna Zaks | b89fe6b | 2011-07-19 19:49:12 +0000 | [diff] [blame] | 2 | // RUN: FileCheck %s < %t |
| 3 | // PR5941 |
| 4 | // END. |
| 5 | |
| 6 | /* Test fixits for * and & mismatch in function arguments. |
| 7 | * Since fixits are on the notes, they cannot be applied automatically. */ |
| 8 | |
| 9 | typedef int intTy; |
| 10 | typedef int intTy2; |
| 11 | |
| 12 | void f0(int *a); |
| 13 | void f1(double *a); |
| 14 | void f1(intTy &a); |
| 15 | |
| 16 | void f2(intTy2 *a) { |
| 17 | // CHECK: error: no matching function for call to 'f1 |
| 18 | // CHECK: dereference the argument with * |
| 19 | // CHECK: void f1(intTy &a); |
| 20 | // CHECK: fix-it{{.*}}*( |
| 21 | // CHECK-NEXT: fix-it{{.*}}) |
| 22 | // CHECK: void f1(double *a); |
| 23 | f1(a + 1); |
| 24 | |
| 25 | // This call cannot be fixed since without resulting in null pointer dereference. |
| 26 | // CHECK: error: no matching function for call to 'f1 |
Anna Zaks | ffe9edd | 2011-07-21 00:34:39 +0000 | [diff] [blame] | 27 | // CHECK-NOT: dereference the argument with * |
Anna Zaks | b89fe6b | 2011-07-19 19:49:12 +0000 | [diff] [blame] | 28 | // CHECK-NOT: fix-it |
| 29 | f1((int *)0); |
| 30 | } |
| 31 | |
| 32 | void f3(int &a) { |
| 33 | // CHECK: error: no matching function for call to 'f0 |
| 34 | // CHECK: fix-it{{.*}}& |
| 35 | f0(a); |
| 36 | } |
| 37 | |
| 38 | |
| 39 | void m(int *a, const int *b); // match 2 |
| 40 | void m(double *a, int *b); // no match |
| 41 | void m(int *a, double *b); // no match |
| 42 | void m(intTy &a, int *b); // match 1 |
| 43 | |
| 44 | void mcaller(intTy2 a, int b) { |
| 45 | // CHECK: error: no matching function for call to 'm |
| 46 | // CHECK: take the address of the argument with & |
| 47 | // CHECK: fix-it{{.*}}& |
| 48 | // CHECK: take the address of the argument with & |
| 49 | // CHECK: fix-it{{.*}}& |
| 50 | // CHECK: fix-it{{.*}}& |
| 51 | m(a, b); |
| 52 | |
| 53 | // This call cannot be fixed because (a + 1) is not an l-value. |
| 54 | // CHECK: error: no matching function for call to 'm |
| 55 | // CHECK-NOT: fix-it |
| 56 | m(a + 1, b); |
| 57 | } |
| 58 | |
| 59 | // Test derived to base conversions. |
| 60 | struct A { |
| 61 | int xx; |
| 62 | }; |
| 63 | |
| 64 | struct B : public A { |
| 65 | double y; |
| 66 | }; |
| 67 | |
Anna Zaks | ffe9edd | 2011-07-21 00:34:39 +0000 | [diff] [blame] | 68 | class C : A {}; |
| 69 | |
Anna Zaks | b89fe6b | 2011-07-19 19:49:12 +0000 | [diff] [blame] | 70 | bool br(A &a); |
| 71 | bool bp(A *a); |
| 72 | bool dv(B b); |
| 73 | |
Anna Zaks | 1d05d42 | 2011-07-28 19:55:52 +0000 | [diff] [blame] | 74 | void u(int x); |
| 75 | void u(const C *x); |
| 76 | void u(double x); |
| 77 | |
| 78 | void dbcaller(A *ptra, B *ptrb, C &c, B &refb) { |
Anna Zaks | b89fe6b | 2011-07-19 19:49:12 +0000 | [diff] [blame] | 79 | B b; |
| 80 | |
| 81 | // CHECK: error: no matching function for call to 'br |
| 82 | // CHECK: fix-it{{.*}}* |
| 83 | br(ptrb); // good |
Anna Zaks | ffe9edd | 2011-07-21 00:34:39 +0000 | [diff] [blame] | 84 | |
Anna Zaks | b89fe6b | 2011-07-19 19:49:12 +0000 | [diff] [blame] | 85 | // CHECK: error: no matching function for call to 'bp |
| 86 | // CHECK: fix-it{{.*}}& |
| 87 | bp(b); // good |
| 88 | |
| 89 | // CHECK: error: no matching function for call to 'dv |
| 90 | // CHECK-NOT: fix-it |
| 91 | dv(ptra); // bad: base to derived |
Anna Zaks | ffe9edd | 2011-07-21 00:34:39 +0000 | [diff] [blame] | 92 | |
| 93 | // CHECK: error: no matching function for call to 'dv |
| 94 | // CHECK: remove & |
| 95 | dv(&b); |
| 96 | |
| 97 | // CHECK: error: no matching function for call to 'bp |
| 98 | // CHECK: remove * |
| 99 | bp(*ptra); |
| 100 | |
Anna Zaks | 1d05d42 | 2011-07-28 19:55:52 +0000 | [diff] [blame] | 101 | // CHECK: error: no viable overloaded '=' |
| 102 | // CHECK: remove & |
| 103 | b = &refb; |
| 104 | |
Anna Zaks | ffe9edd | 2011-07-21 00:34:39 +0000 | [diff] [blame] | 105 | // TODO: Test that we do not provide a fixit when inheritance is private. |
| 106 | // CHECK: error: no matching function for call to 'bp |
| 107 | // There should not be a fixit here: |
| 108 | // CHECK: fix-it |
| 109 | bp(c); |
Anna Zaks | 1d05d42 | 2011-07-28 19:55:52 +0000 | [diff] [blame] | 110 | |
| 111 | // CHECK: no matching function for call to 'u' |
| 112 | // CHECK: candidate function not viable: no known conversion from 'C' to 'const C *' for 1st argument; take the address of the argument with & |
| 113 | // CHECK: candidate function not viable |
| 114 | // CHECK: candidate function not viable |
| 115 | u(c); |
Anna Zaks | b89fe6b | 2011-07-19 19:49:12 +0000 | [diff] [blame] | 116 | } |
| 117 | |
| 118 | // CHECK: errors generated |