https://github.com/knightXun updated https://github.com/llvm/llvm-project/pull/74885
>From 12cc1fe332fbab94c1368ea95374d5a1289a22f8 Mon Sep 17 00:00:00 2001 From: knightXun <badgangkil...@gmail.com> Date: Sat, 9 Dec 2023 04:57:15 +0800 Subject: [PATCH] [Clang][Sema] Check the number of lambda non-concept tempate parameters Check that the number of non-concept template parameters is greater than zero during lambda template instantiation to aviod panic Fix issue: https://github.com/llvm/llvm-project/issues/70601 --- .../include/clang/Basic/DiagnosticParseKinds.td | 2 ++ clang/lib/Sema/TreeTransform.h | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index 6150fc36430ab1..e46fa69d013b61 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -851,6 +851,8 @@ def err_friend_explicit_instantiation : Error< def err_explicit_instantiation_enum : Error< "enumerations cannot be explicitly instantiated">; def err_expected_template_parameter : Error<"expected template parameter">; +def err_expected_non_concept_template_parameter : Error< + "expected non-concept template parameter">; def err_empty_requires_expr : Error< "a requires expression must contain at least one requirement">; def err_requires_expr_parameter_list_ellipsis : Error< diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 1ad843d0bf4e0c..a140bbbc0c43d5 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13662,6 +13662,22 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { return ExprError(); } + // Check the number of the Concept template parameters + size_t conceptParams = 0; + for (auto P : *E->getTemplateParameterList()) { + const TemplateTypeParmDecl *CD = dyn_cast<TemplateTypeParmDecl>(P); + if (CD && CD->hasTypeConstraint()) { + conceptParams++; + } + } + + if (conceptParams > 0 && + conceptParams == E->getTemplateParameterList()->size()) { + getSema().Diag(E->getTemplateParameterList()->getLAngleLoc(), + diag::err_expected_non_concept_template_parameter); + return ExprError(); + } + // Copy the LSI before ActOnFinishFunctionBody removes it. // FIXME: This is dumb. Store the lambda information somewhere that outlives // the call operator. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits