1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 struct X { 3 operator bool(); 4 }; 5 6 int& f(bool); 7 float& f(int); 8 9 void f_test(X x) { 10 int& i1 = f(x); 11 } 12 13 struct Y { 14 operator short(); 15 operator float(); 16 }; 17 18 void g(int); 19 20 void g_test(Y y) { 21 g(y); 22 short s; 23 s = y; 24 } 25 26 struct A { }; 27 struct B : A { }; 28 29 struct C { 30 operator B&(); 31 }; 32 33 // Test reference binding via an lvalue conversion function. 34 void h(volatile A&); 35 void h_test(C c) { 36 h(c); 37 } 38 39 // Test conversion followed by copy-construction 40 struct FunkyDerived; 41 42 struct Base { 43 Base(const FunkyDerived&); 44 }; 45 46 struct Derived : Base { }; 47 48 struct FunkyDerived : Base { }; 49 50 struct ConvertibleToBase { 51 operator Base(); 52 }; 53 54 struct ConvertibleToDerived { 55 operator Derived(); 56 }; 57 58 struct ConvertibleToFunkyDerived { 59 operator FunkyDerived(); 60 }; 61 62 void test_conversion(ConvertibleToBase ctb, ConvertibleToDerived ctd, 63 ConvertibleToFunkyDerived ctfd) { 64 Base b1 = ctb; 65 Base b2(ctb); 66 Base b3 = ctd; 67 Base b4(ctd); 68 Base b5 = ctfd; 69 } 70 71 struct X1 { 72 X1(X1&); // expected-note{{candidate constructor not viable: expects an l-value for 1st argument}} 73 }; 74 75 struct X2 { 76 operator X1(); 77 }; 78 79 int &f(X1); 80 float &f(...); 81 82 void g(X2 b) { 83 int &ir = f(b); // expected-error{{no viable constructor copying parameter of type 'X1'}} 84 } 85 86 namespace rdar10202900 { 87 class A { 88 public: 89 A(); 90 91 private: 92 A(int i); // expected-note{{declared private here}} 93 }; 94 95 void testA(A a) { 96 int b = 10; 97 a = b; // expected-error{{calling a private constructor of class 'rdar10202900::A'}} 98 } 99 } 100