forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			100 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -fsyntax-only -verify %s 
 | 
						|
struct X {
 | 
						|
  operator bool();
 | 
						|
};
 | 
						|
 | 
						|
int& f(bool);
 | 
						|
float& f(int);
 | 
						|
 | 
						|
void f_test(X x) {
 | 
						|
  int& i1 = f(x);
 | 
						|
}
 | 
						|
 | 
						|
struct Y {
 | 
						|
  operator short();
 | 
						|
  operator float();
 | 
						|
};
 | 
						|
 | 
						|
void g(int);
 | 
						|
 | 
						|
void g_test(Y y) {
 | 
						|
  g(y);
 | 
						|
  short s;
 | 
						|
  s = y;
 | 
						|
}
 | 
						|
 | 
						|
struct A { };
 | 
						|
struct B : A { };
 | 
						|
 | 
						|
struct C {
 | 
						|
  operator B&();
 | 
						|
};
 | 
						|
 | 
						|
// Test reference binding via an lvalue conversion function.
 | 
						|
void h(volatile A&);
 | 
						|
void h_test(C c) {
 | 
						|
  h(c);
 | 
						|
}
 | 
						|
 | 
						|
// Test conversion followed by copy-construction
 | 
						|
struct FunkyDerived;
 | 
						|
 | 
						|
struct Base { 
 | 
						|
  Base(const FunkyDerived&);
 | 
						|
};
 | 
						|
 | 
						|
struct Derived : Base { };
 | 
						|
 | 
						|
struct FunkyDerived : Base { };
 | 
						|
 | 
						|
struct ConvertibleToBase {
 | 
						|
  operator Base();
 | 
						|
};
 | 
						|
 | 
						|
struct ConvertibleToDerived {
 | 
						|
  operator Derived();
 | 
						|
};
 | 
						|
 | 
						|
struct ConvertibleToFunkyDerived {
 | 
						|
  operator FunkyDerived();
 | 
						|
};
 | 
						|
 | 
						|
void test_conversion(ConvertibleToBase ctb, ConvertibleToDerived ctd,
 | 
						|
                     ConvertibleToFunkyDerived ctfd) {
 | 
						|
  Base b1 = ctb;
 | 
						|
  Base b2(ctb);
 | 
						|
  Base b3 = ctd;
 | 
						|
  Base b4(ctd);
 | 
						|
  Base b5 = ctfd;
 | 
						|
}
 | 
						|
 | 
						|
struct X1 {
 | 
						|
  X1(X1&); // expected-note{{candidate constructor not viable: expects an l-value for 1st argument}}
 | 
						|
};
 | 
						|
 | 
						|
struct X2 {
 | 
						|
  operator X1();
 | 
						|
};
 | 
						|
 | 
						|
int &f(X1);
 | 
						|
float &f(...);
 | 
						|
 | 
						|
void g(X2 b) {
 | 
						|
  int &ir = f(b); // expected-error{{no viable constructor copying parameter of type 'X1'}}
 | 
						|
}
 | 
						|
 | 
						|
namespace rdar10202900 {
 | 
						|
  class A {
 | 
						|
  public:
 | 
						|
    A();
 | 
						|
 | 
						|
  private:
 | 
						|
    A(int i); // expected-note{{declared private here}}
 | 
						|
  };
 | 
						|
 | 
						|
  void testA(A a) {
 | 
						|
    int b = 10;
 | 
						|
    a = b; // expected-error{{calling a private constructor of class 'rdar10202900::A'}}
 | 
						|
  }
 | 
						|
}
 |