diff options
Diffstat (limited to 'clang/lib/CodeGen/CGVtable.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGVtable.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp index ca148da9560..ccbb10505e5 100644 --- a/clang/lib/CodeGen/CGVtable.cpp +++ b/clang/lib/CodeGen/CGVtable.cpp @@ -1501,16 +1501,31 @@ void CGVtableInfo::MaybeEmitVtable(GlobalDecl GD) { break; case TSK_ImplicitInstantiation: - case TSK_ExplicitInstantiationDeclaration: - // FIXME: could an explicit instantiation declaration imply - // available_externally linkage? case TSK_ExplicitInstantiationDefinition: Linkage = llvm::GlobalVariable::WeakODRLinkage; break; + + case TSK_ExplicitInstantiationDeclaration: + Linkage = llvm::GlobalVariable::AvailableExternallyLinkage; + break; } } - else + else if (KeyFunction) Linkage = llvm::GlobalVariable::WeakODRLinkage; + else { + switch (RD->getTemplateSpecializationKind()) { + case TSK_Undeclared: + case TSK_ExplicitSpecialization: + case TSK_ImplicitInstantiation: + case TSK_ExplicitInstantiationDefinition: + Linkage = llvm::GlobalVariable::WeakODRLinkage; + break; + + case TSK_ExplicitInstantiationDeclaration: + Linkage = llvm::GlobalVariable::AvailableExternallyLinkage; + break; + } + } // Emit the data. GenerateClassData(Linkage, RD); |