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 f(T&, int); + template void f(T const&, U); + void g(int const& i) { f(i, 0); } // expected-error {{ambiguous}} + + template void f(T(&)[5], int); + template void f(T const(&)[5], U); + void g(int const(& a)[5]) { f(a, 0); } // expected-error {{ambiguous}} +}