[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:
@@ -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(),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user