Skip to content

Commit a9ed84b

Browse files
authored
[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 #131966 There are no release notes, since the regression was never released. Fixes #144081
1 parent d699fbd commit a9ed84b

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

clang/lib/Sema/SemaOverload.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3613,20 +3613,20 @@ Sema::MemberPointerConversionResult Sema::CheckMemberPointerConversion(
36133613
QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind,
36143614
CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange,
36153615
bool IgnoreBaseAccess, MemberPointerConversionDirection Direction) {
3616-
const MemberPointerType *FromPtrType = FromType->getAs<MemberPointerType>();
3617-
if (!FromPtrType) {
3618-
// This must be a null pointer to member pointer conversion
3619-
Kind = CK_NullToMemberPointer;
3620-
return MemberPointerConversionResult::Success;
3621-
}
3622-
36233616
// Lock down the inheritance model right now in MS ABI, whether or not the
36243617
// pointee types are the same.
36253618
if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
36263619
(void)isCompleteType(CheckLoc, FromType);
36273620
(void)isCompleteType(CheckLoc, QualType(ToPtrType, 0));
36283621
}
36293622

3623+
const MemberPointerType *FromPtrType = FromType->getAs<MemberPointerType>();
3624+
if (!FromPtrType) {
3625+
// This must be a null pointer to member pointer conversion
3626+
Kind = CK_NullToMemberPointer;
3627+
return MemberPointerConversionResult::Success;
3628+
}
3629+
36303630
// T == T, modulo cv
36313631
if (Direction == MemberPointerConversionDirection::Upcast &&
36323632
!Context.hasSameUnqualifiedType(FromPtrType->getPointeeType(),

clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,3 +985,10 @@ namespace ContainerOf {
985985
return reinterpret_cast<Node*>(reinterpret_cast<char*>(list) - offset);
986986
}
987987
}
988+
989+
namespace GH144081 {
990+
struct A;
991+
template<int A::*> void f() {}
992+
template void f<nullptr>();
993+
// CHECK-LABEL: define{{.*}} void @"??$f@$0A@@GH144081@@YAXXZ"
994+
} // namespace GH144081

0 commit comments

Comments
 (0)