https://github.com/mizvekov created https://github.com/llvm/llvm-project/pull/145958
Lock down the inheritance model for member pointers even when converting from nullptr. This fixes a regression introduced in https://github.com/llvm/llvm-project/pull/131966 There are no release notes, since the regression was never released. Fixes https://github.com/llvm/llvm-project/issues/144081 >From 42a533ecc54a72ca854b2c5986eb1279e06b64c8 Mon Sep 17 00:00:00 2001 From: Matheus Izvekov <mizve...@gmail.com> Date: Thu, 26 Jun 2025 16:45:47 -0300 Subject: [PATCH] [clang] ms-abi: member pointer inheritance model lock-down fix Lock down the inheritance model for member pointers even when converting to nullptr. This fixes a regression introduced in https://github.com/llvm/llvm-project/pull/131966 There are no release notes, since the regression was never released. Fixes https://github.com/llvm/llvm-project/issues/144081 --- clang/lib/Sema/SemaOverload.cpp | 14 +++++++------- .../CodeGenCXX/microsoft-abi-member-pointers.cpp | 7 +++++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index f5bdd903bcf5c..34f512b13d6a8 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -3613,13 +3613,6 @@ Sema::MemberPointerConversionResult Sema::CheckMemberPointerConversion( QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind, CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange, bool IgnoreBaseAccess, MemberPointerConversionDirection Direction) { - const MemberPointerType *FromPtrType = FromType->getAs<MemberPointerType>(); - if (!FromPtrType) { - // This must be a null pointer to member pointer conversion - Kind = CK_NullToMemberPointer; - return MemberPointerConversionResult::Success; - } - // Lock down the inheritance model right now in MS ABI, whether or not the // pointee types are the same. if (Context.getTargetInfo().getCXXABI().isMicrosoft()) { @@ -3627,6 +3620,13 @@ Sema::MemberPointerConversionResult Sema::CheckMemberPointerConversion( (void)isCompleteType(CheckLoc, QualType(ToPtrType, 0)); } + const MemberPointerType *FromPtrType = FromType->getAs<MemberPointerType>(); + if (!FromPtrType) { + // This must be a null pointer to member pointer conversion + Kind = CK_NullToMemberPointer; + return MemberPointerConversionResult::Success; + } + // T == T, modulo cv if (Direction == MemberPointerConversionDirection::Upcast && !Context.hasSameUnqualifiedType(FromPtrType->getPointeeType(), diff --git a/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp b/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp index fe4cab164249f..806bc5b63ef02 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp @@ -985,3 +985,10 @@ namespace ContainerOf { return reinterpret_cast<Node*>(reinterpret_cast<char*>(list) - offset); } } + +namespace GH144081 { + struct A; + template<int A::*> void f() {} + template void f<nullptr>(); + // CHECK-LABEL: define{{.*}} void @"??$f@$0A@@GH144081@@YAXXZ" +} // namespace GH144081 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits