diff options
author | David L. Jones <dlj@google.com> | 2017-11-15 01:40:05 +0000 |
---|---|---|
committer | David L. Jones <dlj@google.com> | 2017-11-15 01:40:05 +0000 |
commit | fdfce82b87b73e18577d493e84bdabe2585b95d0 (patch) | |
tree | e8d9290e273dba03920bf15a8c7742fcf5ed0b87 /test/SemaObjCXX/block-variable-move.mm | |
parent | 41af1698c520ea38edf83e7c91f1e519d34f20c1 (diff) | |
parent | a7540887e8b5cb34ee28c12bef863bad85c65b6f (diff) |
Creating branches/google/testing and tags/google/testing/2017-11-14 from r317716upstream/google/testing
git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/google/testing@318248 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaObjCXX/block-variable-move.mm')
-rw-r--r-- | test/SemaObjCXX/block-variable-move.mm | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/test/SemaObjCXX/block-variable-move.mm b/test/SemaObjCXX/block-variable-move.mm new file mode 100644 index 0000000000..e26dffc5d0 --- /dev/null +++ b/test/SemaObjCXX/block-variable-move.mm @@ -0,0 +1,43 @@ +// 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 +} |