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)21f (A a) 22 { 23 return a; 24 } 25 26 C f2(A a)27f2 (A a) 28 { 29 return std::move (a); 30 } 31 32 C f3()33f3 () 34 { 35 A a; 36 return a; 37 } 38 39 C f4()40f4 () 41 { 42 A a; 43 return std::move (a); 44 } 45 46 C f5()47f5 () 48 { 49 return A(); 50 } 51 52 D f6(B b)53f6 (B b) 54 { 55 return b; 56 } 57 58 D f7(B b)59f7 (B b) 60 { 61 return std::move (b); 62 } 63 64 D f8()65f8 () 66 { 67 B b; 68 return b; 69 } 70 71 D f9()72f9 () 73 { 74 B b; 75 return std::move (b); 76 } 77 78 D f10()79f10 () 80 { 81 return B(); 82 } 83 84 int main()85main () 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