https://github.com/cor3ntin created https://github.com/llvm/llvm-project/pull/140073
Function pointers can have an identity conversion to a pointer to member function if they are resolved to a member function. Fix a regression introduced by #136203 >From 22b8404bbb1359762adfbe5bf526c141c257290d Mon Sep 17 00:00:00 2001 From: Corentin Jabot <corentinja...@gmail.com> Date: Thu, 15 May 2025 16:48:07 +0200 Subject: [PATCH] [Clang] Fix an assertion in the resolution of perfect matches Function pointers can have an identity conversion to a pointer to member function if they are resolved to a member function. Fix a regression introduced by #136203 --- clang/include/clang/Sema/Overload.h | 10 ++++++++-- ...overload-resolution-deferred-templates.cpp | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Sema/Overload.h b/clang/include/clang/Sema/Overload.h index 58452e159821a..f980c9d4a85df 100644 --- a/clang/include/clang/Sema/Overload.h +++ b/clang/include/clang/Sema/Overload.h @@ -430,8 +430,14 @@ class Sema; if (!ReferenceBinding) { #ifndef NDEBUG auto Decay = [&](QualType T) { - return (T->isArrayType() || T->isFunctionType()) ? C.getDecayedType(T) - : T; + T = (T->isArrayType() || T->isFunctionType()) ? C.getDecayedType(T) + : T; + + // A function pointer type can be resolved to a member function type, + // which is still an identity conversion. + if (auto *N = T->getAs<MemberPointerType>()) + T = C.getDecayedType(N->getPointeeType()); + return T; }; // The types might differ if there is an array-to-pointer conversion // an function-to-pointer conversion, or lvalue-to-rvalue conversion. diff --git a/clang/test/SemaCXX/overload-resolution-deferred-templates.cpp b/clang/test/SemaCXX/overload-resolution-deferred-templates.cpp index 277c5df3bb62b..d559fb23ca043 100644 --- a/clang/test/SemaCXX/overload-resolution-deferred-templates.cpp +++ b/clang/test/SemaCXX/overload-resolution-deferred-templates.cpp @@ -232,3 +232,22 @@ struct InitListAreNotPerfectCpy { }; InitListAreNotPerfectCpy InitListAreNotPerfectCpy_test({InitListAreNotPerfectCpy{}}); + +namespace PointerToMemFunc { +template <typename> +class A; +struct N { + template <typename T> + void f(T); +}; +template <typename T> +struct E { + template <class = A<int>> + void g() = delete; + void g(void (T::*)(char)); +}; +void f() { + E<N> e; + e.g(&N::f); +} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits