Author: arphaman Date: Tue Nov 7 13:40:11 2017 New Revision: 317620 URL: http://llvm.org/viewvc/llvm-project?rev=317620&view=rev Log: [ObjC++] Don't warn about pessimizing move for __block variables
rdar://33316951 Added: cfe/trunk/test/SemaObjCXX/block-variable-move.mm Modified: cfe/trunk/lib/Sema/SemaInit.cpp Modified: cfe/trunk/lib/Sema/SemaInit.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=317620&r1=317619&r2=317620&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaInit.cpp (original) +++ cfe/trunk/lib/Sema/SemaInit.cpp Tue Nov 7 13:40:11 2017 @@ -6422,6 +6422,10 @@ static void CheckMoveOnConstruction(Sema if (!VD || !VD->hasLocalStorage()) return; + // __block variables are not moved implicitly. + if (VD->hasAttr<BlocksAttr>()) + return; + QualType SourceType = VD->getType(); if (!SourceType->isRecordType()) return; Added: cfe/trunk/test/SemaObjCXX/block-variable-move.mm URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/block-variable-move.mm?rev=317620&view=auto ============================================================================== --- cfe/trunk/test/SemaObjCXX/block-variable-move.mm (added) +++ cfe/trunk/test/SemaObjCXX/block-variable-move.mm Tue Nov 7 13:40:11 2017 @@ -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 +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits