diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -2549,6 +2549,9 @@ /// list. static bool DependsOnTemplateParameters(QualType T, TemplateParameterList *Params) { + if (!Params->size()) + return false; + DependencyChecker Checker(Params, /*IgnoreNonTypeDependent*/false); Checker.TraverseType(T); return Checker.Match; diff --git a/clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp b/clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp --- a/clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp +++ b/clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp @@ -3,7 +3,7 @@ void f(T); template -struct A { }; +struct A { }; // expected-note{{template is declared here}} struct X { template<> friend void f(int); // expected-error{{in a friend}} @@ -12,3 +12,12 @@ friend void f(float); // okay friend class A; // okay }; + +struct PR41792 { + // expected-error@+1{{cannot declare an explicit specialization in a friend}} + template <> friend void f<>(int); + + // expected-error@+2{{template specialization declaration cannot be a friend}} + // expected-error@+1{{too few template arguments for class template 'A'}} + template <> friend class A<>; +};