c++: prvalue of array type [PR111286]
[official-gcc.git] / gcc / testsuite / g++.dg / cpp0x / Wredundant-move5.C
blob0e2ec46d11e0689a5a1b680a9bb1160dcd572b55
1 // PR c++/88692
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 X {
26     X f() && {
27         return std::move(*this); // { dg-bogus "redundant move in return statement" }
28     }
30     X f2() & {
31         return std::move(*this); // { dg-bogus "redundant move in return statement" }
32     }
34     X f3() {
35         return std::move(*this); // { dg-bogus "redundant move in return statement" }
36     }
39 struct S { int i; int j; };
41 struct Y {
42   S f1 (S s) {
43     return std::move (s); // { dg-warning "redundant move in return statement" }
44   }
46   S f2 (S* s) {
47     return std::move (*s); // { dg-bogus "redundant move in return statement" }
48   }
50   S f3 (S** s) {
51     return std::move (**s); // { dg-bogus "redundant move in return statement" }
52   }