[clang] [clang] ms-abi: member pointer inheritance model lock-down fix (PR #145958)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 26 13:02:20 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Matheus Izvekov (mizvekov)
<details>
<summary>Changes</summary>
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
---
Full diff: https://github.com/llvm/llvm-project/pull/145958.diff
2 Files Affected:
- (modified) clang/lib/Sema/SemaOverload.cpp (+7-7)
- (modified) clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp (+7)
``````````diff
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
``````````
</details>
https://github.com/llvm/llvm-project/pull/145958
More information about the cfe-commits
mailing list