119 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
// 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
 |