[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
This commit is contained in:
Matheus Izvekov
2025-06-26 17:30:43 -03:00
committed by GitHub
parent d699fbd203
commit a9ed84b618
2 changed files with 14 additions and 7 deletions

View File

@@ -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(),

View File

@@ -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