Author: Matheus Izvekov Date: 2025-06-26T17:30:43-03:00 New Revision: a9ed84b61808f208bfdd7fa3b96d7f8d3f8928bb
URL: https://github.com/llvm/llvm-project/commit/a9ed84b61808f208bfdd7fa3b96d7f8d3f8928bb DIFF: https://github.com/llvm/llvm-project/commit/a9ed84b61808f208bfdd7fa3b96d7f8d3f8928bb.diff LOG: [clang] ms-abi: member pointer inheritance model lock-down fix (#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 Added: Modified: clang/lib/Sema/SemaOverload.cpp clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp Removed: ################################################################################ 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