Re-committed in r370850 for PR42843.
On Wed, Jun 26, 2019 at 11:16 PM Reid Kleckner via cfe-commits <[email protected]> wrote: > > Author: rnk > Date: Wed Jun 26 14:16:51 2019 > New Revision: 364476 > > URL: http://llvm.org/viewvc/llvm-project?rev=364476&view=rev > Log: > 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. > > 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=364476&r1=364475&r2=364476&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/ASTContext.cpp (original) > +++ cfe/trunk/lib/AST/ASTContext.cpp Wed Jun 26 14:16:51 2019 > @@ -9809,25 +9809,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=364475&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 > [email protected] > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
