1 | // RUN: %clang_cc1 -std=c++11 -fsyntax-only -fobjc-arc -verify -fblocks -Wpessimizing-move -Wredundant-move %s |
2 | |
3 | // definitions for std::move |
4 | namespace std { |
5 | inline namespace foo { |
6 | template <class T> struct remove_reference { typedef T type; }; |
7 | template <class T> struct remove_reference<T&> { typedef T type; }; |
8 | template <class T> struct remove_reference<T&&> { typedef T type; }; |
9 | |
10 | template <class T> typename remove_reference<T>::type &&move(T &&t); |
11 | } |
12 | } |
13 | |
14 | class MoveOnly { |
15 | public: |
16 | MoveOnly() { } |
17 | MoveOnly(MoveOnly &&) = default; // expected-note 2 {{copy constructor is implicitly deleted}} |
18 | MoveOnly &operator=(MoveOnly &&) = default; |
19 | ~MoveOnly(); |
20 | }; |
21 | |
22 | void copyInit() { |
23 | __block MoveOnly temp; |
24 | MoveOnly temp2 = temp; // expected-error {{call to implicitly-deleted copy constructor of 'MoveOnly'}} |
25 | MoveOnly temp3 = std::move(temp); // ok |
26 | } |
27 | |
28 | MoveOnly errorOnCopy() { |
29 | __block MoveOnly temp; |
30 | return temp; // expected-error {{call to implicitly-deleted copy constructor of 'MoveOnly'}} |
31 | } |
32 | |
33 | MoveOnly dontWarnOnMove() { |
34 | __block MoveOnly temp; |
35 | return std::move(temp); // ok |
36 | } |
37 | |
38 | class MoveOnlySub : public MoveOnly {}; |
39 | |
40 | MoveOnly dontWarnOnMoveSubclass() { |
41 | __block MoveOnlySub temp; |
42 | return std::move(temp); // ok |
43 | } |
44 | |