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