[PATCH] D26868: Sema: As of MSVC 2015, a user-declared move operation causes the deletion of both copy operations.

Peter Collingbourne via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 18 16:40:47 PST 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL287411: Sema: As of MSVC 2015, a user-declared move operation causes the deletion of… (authored by pcc).

Changed prior to commit:
  https://reviews.llvm.org/D26868?vs=78576&id=78603#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D26868

Files:
  cfe/trunk/lib/Sema/SemaDeclCXX.cpp
  cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp


Index: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp
@@ -6711,10 +6711,15 @@
       (CSM == CXXCopyConstructor || CSM == CXXCopyAssignment)) {
     CXXMethodDecl *UserDeclaredMove = nullptr;
 
-    // In Microsoft mode, a user-declared move only causes the deletion of the
-    // corresponding copy operation, not both copy operations.
+    // In Microsoft mode up to MSVC 2013, a user-declared move only causes the
+    // deletion of the corresponding copy operation, not both copy operations.
+    // MSVC 2015 has adopted the standards conforming behavior.
+    bool DeletesOnlyMatchingCopy =
+        getLangOpts().MSVCCompat &&
+        !getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015);
+
     if (RD->hasUserDeclaredMoveConstructor() &&
-        (!getLangOpts().MSVCCompat || CSM == CXXCopyConstructor)) {
+        (!DeletesOnlyMatchingCopy || CSM == CXXCopyConstructor)) {
       if (!Diagnose) return true;
 
       // Find any user-declared move constructor.
@@ -6726,7 +6731,7 @@
       }
       assert(UserDeclaredMove);
     } else if (RD->hasUserDeclaredMoveAssignment() &&
-               (!getLangOpts().MSVCCompat || CSM == CXXCopyAssignment)) {
+               (!DeletesOnlyMatchingCopy || CSM == CXXCopyAssignment)) {
       if (!Diagnose) return true;
 
       // Find any user-declared move assignment operator.
Index: cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp
===================================================================
--- cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp
+++ cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp
@@ -99,23 +99,39 @@
 namespace PR11826 {
   struct pair {
     pair(int v) { }
+#if _MSC_VER >= 1900
+    void operator=(pair&& rhs) { } // expected-note {{copy constructor is implicitly deleted because 'pair' has a user-declared move assignment operator}}
+#else
     void operator=(pair&& rhs) { }
+#endif
   };
   void f() {
     pair p0(3);
+#if _MSC_VER >= 1900
+    pair p = p0; // expected-error {{call to implicitly-deleted copy constructor of 'PR11826::pair'}}
+#else
     pair p = p0;
+#endif
   }
 }
 
 namespace PR11826_for_symmetry {
   struct pair {
     pair(int v) { }
+#if _MSC_VER >= 1900
+    pair(pair&& rhs) { } // expected-note {{copy assignment operator is implicitly deleted because 'pair' has a user-declared move constructor}}
+#else
     pair(pair&& rhs) { }
+#endif
   };
   void f() {
     pair p0(3);
     pair p(4);
+#if _MSC_VER >= 1900
+    p = p0; // expected-error {{object of type 'PR11826_for_symmetry::pair' cannot be assigned because its copy assignment operator is implicitly deleted}}
+#else
     p = p0;
+#endif
   }
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26868.78603.patch
Type: text/x-patch
Size: 2776 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161119/39e285bd/attachment-0001.bin>


More information about the cfe-commits mailing list