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'}}
 | |
|   }
 | |
| }
 | 
