[clang] [Clang][Sema] Check the number of lambda non-concept tempate parameters (PR #74885)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 8 13:01:36 PST 2023
https://github.com/knightXun created https://github.com/llvm/llvm-project/pull/74885
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
>From 05588ae4cd3e0a55f946c9d109470afbfd91c1be Mon Sep 17 00:00:00 2001
From: knightXun <badgangkiller at 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
---
clang/include/clang/Basic/DiagnosticParseKinds.td | 2 ++
clang/lib/Sema/TreeTransform.h | 14 ++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 6150fc36430ab..e46fa69d013b6 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 1ad843d0bf4e0..110024a377128 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -13594,6 +13594,20 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
getSema().AddTemplateParametersToLambdaCallOperator(NewCallOperator, Class,
TPL);
+ // 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 == E->getTemplateParameterList()->size()) {
+ getSema().Diag(E->getTemplateParameterList()->getLAngleLoc(),
+ diag::err_expected_non_concept_template_parameter);
+ return ExprError();
+ }
// Transform the type of the original lambda's call operator.
// The transformation MUST be done in the CurrentInstantiationScope since
// it introduces a mapping of the original to the newly created
More information about the cfe-commits
mailing list