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 | |