From: Reid Kleckner Date: Wed, 26 Jun 2019 21:16:51 +0000 (+0000) Subject: Revert r363191 "[MS] Pretend constexpr variable template specializations are inline" X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=48a13dc0a697c2f072dd607893135f5ad9712d36;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@364476 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index d7778a7196..db8e74ec94 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -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 . 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(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; diff --git a/test/CodeGenCXX/ms-constexpr-var-template.cpp b/test/CodeGenCXX/ms-constexpr-var-template.cpp deleted file mode 100644 index a40f7aacac..0000000000 --- a/test/CodeGenCXX/ms-constexpr-var-template.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// RUN: %clang_cc1 -emit-llvm -triple=x86_64-windows-msvc -fms-compatibility %s -o - | FileCheck %s - -template constexpr bool _Is_integer = false; -template <> constexpr bool _Is_integer = true; -template <> constexpr bool _Is_integer = false; -extern "C" const bool *escape = &_Is_integer; - -// CHECK: @"??$_Is_integer@H@@3_NB" = linkonce_odr dso_local constant i8 1, comdat, align 1 -// Should not emit _Is_integer, 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