12315318436b3e94d54c220c3b8986e8002394a43Richard Smith// RUN: not %clang_cc1 -fdiagnostics-parseable-fixits -x c++ %s 2> %t 2b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// RUN: FileCheck %s < %t 3b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// PR5941 4b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// END. 5b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 6b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks/* Test fixits for * and & mismatch in function arguments. 7b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks * Since fixits are on the notes, they cannot be applied automatically. */ 8b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 9b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zakstypedef int intTy; 10b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zakstypedef int intTy2; 11b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 12b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid f0(int *a); 13b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid f1(double *a); 14b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid f1(intTy &a); 15b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 16b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid f2(intTy2 *a) { 17b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: error: no matching function for call to 'f1 18b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: dereference the argument with * 19b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: void f1(intTy &a); 20b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: fix-it{{.*}}*( 21b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK-NEXT: fix-it{{.*}}) 22b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: void f1(double *a); 23b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks f1(a + 1); 24b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 25b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// This call cannot be fixed since without resulting in null pointer dereference. 26b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: error: no matching function for call to 'f1 27ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks// CHECK-NOT: dereference the argument with * 28b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK-NOT: fix-it 29b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks f1((int *)0); 30b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks} 31b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 32b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid f3(int &a) { 33b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: error: no matching function for call to 'f0 34b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: fix-it{{.*}}& 35b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks f0(a); 36b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks} 37b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 38b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 39b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid m(int *a, const int *b); // match 2 40b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid m(double *a, int *b); // no match 41b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid m(int *a, double *b); // no match 42b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid m(intTy &a, int *b); // match 1 43b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 44b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksvoid mcaller(intTy2 a, int b) { 45b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: error: no matching function for call to 'm 46b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: take the address of the argument with & 47b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: fix-it{{.*}}& 48b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: take the address of the argument with & 49b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: fix-it{{.*}}& 50b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: fix-it{{.*}}& 51b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks m(a, b); 52b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 53b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// This call cannot be fixed because (a + 1) is not an l-value. 54b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: error: no matching function for call to 'm 55b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK-NOT: fix-it 56b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks m(a + 1, b); 57b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks} 58b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 59b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// Test derived to base conversions. 60b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksstruct A { 61b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks int xx; 62b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks}; 63b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 64b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksstruct B : public A { 65b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks double y; 66b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks}; 67b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 68ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaksclass C : A {}; 69ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks 70b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksbool br(A &a); 71b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksbool bp(A *a); 72b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaksbool dv(B b); 73b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 741d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaksvoid u(int x); 751d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaksvoid u(const C *x); 761d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaksvoid u(double x); 771d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks 781d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaksvoid dbcaller(A *ptra, B *ptrb, C &c, B &refb) { 79b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks B b; 80b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 81b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: error: no matching function for call to 'br 82b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: fix-it{{.*}}* 83b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks br(ptrb); // good 84ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks 85b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: error: no matching function for call to 'bp 86b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: fix-it{{.*}}& 87b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks bp(b); // good 88b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 89b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: error: no matching function for call to 'dv 90b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK-NOT: fix-it 91b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks dv(ptra); // bad: base to derived 92ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks 93ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks// CHECK: error: no matching function for call to 'dv 94ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks// CHECK: remove & 95ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks dv(&b); 96ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks 97ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks// CHECK: error: no matching function for call to 'bp 98ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks// CHECK: remove * 99ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks bp(*ptra); 100ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks 1011d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks// CHECK: error: no viable overloaded '=' 1021d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks// CHECK: remove & 1031d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks b = &refb; 1041d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks 105ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks// TODO: Test that we do not provide a fixit when inheritance is private. 106ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks// CHECK: error: no matching function for call to 'bp 107ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks// There should not be a fixit here: 108ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks// CHECK: fix-it 109ffe9edd45f26873d58e7ddf79d403dd8072b748bAnna Zaks bp(c); 1101d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks 1111d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks// CHECK: no matching function for call to 'u' 1121d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks// CHECK: candidate function not viable: no known conversion from 'C' to 'const C *' for 1st argument; take the address of the argument with & 1131d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks// CHECK: candidate function not viable 1141d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks// CHECK: candidate function not viable 1151d05d424cb2be0e3f369ec27d8fb8be20e9ba5aeAnna Zaks u(c); 116b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks} 117b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks 118b89fe6b04c5b8a2d080c1c5605b72f809fc9ee68Anna Zaks// CHECK: errors generated 119