diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -9202,6 +9202,7 @@ << Name << RemoveRange << FixItHint::CreateRemoval(RemoveRange) << FixItHint::CreateInsertion(InsertLoc, "<>"); + Invalid = true; } } } else { diff --git a/clang/test/CXX/temp/temp.spec/temp.expl.spec/p20-2.cpp b/clang/test/CXX/temp/temp.spec/temp.expl.spec/p20-2.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CXX/temp/temp.spec/temp.expl.spec/p20-2.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +template +void f(T); + +template +struct A { + // expected-error@+1{{cannot declare an explicit specialization in a friend}} + template <> friend void f<>(int) {} +}; + +// Makes sure implicit instantiation here does not trigger +// the assertion "Member specialization must be an explicit specialization" +void foo(void) { + A a; +}