<div dir="ltr">VS "14" does dllimport inline move-assignment operators.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 11, 2014 at 6:44 PM, Hans Wennborg <span dir="ltr"><<a href="mailto:hans@hanshq.net" target="_blank">hans@hanshq.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: hans<br>
Date: Wed Jun 11 17:44:39 2014<br>
New Revision: 210715<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=210715&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=210715&view=rev</a><br>
Log:<br>
Don't inherit dllimport to inline move assignment operators<br>
<br>
Current MSVC versions don't have move assignment operators, so we<br>
can't rely on them being available in the dll. If we have the<br>
definition, we can just use that directly. This breaks pointer<br>
equality, but should work fine otherwise.<br>
<br>
When there is an MSVC version that supports move assignment,<br>
we can key this off the -fmsc-ver option.<br>
<br>
<a href="http://reviews.llvm.org/D4105" target="_blank">http://reviews.llvm.org/D4105</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
    cfe/trunk/test/CodeGenCXX/dllimport.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=210715&r1=210714&r2=210715&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=210715&r1=210714&r2=210715&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Jun 11 17:44:39 2014<br>
@@ -4377,10 +4377,23 @@ static void checkDLLAttribute(Sema &S, C<br>
   // specialization bases.<br>
<br>
   for (Decl *Member : Class->decls()) {<br>
-    if (!isa<CXXMethodDecl>(Member) && !isa<VarDecl>(Member))<br>
+    VarDecl *VD = dyn_cast<VarDecl>(Member);<br>
+    CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Member);<br>
+<br>
+    // Only methods and static fields inherit the attributes.<br>
+    if (!VD && !MD)<br>
+      continue;<br>
+<br>
+    // Don't process deleted methods.<br>
+    if (MD && MD->isDeleted())<br>
       continue;<br>
-    if (isa<CXXMethodDecl>(Member) && cast<CXXMethodDecl>(Member)->isDeleted())<br>
+<br>
+    if (MD && MD->isMoveAssignmentOperator() && !ClassExported &&<br>
+        MD->isInlined()) {<br>
+      // Current MSVC versions don't export the move assignment operators, so<br>
+      // don't attempt to import them if we have a definition.<br>
       continue;<br>
+    }<br>
<br>
     if (InheritableAttr *MemberAttr = getDLLAttr(Member)) {<br>
       if (S.Context.getTargetInfo().getCXXABI().isMicrosoft() &&<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/dllimport.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport.cpp?rev=210715&r1=210714&r2=210715&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport.cpp?rev=210715&r1=210714&r2=210715&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/dllimport.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/dllimport.cpp Wed Jun 11 17:44:39 2014<br>
@@ -27,6 +27,8 @@ struct ExplicitSpec_NotImported {};<br>
 #define USE(func) void UNIQ(use)() { func(); }<br>
 #define USEMEMFUNC(class, func) void (class::*UNIQ(use)())() { return &class::func; }<br>
 #define USECLASS(class) void UNIQ(USE)() { class x; }<br>
+#define USECOPYASSIGN(class) class& (class::*UNIQ(use)())(class&) { return &class::operator=; }<br>
+#define USEMOVEASSIGN(class) class& (class::*UNIQ(use)())(class&&) { return &class::operator=; }<br>
<br>
 //===----------------------------------------------------------------------===//<br>
 // Globals<br>
@@ -518,9 +520,18 @@ struct __declspec(dllimport) T {<br>
<br>
   static int b;<br>
   // MO1-DAG: @"\01?b@T@@2HA" = external dllimport global i32<br>
+<br>
+  T& operator=(T&) = default;<br>
+  // MO1-DAG: define available_externally dllimport x86_thiscallcc nonnull %struct.T* @"\01??4T@@QAEAAU0@AAU0@@Z"<br>
+<br>
+  T& operator=(T&&) = default;<br>
+  // Note: Don't mark inline move operators dllimport because current MSVC versions don't export them.<br>
+  // MO1-DAG: define linkonce_odr x86_thiscallcc nonnull %struct.T* @"\01??4T@@QAEAAU0@$$QAU0@@Z"<br>
 };<br>
 USEMEMFUNC(T, a)<br>
 USEVAR(T::b)<br>
+USECOPYASSIGN(T)<br>
+USEMOVEASSIGN(T)<br>
<br>
 template <typename T> struct __declspec(dllimport) U { void foo() {} };<br>
 // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?foo@?$U@H@@QAEXXZ"<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>