Skip to content

Commit efa2833

Browse files
authored
[Clang] Fix a regression introduced by #140073 (#140288)
Pointer to data member don't decay, assuming they do caused an assertion failure.
1 parent 00c5cd8 commit efa2833

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

clang/include/clang/Sema/Overload.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,8 @@ class Sema;
435435

436436
// A function pointer type can be resolved to a member function type,
437437
// which is still an identity conversion.
438-
if (auto *N = T->getAs<MemberPointerType>())
438+
if (auto *N = T->getAs<MemberPointerType>();
439+
N && N->isMemberFunctionPointer())
439440
T = C.getDecayedType(N->getPointeeType());
440441
return T;
441442
};

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,3 +251,26 @@ void f() {
251251
e.g(&N::f);
252252
}
253253
}
254+
255+
#if __cplusplus >= 201402
256+
namespace PointerToMemData {
257+
struct N {
258+
int field;
259+
};
260+
template <typename It, typename T>
261+
struct B {
262+
B(It, T);
263+
template <typename It2>
264+
B(B<It2, T>);
265+
};
266+
template <typename T>
267+
struct C {
268+
auto g() { return B<int, T>(0, T{}); }
269+
};
270+
void f() {
271+
using T = decltype(C<decltype(&N::field)>{}.g());
272+
}
273+
274+
}
275+
276+
#endif

0 commit comments

Comments
 (0)