Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -4087,6 +4087,8 @@ def err_explicit_specialization_inconsistent_storage_class : Error< "explicit specialization has extraneous, inconsistent storage class " "'%select{none|extern|static|__private_extern__|auto|register}0'">; +def err_dependent_func_spec_does_not_specialize : Error< + "dependent function template specialization of unknown function">; // C++ class template specializations and out-of-line definitions def err_template_spec_needs_header : Error< Index: clang/lib/Sema/SemaTemplate.cpp =================================================================== --- clang/lib/Sema/SemaTemplate.cpp +++ clang/lib/Sema/SemaTemplate.cpp @@ -8023,8 +8023,10 @@ } F.done(); - // Should this be diagnosed here? - if (Previous.empty()) return true; + if (Previous.empty()) { + Diag(FD->getLocation(), diag::err_dependent_func_spec_does_not_specialize); + return true; + } FD->setDependentTemplateSpecialization(Context, Previous.asUnresolvedSet(), ExplicitTemplateArgs); Index: clang/test/CXX/temp/temp.decls/temp.friend/p1.cpp =================================================================== --- clang/test/CXX/temp/temp.decls/temp.friend/p1.cpp +++ clang/test/CXX/temp/temp.decls/temp.friend/p1.cpp @@ -359,3 +359,13 @@ template void f2(X *); template void f2(X *); // expected-note{{in instantiation of function template specialization 'PR10913::f2' requested here}} } + +namespace test16 { +namespace s { +template struct foo {}; +} +using s::foo; +template class A { + friend void foo<>(T); // expected-error{{dependent function template specialization of unknown function}} +}; +}