Mordante created this revision. Mordante added reviewers: rjmccall, rsmith, aaron.ballman. Mordante added a project: clang. Mordante added a subscriber: rtrieu.
Fixes https://bugs.llvm.org/show_bug.cgi?id=41792 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D69481 Files: clang/lib/Sema/SemaTemplate.cpp clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp Index: clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp =================================================================== --- clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp +++ clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp @@ -3,7 +3,7 @@ void f(T); template<typename T> -struct A { }; +struct A { }; // expected-note{{template is declared here}} struct X { template<> friend void f<int>(int); // expected-error{{in a friend}} @@ -12,3 +12,12 @@ friend void f<float>(float); // okay friend class A<float>; // 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<>; +}; Index: clang/lib/Sema/SemaTemplate.cpp =================================================================== --- clang/lib/Sema/SemaTemplate.cpp +++ 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;
Index: clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp =================================================================== --- clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp +++ clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp @@ -3,7 +3,7 @@ void f(T); template<typename T> -struct A { }; +struct A { }; // expected-note{{template is declared here}} struct X { template<> friend void f<int>(int); // expected-error{{in a friend}} @@ -12,3 +12,12 @@ friend void f<float>(float); // okay friend class A<float>; // 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<>; +}; Index: clang/lib/Sema/SemaTemplate.cpp =================================================================== --- clang/lib/Sema/SemaTemplate.cpp +++ 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;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits