1 // PR c++/87109
2 // { dg-do run { target c++11 } }
3 
4 #include <utility>
5 
6 struct C { int i; };
7 struct D { int i; };
8 
9 struct A {
10   int j;
CA11   operator C() & { return { 1 }; }
CA12   operator C() && { return { 2 }; }
13 };
14 
15 struct B : public A {
DB16   operator D() & { return { 3 }; }
DB17   operator D() && { return { 4 }; }
18 };
19 
20 C
f(A a)21 f (A a)
22 {
23   return a;
24 }
25 
26 C
f2(A a)27 f2 (A a)
28 {
29   return std::move (a);
30 }
31 
32 C
f3()33 f3 ()
34 {
35   A a;
36   return a;
37 }
38 
39 C
f4()40 f4 ()
41 {
42   A a;
43   return std::move (a);
44 }
45 
46 C
f5()47 f5 ()
48 {
49   return A();
50 }
51 
52 D
f6(B b)53 f6 (B b)
54 {
55   return b;
56 }
57 
58 D
f7(B b)59 f7 (B b)
60 {
61   return std::move (b);
62 }
63 
64 D
f8()65 f8 ()
66 {
67   B b;
68   return b;
69 }
70 
71 D
f9()72 f9 ()
73 {
74   B b;
75   return std::move (b);
76 }
77 
78 D
f10()79 f10 ()
80 {
81   return B();
82 }
83 
84 int
main()85 main ()
86 {
87   C c1 = f (A());
88   if (c1.i != 2)
89     __builtin_abort ();
90   C c2 = f2 (A());
91   if (c2.i != 2)
92     __builtin_abort ();
93   C c3 = f3 ();
94   if (c3.i != 2)
95     __builtin_abort ();
96   C c4 = f4 ();
97   if (c4.i != 2)
98     __builtin_abort ();
99   C c5 = f5 ();
100   if (c5.i != 2)
101     __builtin_abort ();
102   D c6 = f6 (B());
103   if (c6.i != 4)
104     __builtin_abort ();
105   D c7 = f7 (B());
106   if (c7.i != 4)
107     __builtin_abort ();
108   D c8 = f8 ();
109   if (c8.i != 4)
110     __builtin_abort ();
111   D c9 = f9 ();
112   if (c9.i != 4)
113     __builtin_abort ();
114   D c10 = f10 ();
115   if (c10.i != 4)
116     __builtin_abort ();
117 }
118