Daily bump.
[gcc.git] / gcc / testsuite / g++.dg / cpp0x / Wredundant-move6.C
blob5808a78638eaef344b5145fa4455955b19298106
1 // PR c++/87882
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 Foo {
26    Foo Bar() {
27      return std::move(*this); // { dg-bogus "redundant move in return statement" }
28    }
29    Foo Baz() {
30      return *this;
31    }
32   int i;
35 void Move(Foo & f)
37   f = Foo{}.Bar();
40 void NoMove(Foo & f)
42   f = Foo{}.Baz();