| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -fobjc-arc -verify -fblocks -Wpessimizing-move -Wredundant-move %s |
| |
| // definitions for std::move |
| namespace std { |
| inline namespace foo { |
| template <class T> struct remove_reference { typedef T type; }; |
| template <class T> struct remove_reference<T&> { typedef T type; }; |
| template <class T> struct remove_reference<T&&> { typedef T type; }; |
| |
| template <class T> typename remove_reference<T>::type &&move(T &&t); |
| } |
| } |
| |
| class MoveOnly { |
| public: |
| MoveOnly() { } |
| MoveOnly(MoveOnly &&) = default; // expected-note 2 {{copy constructor is implicitly deleted}} |
| MoveOnly &operator=(MoveOnly &&) = default; |
| ~MoveOnly(); |
| }; |
| |
| void copyInit() { |
| __block MoveOnly temp; |
| MoveOnly temp2 = temp; // expected-error {{call to implicitly-deleted copy constructor of 'MoveOnly'}} |
| MoveOnly temp3 = std::move(temp); // ok |
| } |
| |
| MoveOnly errorOnCopy() { |
| __block MoveOnly temp; |
| return temp; // expected-error {{call to implicitly-deleted copy constructor of 'MoveOnly'}} |
| } |
| |
| MoveOnly dontWarnOnMove() { |
| __block MoveOnly temp; |
| return std::move(temp); // ok |
| } |
| |
| class MoveOnlySub : public MoveOnly {}; |
| |
| MoveOnly dontWarnOnMoveSubclass() { |
| __block MoveOnlySub temp; |
| return std::move(temp); // ok |
| } |