Author: hans Date: Wed Sep 25 04:09:46 2019 New Revision: 372844 URL: http://llvm.org/viewvc/llvm-project?rev=372844&view=rev Log: 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 Removed: cfe/trunk/test/CodeGenCXX/ms-constexpr-var-template.cpp Modified: cfe/trunk/lib/AST/ASTContext.cpp Modified: cfe/trunk/lib/AST/ASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=372844&r1=372843&r2=372844&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTContext.cpp (original) +++ cfe/trunk/lib/AST/ASTContext.cpp Wed Sep 25 04:09:46 2019 @@ -9915,25 +9915,10 @@ static GVALinkage basicGVALinkageForVari 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; Removed: cfe/trunk/test/CodeGenCXX/ms-constexpr-var-template.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ms-constexpr-var-template.cpp?rev=372843&view=auto ============================================================================== --- cfe/trunk/test/CodeGenCXX/ms-constexpr-var-template.cpp (original) +++ cfe/trunk/test/CodeGenCXX/ms-constexpr-var-template.cpp (removed) @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits