libstdc++: [_Hashtable] Fix some implementation inconsistencies
[official-gcc.git] / gcc / testsuite / g++.dg / cpp0x / Wpessimizing-move9.C
blob898040e6bfcf8a5261da350df95e559c7d6c8030
1 // PR c++/89780
2 // { dg-do compile { target c++11 } }
3 // { dg-options "-Wpessimizing-move -Wredundant-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 Dest {
26     Dest() = default;
27     Dest(Dest&&);
28     Dest(const Dest&);
30 struct Source : Dest {};
32 template <typename T>
33 Dest withMove() {
34   T x;
35   return std::move(x);
38 template Dest withMove<Dest>();
39 template Dest withMove<Source>();
41 template<typename T>
42 Dest bar () {
43   return std::move(T()); // { dg-warning "moving a temporary object prevents copy elision" }
46 template Dest bar<Dest>();
47 template Dest bar<Source>();
49 template<typename T>
50 Dest baz (T x) {
51   return std::move(x);
54 void
55 call_baz ()
57   Dest d;
58   Source s;
59   baz (d);
60   baz (s);
63 template<typename>
64 Dest foo ()
66   Dest d;
67   return std::move(d); // { dg-warning "moving a local object in a return statement prevents copy elision" }
70 template Dest foo<int>();
72 template<typename>
73 Dest qux () {
74   return std::move(Dest()); // { dg-warning "moving a temporary object prevents copy elision" }
77 template Dest qux<int>();
79 template<typename>
80 Dest qui (Dest x) {
81   return std::move(x); // { dg-warning "redundant move in return statement" }
84 void
85 call_qui ()
87   Dest d;
88   qui<int> (d);