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