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 
f_test(X x)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 
g_test(Y y)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&);
h_test(C c)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 
test_conversion(ConvertibleToBase ctb,ConvertibleToDerived ctd,ConvertibleToFunkyDerived ctfd)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 
g(X2 b)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 
testA(A a)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