1 // PR c++/88692 2 // { dg-do compile { target c++11 } } 3 // { dg-options "-Wredundant-move" } 4 5 // Define std::move. 6 namespace std { 7 template<typename _Tp> 8 struct remove_reference 9 { typedef _Tp type; }; 10 11 template<typename _Tp> 12 struct remove_reference<_Tp&> 13 { typedef _Tp type; }; 14 15 template<typename _Tp> 16 struct remove_reference<_Tp&&> 17 { typedef _Tp type; }; 18 19 template<typename _Tp> 20 constexpr typename std::remove_reference<_Tp>::type&& 21 move(_Tp&& __t) noexcept 22 { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); } 23 } 24 25 struct X { 26 X f() && { 27 return std::move(*this); // { dg-bogus "redundant move in return statement" } 28 } 29 30 X f2() & { 31 return std::move(*this); // { dg-bogus "redundant move in return statement" } 32 } 33 34 X f3() { 35 return std::move(*this); // { dg-bogus "redundant move in return statement" } 36 } 37 }; 38 39 struct S { int i; int j; }; 40 41 struct Y { 42 S f1 (S s) { 43 return std::move (s); // { dg-warning "redundant move in return statement" } 44 } 45 46 S f2 (S* s) { 47 return std::move (*s); // { dg-bogus "redundant move in return statement" } 48 } 49 50 S f3 (S** s) { 51 return std::move (**s); // { dg-bogus "redundant move in return statement" } 52 } 53 }; 54