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