2 // { dg-do compile { target c++11 } }
3 // { dg-options "-Wpessimizing-move -Wredundant-move" }
8 struct remove_reference
11 template<typename _Tp>
12 struct remove_reference<_Tp&>
13 { typedef _Tp type; };
15 template<typename _Tp>
16 struct remove_reference<_Tp&&>
17 { typedef _Tp type; };
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); }
30 struct Source : Dest {};
38 template Dest withMove<Dest>();
39 template Dest withMove<Source>();
43 return std::move(T()); // { dg-warning "moving a temporary object prevents copy elision" }
46 template Dest bar<Dest>();
47 template Dest bar<Source>();
67 return std::move(d); // { dg-warning "moving a local object in a return statement prevents copy elision" }
70 template Dest foo<int>();
74 return std::move(Dest()); // { dg-warning "moving a temporary object prevents copy elision" }
77 template Dest qux<int>();
81 return std::move(x); // { dg-warning "redundant move in return statement" }