diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-07-17 23:36:49 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-07-17 23:36:49 +0000 |
commit | 6d1780cfb8d72f2434560262a30af8bb2ebf8420 (patch) | |
tree | 08ecd1a27bc1bdf95109693999a0c2781e95f8f1 /clang/lib | |
parent | dceaaadf5ca8cf77aa54f1287bf2f6509337111f (diff) | |
download | bcm5719-llvm-6d1780cfb8d72f2434560262a30af8bb2ebf8420.tar.gz bcm5719-llvm-6d1780cfb8d72f2434560262a30af8bb2ebf8420.zip |
[MS ABI] Explicit specialization of static data members are weak
Normally, explicit specializations are treated like strong external
definitions. However, MSVC treats explicit specializations of static
data members as weak. MSVC 2013's <regex> implementation has such an
explicit specialization which leads to clang emitting a strong
definition in each translation unit which includes it. Tweak clang's
linkage calculation to give such entities GVA_StrongODR linkage instead.
This fixes PR24165.
llvm-svn: 242592
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index fb9630180dc..61bd1077941 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -8285,9 +8285,13 @@ static GVALinkage basicGVALinkageForVariable(const ASTContext &Context, switch (VD->getTemplateSpecializationKind()) { case TSK_Undeclared: - case TSK_ExplicitSpecialization: return GVA_StrongExternal; + case TSK_ExplicitSpecialization: + return Context.getLangOpts().MSVCCompat && VD->isStaticDataMember() + ? GVA_StrongODR + : GVA_StrongExternal; + case TSK_ExplicitInstantiationDefinition: return GVA_StrongODR; |