Index: clang/lib/Sema/SemaTemplateDeduction.cpp =================================================================== --- clang/lib/Sema/SemaTemplateDeduction.cpp +++ clang/lib/Sema/SemaTemplateDeduction.cpp @@ -1358,7 +1358,7 @@ if (ARef) A = A->getPointeeType(); - if (PRef && ARef && S.Context.hasSameUnqualifiedType(P, A)) { + if (PRef && ARef) { // C++11 [temp.deduct.partial]p9: // If, for a given type, deduction succeeds in both directions (i.e., // the types are identical after the transformations above) and both Index: clang/test/SemaCXX/overload-call.cpp =================================================================== --- clang/test/SemaCXX/overload-call.cpp +++ clang/test/SemaCXX/overload-call.cpp @@ -688,3 +688,13 @@ f(pmf); } } + +namespace PR54347 { + template void f1(T&, int); // expected-note {{candidate function}} + template void f1(T const&, U); // expected-note {{candidate function}} + void g1(int const& i) { f1(i, 0); } // expected-error {{ambiguous}} + + template void f2(T(&)[5], int); // expected-note {{candidate function}} + template void f2(T const(&)[5], U); // expected-note {{candidate function}} + void g2(int const(& a)[5]) { f2(a, 0); } // expected-error {{ambiguous}} +}