Merged to release_90 in r367805.
On Fri, Aug 2, 2019 at 9:50 AM Hans Wennborg via cfe-commits <cfe-commits@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@InClassInits@@QAE@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@H@InClassInits@@QAE@XZ" > + > } > > // We had an issue where instantiating A would force emission of B's delayed > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits