1 // PR c++/86981 2 // { dg-do compile { target c++11 } } 3 // { dg-options "-Wpessimizing-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 T { }; 26 27 T 28 fn1 () 29 { 30 T t; 31 return (1, std::move (t)); 32 } 33 34 T 35 fn2 () 36 { 37 T t; 38 return [&](){ return std::move (t); }(); 39 } 40 41 T 42 fn3 () 43 { 44 T t; 45 return [=](){ return std::move (t); }(); 46 } 47