Skip to content

Commit 090f46d

Browse files
authored
[Clang] Fix an assertion in the resolution of perfect matches (#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
1 parent acdba28 commit 090f46d

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

clang/include/clang/Sema/Overload.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,14 @@ class Sema;
430430
if (!ReferenceBinding) {
431431
#ifndef NDEBUG
432432
auto Decay = [&](QualType T) {
433-
return (T->isArrayType() || T->isFunctionType()) ? C.getDecayedType(T)
434-
: T;
433+
if (T->isArrayType() || T->isFunctionType())
434+
T = C.getDecayedType(T);
435+
436+
// A function pointer type can be resolved to a member function type,
437+
// which is still an identity conversion.
438+
if (auto *N = T->getAs<MemberPointerType>())
439+
T = C.getDecayedType(N->getPointeeType());
440+
return T;
435441
};
436442
// The types might differ if there is an array-to-pointer conversion
437443
// an function-to-pointer conversion, or lvalue-to-rvalue conversion.

clang/test/SemaCXX/overload-resolution-deferred-templates.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -232,3 +232,22 @@ struct InitListAreNotPerfectCpy {
232232
};
233233

234234
InitListAreNotPerfectCpy InitListAreNotPerfectCpy_test({InitListAreNotPerfectCpy{}});
235+
236+
namespace PointerToMemFunc {
237+
template <typename>
238+
class A;
239+
struct N {
240+
template <typename T>
241+
void f(T);
242+
};
243+
template <typename T>
244+
struct E {
245+
template <class = A<int>>
246+
void g() = delete;
247+
void g(void (T::*)(char));
248+
};
249+
void f() {
250+
E<N> e;
251+
e.g(&N::f);
252+
}
253+
}

0 commit comments

Comments
 (0)