https://github.com/mizvekov created 
https://github.com/llvm/llvm-project/pull/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

>From 42a533ecc54a72ca854b2c5986eb1279e06b64c8 Mon Sep 17 00:00:00 2001
From: Matheus Izvekov <mizve...@gmail.com>
Date: Thu, 26 Jun 2025 16:45:47 -0300
Subject: [PATCH] [clang] ms-abi: member pointer inheritance model lock-down
 fix

Lock down the inheritance model for member pointers even when converting to 
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
---
 clang/lib/Sema/SemaOverload.cpp                    | 14 +++++++-------
 .../CodeGenCXX/microsoft-abi-member-pointers.cpp   |  7 +++++++
 2 files changed, 14 insertions(+), 7 deletions(-)

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

Reply via email to