Daily bump.
[gcc.git] / gcc / testsuite / g++.dg / cpp0x / Wredundant-move2.C
blob6e0aa4b02777367248a135e003e0ef021da20c07
1 // PR c++/87029
2 // { dg-do compile { target c++11 } }
3 // { dg-options "-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 T { };
26 struct U { U(T); };
28 template<typename Tp>
30 fn1 (T t)
32   // Non-dependent type.
33   return std::move (t); // { dg-warning "redundant move in return statement" }
36 template<typename Tp1, typename Tp2>
37 Tp1
38 fn2 (Tp2 t)
40   return std::move (t);
43 template<typename Tp1, typename Tp2>
44 Tp1
45 fn3 (Tp2 t)
47   return std::move (t);
50 int
51 main ()
53   T t;
54   fn1<T>(t);
55   fn2<T, T>(t);
56   fn3<U, T>(t);