xref: /aosp_15_r20/external/clang/test/SemaCXX/user-defined-conversions.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void 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 Li void 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 Li void 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 Li void 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