From 743461090a2027058cd438ed643ed5ed939cf1ca Mon Sep 17 00:00:00 2001 From: Mark de Wever Date: Tue, 5 Nov 2019 20:39:55 +0100 Subject: [PATCH] [Sema] Fixes templated friend member assertion Fixes PR41792: Clang assertion failure on templated friend member function Differential Revision: https://reviews.llvm.org/D69481 --- clang/lib/Sema/SemaTemplate.cpp | 3 +++ clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 3f2d386..a85fb6c 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -2549,6 +2549,9 @@ struct DependencyChecker : RecursiveASTVisitor { /// 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 index 86cdcf8..0283dba 100644 --- 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 @@ template 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 @@ struct X { 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<>; +}; -- 2.7.4