r317620 - [ObjC++] Don't warn about pessimizing move for __block variables

Alex Lorenz via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 7 13:40:12 PST 2017


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
+}




More information about the cfe-commits mailing list