r367661 - Don't try emitting dllexported explicitly defaulted non-trivial ctors twice during explicit template instantiation definition (PR42857)

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 5 00:30:49 PDT 2019


Merged to release_90 in r367805.

On Fri, Aug 2, 2019 at 9:50 AM Hans Wennborg via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: hans
> Date: Fri Aug  2 00:51:41 2019
> New Revision: 367661
>
> URL: http://llvm.org/viewvc/llvm-project?rev=367661&view=rev
> Log:
> Don't try emitting dllexported explicitly defaulted non-trivial ctors twice during explicit template instantiation definition (PR42857)
>
> Trying to emit the definition twice triggers an assert.
>
> Differential revision: https://reviews.llvm.org/D65579
>
> Modified:
>     cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>     cfe/trunk/test/CodeGenCXX/dllexport.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=367661&r1=367660&r2=367661&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Fri Aug  2 00:51:41 2019
> @@ -11543,7 +11543,13 @@ void Sema::ActOnFinishCXXNonNestedClass(
>      std::swap(DelayedDllExportMemberFunctions, WorkList);
>      for (CXXMethodDecl *M : WorkList) {
>        DefineImplicitSpecialMember(*this, M, M->getLocation());
> -      ActOnFinishInlineFunctionDef(M);
> +
> +      // Pass the method to the consumer to get emitted. This is not necessary
> +      // for explicit instantiation definitions, as they will get emitted
> +      // anyway.
> +      if (M->getParent()->getTemplateSpecializationKind() !=
> +          TSK_ExplicitInstantiationDefinition)
> +        ActOnFinishInlineFunctionDef(M);
>      }
>    }
>  }
>
> Modified: cfe/trunk/test/CodeGenCXX/dllexport.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllexport.cpp?rev=367661&r1=367660&r2=367661&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/dllexport.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/dllexport.cpp Fri Aug  2 00:51:41 2019
> @@ -860,6 +860,13 @@ struct PR40006 {
>  };
>  // M32-DAG: define weak_odr dso_local dllexport x86_thiscallcc %"struct.InClassInits::PR40006"* @"??0PR40006 at InClassInits@@QAE at XZ"
>
> +// PR42857: Clang would try to emit the non-trivial explicitly defaulted
> +// dllexport ctor twice when doing an explicit instantiation definition.
> +struct Qux { Qux(); };
> +template <typename T> struct PR42857 { __declspec(dllexport) PR42857() = default; Qux q; };
> +template struct PR42857<int>;
> +// M32-DAG: define weak_odr dso_local dllexport x86_thiscallcc %"struct.InClassInits::PR42857"* @"??0?$PR42857 at H@InClassInits@@QAE at XZ"
> +
>  }
>
>  // We had an issue where instantiating A would force emission of B's delayed
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list