summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ASTContext.cpp
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2019-09-25 11:09:46 +0000
committerHans Wennborg <hans@hanshq.net>2019-09-25 11:09:46 +0000
commit4bdd51332fa2d76058aea9dcbd1c3a8766542893 (patch)
tree6c10dbb59bf8d83f2ae6dc81012846b3564292e2 /clang/lib/AST/ASTContext.cpp
parent1d06d48bb3463632ed049284dacb3d1f6715d210 (diff)
downloadbcm5719-llvm-4bdd51332fa2d76058aea9dcbd1c3a8766542893.tar.gz
bcm5719-llvm-4bdd51332fa2d76058aea9dcbd1c3a8766542893.zip
Revert r370850 "Re-commit r363191 "[MS] Pretend constexpr variable template specializations are inline""
This work-around was necessary to handle standard library headers in Visual Studio 2019 16.2. Now that 16.3 has shipped to stable, we can remove it. > Re-commit r363191 "[MS] Pretend constexpr variable template specializations are inline" > > While the next Visual Studio update (16.3) will fix this issue, that hasn't > shipped yet. Until then Clang wouldn't work with MSVC's headers which seems > unfortunate. Let's keep this in until VS 16.3 ships. (See also PR42843.) > >> Fixes link errors with clang and the latest Visual C++ 14.21.27702 >> headers, which was reported as PR42027. >> >> I chose to intentionally make these things linkonce_odr, i.e. >> discardable, so that we don't emit definitions of these things in every >> translation unit that includes STL headers. >> >> Note that this is *not* what MSVC does: MSVC has not yet implemented C++ >> DR2387, so they emit fully specialized constexpr variable templates with >> static / internal linkage. >> >> Reviewers: rsmith >> >> Differential Revision: https://reviews.llvm.org/D63175 llvm-svn: 372844
Diffstat (limited to 'clang/lib/AST/ASTContext.cpp')
-rw-r--r--clang/lib/AST/ASTContext.cpp23
1 files changed, 4 insertions, 19 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 96d0659d3e7..091b2fe3462 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -9915,25 +9915,10 @@ static GVALinkage basicGVALinkageForVariable(const ASTContext &Context,
return StrongLinkage;
case TSK_ExplicitSpecialization:
- if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
- // If this is a fully specialized constexpr variable template, pretend it
- // was marked inline. MSVC 14.21.27702 headers define _Is_integral in a
- // header this way, and we don't want to emit non-discardable definitions
- // of these variables in every TU that includes <type_traits>. This
- // behavior is non-conforming, since another TU could use an extern
- // template declaration for this variable, but for constexpr variables,
- // it's unlikely for a user to want to do that. This behavior can be
- // removed if the headers change to explicitly mark such variable template
- // specializations inline.
- if (isa<VarTemplateSpecializationDecl>(VD) && VD->isConstexpr())
- return GVA_DiscardableODR;
-
- // Use ODR linkage for static data members of fully specialized templates
- // to prevent duplicate definition errors with MSVC.
- if (VD->isStaticDataMember())
- return GVA_StrongODR;
- }
- return StrongLinkage;
+ return Context.getTargetInfo().getCXXABI().isMicrosoft() &&
+ VD->isStaticDataMember()
+ ? GVA_StrongODR
+ : StrongLinkage;
case TSK_ExplicitInstantiationDefinition:
return GVA_StrongODR;
OpenPOWER on IntegriCloud