From 16669a73e170cb7807b61a01e1c3734d5d2ccd71 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Tue, 7 Nov 2017 21:40:11 +0000 Subject: [ObjC++] Don't warn about pessimizing move for __block variables rdar://33316951 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@317620 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaInit.cpp | 4 ++++ test/SemaObjCXX/block-variable-move.mm | 43 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 test/SemaObjCXX/block-variable-move.mm diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index dc7fe1d92b..5ece958ee6 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -6422,6 +6422,10 @@ static void CheckMoveOnConstruction(Sema &S, const Expr *InitExpr, if (!VD || !VD->hasLocalStorage()) return; + // __block variables are not moved implicitly. + if (VD->hasAttr()) + return; + QualType SourceType = VD->getType(); if (!SourceType->isRecordType()) return; 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 struct remove_reference { typedef T type; }; +template struct remove_reference { typedef T type; }; +template struct remove_reference { typedef T type; }; + +template typename remove_reference::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 +} -- cgit v1.2.1