diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 51bfca9da4231..5566057cccef8 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -2127,7 +2127,7 @@ static TemplateDeductionResult DeduceTemplateArgumentsByTypeMatch( TA = S.Context.getTypeDeclType(MPA->getMostRecentCXXRecordDecl()); } else { NestedNameSpecifier *QA = MPA->getQualifier(); - TA = QualType(QA->translateToType(S.Context), 0); + TA = QualType(QA->translateToType(S.Context), 0).getUnqualifiedType(); } assert(!TA.isNull() && "member pointer with non-type class"); return DeduceTemplateArgumentsByTypeMatch( diff --git a/clang/test/SemaCXX/member-pointer.cpp b/clang/test/SemaCXX/member-pointer.cpp index c94c26fbcbb28..6bb0686be7403 100644 --- a/clang/test/SemaCXX/member-pointer.cpp +++ b/clang/test/SemaCXX/member-pointer.cpp @@ -408,3 +408,25 @@ namespace deduction2 { void i() { e(&C::h); } }; } // namespace deduction2 + +namespace deduction_qualifiers { + struct A { + int v; + }; + using CA = const A; + + template void g(const T&, int T::*); + template void h(const T&, int CA::*); + + void test(const A a, A b) { + g(a, &A::v); + g(a, &CA::v); + h(a, &A::v); + h(a, &CA::v); + + g(b, &A::v); + g(b, &CA::v); + h(b, &A::v); + h(b, &CA::v); + } +} // namespace deduction_qualifiers