1 // PR c++/87109 2 // { dg-do run { target c++11 } } 3 4 #include <utility> 5 6 struct Y { 7 int y; YY8 Y(int y_) : y(y_) { } 9 }; 10 struct X : public Y { 11 int x; XX12 X(int x_, int y_) : x(x_), Y(y_) { } 13 }; 14 15 struct A { XA16 operator X() & { return { 0, 2 }; } XA17 operator X() && { return { 0, -1 }; } 18 }; 19 20 Y f(A a)21f (A a) 22 { 23 return a; 24 } 25 26 Y f2(A a)27f2 (A a) 28 { 29 return std::move (a); 30 } 31 32 Y f3()33f3 () 34 { 35 A a; 36 return a; 37 } 38 39 Y f4()40f4 () 41 { 42 A a; 43 return std::move (a); 44 } 45 46 Y f5()47f5 () 48 { 49 return A(); 50 } 51 52 int main()53main () 54 { 55 Y y1 = f (A()); 56 if (y1.y != 2) 57 __builtin_abort (); 58 Y y2 = f2 (A()); 59 if (y2.y != -1) 60 __builtin_abort (); 61 Y y3 = f3 (); 62 if (y3.y != 2) 63 __builtin_abort (); 64 Y y4 = f4 (); 65 if (y4.y != -1) 66 __builtin_abort (); 67 Y y5 = f5 (); 68 if (y5.y != -1) 69 __builtin_abort (); 70 } 71