forked from OSchip/llvm-project
Revert r363191 "[MS] Pretend constexpr variable template specializations are inline"
The next Visual Studio update will fix this issue, and it doesn't make sense to implement this non-conforming behavior going forward. llvm-svn: 364476
This commit is contained in:
parent
d5f7196feb
commit
e6f2ff2c8d
|
@ -9809,25 +9809,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;
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
// RUN: %clang_cc1 -emit-llvm -triple=x86_64-windows-msvc -fms-compatibility %s -o - | FileCheck %s
|
||||
|
||||
template <typename> constexpr bool _Is_integer = false;
|
||||
template <> constexpr bool _Is_integer<int> = true;
|
||||
template <> constexpr bool _Is_integer<char> = false;
|
||||
extern "C" const bool *escape = &_Is_integer<int>;
|
||||
|
||||
// CHECK: @"??$_Is_integer@H@@3_NB" = linkonce_odr dso_local constant i8 1, comdat, align 1
|
||||
// Should not emit _Is_integer<char>, since it's not referenced.
|
||||
// CHECK-NOT: @"??$_Is_integer@D@@3_NB"
|
||||
// CHECK: @escape = dso_local global i8* @"??$_Is_integer@H@@3_NB", align 8
|
Loading…
Reference in New Issue