r210715 - Don't inherit dllimport to inline move assignment operators
Hans Wennborg
hans at hanshq.net
Wed Jun 11 17:17:50 PDT 2014
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 <hans at hanshq.net
> <mailto:hans at hanshq.net>> 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 at T@@2HA" = external dllimport global i32
> +
> + T& operator=(T&) = default;
> + // MO1-DAG: define available_externally dllimport x86_thiscallcc
> nonnull %struct.T* @"\01??4T@@QAEAAU0 at 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 at H@@QAEXXZ"
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu <mailto:cfe-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
More information about the cfe-commits
mailing list