// RUN: clang-cc -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; }