c++: Extend -Wpessimizing-move for class prvalues [PR106276]
[official-gcc.git] / gcc / testsuite / g++.dg / cpp0x / Wpessimizing-move7.C
blobcd4eaa09aae56bfdb38f1d67d69841eb3d158484
1 // PR c++/106276
2 // { dg-do compile { target c++11 } }
3 // { dg-options "-Wpessimizing-move" }
5 // Define std::move.
6 namespace std {
7   template<typename _Tp>
8     struct remove_reference
9     { typedef _Tp   type; };
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); }
25 struct A { A(); A(const A&) = delete; A(A&&); };
26 struct B { B(A); };
28 static A foo ();
31 fn1 ()
33   return std::move (A{}); // { dg-warning "moving a temporary object in a return statement prevents copy elision" }
34   return std::move (A()); // { dg-warning "moving a temporary object in a return statement prevents copy elision" }
35   return std::move (foo ()); // { dg-warning "moving a temporary object in a return statement prevents copy elision" }
38 B fn2 ()
40   return std::move (A());
41   return std::move (A{});
42   return std::move (foo ());
45 template <typename T1, typename T2>
47 fn3 ()
49   return std::move (T2{}); // { dg-warning "moving a temporary object in a return statement prevents copy elision" }
52 void
53 do_fn3 ()
55   fn3<A, A>();
56   fn3<B, A>();
59 char take_buffer;
60 struct label_text {
61   label_text take() { return std::move(label_text(&take_buffer)); } // { dg-warning "moving a temporary object in a return statement prevents copy elision" }
62   label_text(char *);