summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-07-17 23:36:49 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-07-17 23:36:49 +0000
commit6d1780cfb8d72f2434560262a30af8bb2ebf8420 (patch)
tree08ecd1a27bc1bdf95109693999a0c2781e95f8f1 /clang/lib
parentdceaaadf5ca8cf77aa54f1287bf2f6509337111f (diff)
downloadbcm5719-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.cpp6
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;
OpenPOWER on IntegriCloud