Yes, but since it's only a CTP I don't think of it as a current version. It seems they haven't bumped the msc-ver number yet, so we can't really differentiate based on that.

Note that we still _export_ move operators, it's just that we don't rely on msvc to do the same. So this is compatible both ways, except that it breaks pointer equality of that operator.

 - Hans

On 06/11/2014 05:11 PM, David Majnemer wrote:
VS "14" does dllimport inline move-assignment operators.


On Wed, Jun 11, 2014 at 6:44 PM, Hans Wennborg <[email protected]
<mailto:[email protected]>> wrote:

    Author: hans
    Date: Wed Jun 11 17:44:39 2014
    New Revision: 210715

    URL: http://llvm.org/viewvc/llvm-project?rev=210715&view=rev
    Log:
    Don't inherit dllimport to inline move assignment operators

    Current MSVC versions don't have move assignment operators, so we
    can't rely on them being available in the dll. If we have the
    definition, we can just use that directly. This breaks pointer
    equality, but should work fine otherwise.

    When there is an MSVC version that supports move assignment,
    we can key this off the -fmsc-ver option.

    http://reviews.llvm.org/D4105

    Modified:
         cfe/trunk/lib/Sema/SemaDeclCXX.cpp
         cfe/trunk/test/CodeGenCXX/dllimport.cpp

    Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=210715&r1=210714&r2=210715&view=diff
    
==============================================================================
    --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
    +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Jun 11 17:44:39 2014
    @@ -4377,10 +4377,23 @@ static void checkDLLAttribute(Sema &S, C
        // specialization bases.

        for (Decl *Member : Class->decls()) {
    -    if (!isa<CXXMethodDecl>(Member) && !isa<VarDecl>(Member))
    +    VarDecl *VD = dyn_cast<VarDecl>(Member);
    +    CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Member);
    +
    +    // Only methods and static fields inherit the attributes.
    +    if (!VD && !MD)
    +      continue;
    +
    +    // Don't process deleted methods.
    +    if (MD && MD->isDeleted())
            continue;
    -    if (isa<CXXMethodDecl>(Member) &&
    cast<CXXMethodDecl>(Member)->isDeleted())
    +
    +    if (MD && MD->isMoveAssignmentOperator() && !ClassExported &&
    +        MD->isInlined()) {
    +      // Current MSVC versions don't export the move assignment
    operators, so
    +      // don't attempt to import them if we have a definition.
            continue;
    +    }

          if (InheritableAttr *MemberAttr = getDLLAttr(Member)) {
            if (S.Context.getTargetInfo().getCXXABI().isMicrosoft() &&

    Modified: cfe/trunk/test/CodeGenCXX/dllimport.cpp
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport.cpp?rev=210715&r1=210714&r2=210715&view=diff
    
==============================================================================
    --- cfe/trunk/test/CodeGenCXX/dllimport.cpp (original)
    +++ cfe/trunk/test/CodeGenCXX/dllimport.cpp Wed Jun 11 17:44:39 2014
    @@ -27,6 +27,8 @@ struct ExplicitSpec_NotImported {};
      #define USE(func) void UNIQ(use)() { func(); }
      #define USEMEMFUNC(class, func) void (class::*UNIQ(use)())() {
    return &class::func; }
      #define USECLASS(class) void UNIQ(USE)() { class x; }
    +#define USECOPYASSIGN(class) class& (class::*UNIQ(use)())(class&) {
    return &class::operator=; }
    +#define USEMOVEASSIGN(class) class& (class::*UNIQ(use)())(class&&)
    { return &class::operator=; }

      
//===----------------------------------------------------------------------===//
      // Globals
    @@ -518,9 +520,18 @@ struct __declspec(dllimport) T {

        static int b;
        // MO1-DAG: @"\01?b@T@@2HA" = external dllimport global i32
    +
    +  T& operator=(T&) = default;
    +  // MO1-DAG: define available_externally dllimport x86_thiscallcc
    nonnull %struct.T* @"\01??4T@@QAEAAU0@AAU0@@Z"
    +
    +  T& operator=(T&&) = default;
    +  // Note: Don't mark inline move operators dllimport because
    current MSVC versions don't export them.
    +  // MO1-DAG: define linkonce_odr x86_thiscallcc nonnull %struct.T*
    @"\01??4T@@QAEAAU0@$$QAU0@@Z"
      };
      USEMEMFUNC(T, a)
      USEVAR(T::b)
    +USECOPYASSIGN(T)
    +USEMOVEASSIGN(T)

      template <typename T> struct __declspec(dllimport) U { void foo()
    {} };
      // MO1-DAG: define available_externally dllimport x86_thiscallcc
    void @"\01?foo@?$U@H@@QAEXXZ"


    _______________________________________________
    cfe-commits mailing list
    [email protected] <mailto:[email protected]>
    http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to