Author: Matheus Izvekov
Date: 2025-06-26T17:30:43-03:00
New Revision: a9ed84b61808f208bfdd7fa3b96d7f8d3f8928bb

URL: 
https://github.com/llvm/llvm-project/commit/a9ed84b61808f208bfdd7fa3b96d7f8d3f8928bb
DIFF: 
https://github.com/llvm/llvm-project/commit/a9ed84b61808f208bfdd7fa3b96d7f8d3f8928bb.diff

LOG: [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

Added: 
    

Modified: 
    clang/lib/Sema/SemaOverload.cpp
    clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp

Removed: 
    


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