From b51a70396e5d99bec354085f7cf96d127988f37b Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Fri, 14 Sep 2018 15:18:30 +0000 Subject: [clang-cl] Fix PR38934: failing to dllexport class template member w/ explicit instantiation and PCH The code in ASTContext::DeclMustBeEmitted was supposed to handle this, but didn't take into account that synthesized members such as operator= might not get marked as template specializations, because they're synthesized on the instantiation directly when handling the class-level dllexport attribute. llvm-svn: 342240 --- clang/lib/AST/ASTContext.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'clang/lib/AST') diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index b107e8bd2a3..3d0d1e666cd 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -9724,6 +9724,14 @@ bool ASTContext::DeclMustBeEmitted(const Decl *D) { cast(D)->getTemplateSpecializationKind() == TSK_ExplicitInstantiationDefinition; + // Implicit member function definitions, such as operator= might not be + // marked as template specializations, since they're not coming from a + // template but synthesized directly on the class. + IsExpInstDef |= + isa(D) && + cast(D)->getParent()->getTemplateSpecializationKind() == + TSK_ExplicitInstantiationDefinition; + if (getExternalSource()->DeclIsFromPCHWithObjectFile(D) && !IsExpInstDef) return false; } -- cgit v1.2.3