diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 1a98b3583185e..b76619fc50268 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -8968,8 +8968,10 @@ Sema::ActOnFinishConceptDefinition(Scope *S, ConceptDecl *C, Expr *ConstraintExpr, const ParsedAttributesView &Attrs) { assert(!C->hasDefinition() && "Concept already defined"); - if (DiagnoseUnexpandedParameterPack(ConstraintExpr)) + if (DiagnoseUnexpandedParameterPack(ConstraintExpr)) { + C->setInvalidDecl(); return nullptr; + } C->setDefinition(ConstraintExpr); ProcessDeclAttributeList(S, C, Attrs); diff --git a/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp b/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp index b02930e145700..6bf2f441e83c4 100644 --- a/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp +++ b/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp @@ -60,3 +60,17 @@ concept atomicish = requires() { }; atomicish f(); // expected-error {{expected 'auto' or 'decltype(auto)' after concept name}} } // namespace GH138820 + +namespace GH138823 { + template void foo(); + template + concept ConceptA = requires { foo(); }; + // expected-error@-1 {{expression contains unexpanded parameter pack 'Ts'}} + + template + concept ConceptB = ConceptA; + + template void bar(Foo); + + void test() { bar(1); } +}