From f78dda92f5038f2bcb4aad369c9f07669a107613 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Fri, 11 Sep 2015 20:18:09 +0000 Subject: [PATCH] [MS ABI] Select an inheritance model in template arguments We used to only select an inheritance model if the pointer to member was nullptr. Instead, select a model regardless of the member pointer's value. N.B. This bug was exposed by making member pointers report true for isIncompleteType but has been latent since the member pointer scheme's inception. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247464 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaTemplate.cpp | 8 +++++--- test/CodeGenCXX/microsoft-abi-member-pointers.cpp | 11 +++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index b5b8b1ea8a..d658f7b470 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -4222,7 +4222,11 @@ isNullPointerValueTemplateArgument(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg) { if (Arg->isValueDependent() || Arg->isTypeDependent()) return NPV_NotNullPointer; - + + if (ParamType->isMemberPointerType()) + if (S.Context.getTargetInfo().getCXXABI().isMicrosoft()) + S.RequireCompleteType(Arg->getExprLoc(), ParamType, 0); + if (!S.getLangOpts().CPlusPlus11) return NPV_NotNullPointer; @@ -4670,8 +4674,6 @@ static bool CheckTemplateArgumentPointerToMember(Sema &S, S.Diag(Arg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null); Converted = TemplateArgument(S.Context.getCanonicalType(ParamType), /*isNullPtr*/true); - if (S.Context.getTargetInfo().getCXXABI().isMicrosoft()) - S.RequireCompleteType(Arg->getExprLoc(), ParamType, 0); return false; case NPV_NotNullPointer: break; diff --git a/test/CodeGenCXX/microsoft-abi-member-pointers.cpp b/test/CodeGenCXX/microsoft-abi-member-pointers.cpp index 5d120700c8..fd22c00342 100644 --- a/test/CodeGenCXX/microsoft-abi-member-pointers.cpp +++ b/test/CodeGenCXX/microsoft-abi-member-pointers.cpp @@ -768,3 +768,14 @@ bool g(int J::*&p, int J::*&q) { return p == q; } // CHECK-LABEL: @"\01?h@ReferenceToMPTWithIncompleteClass@@YAHAAPQK@1@H@Z"( int h(int K::*&p) { return k->*p; } } + +namespace PMFInTemplateArgument { +template +void JSMethod(); +class A { + int printd(int); + void printd(); +}; +void A::printd() { JSMethod(); } +// CHECK-LABEL: @"\01??$JSMethod@VA@PMFInTemplateArgument@@$1?printd@12@AAEHH@Z@PMFInTemplateArgument@@YAXXZ"( +} -- 2.50.1