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 1/7] [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 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..a140bbbc0c43d 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. >From e53ed4531d6918384be40de2b76bea558eac06ea Mon Sep 17 00:00:00 2001 From: knightXun <badgangkil...@gmail.com> Date: Sat, 9 Dec 2023 08:38:23 +0800 Subject: [PATCH 2/7] fix ut --- clang/lib/Sema/TreeTransform.h | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index a140bbbc0c43d..9fb426c1a044b 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13594,6 +13594,24 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { getSema().AddTemplateParametersToLambdaCallOperator(NewCallOperator, Class, TPL); + if (E->getTemplateParameterList()) { + // 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(); + } + } + // 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 @@ -13662,22 +13680,6 @@ 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. >From 7d2c8743d1e28342e3e6ac44424d789bba4e698b Mon Sep 17 00:00:00 2001 From: knightXun <badgangkil...@gmail.com> Date: Sat, 9 Dec 2023 21:40:36 +0800 Subject: [PATCH 3/7] fx --- clang/include/clang/Basic/DiagnosticParseKinds.td | 2 -- clang/lib/Sema/TreeTransform.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index e46fa69d013b6..6150fc36430ab 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -851,8 +851,6 @@ 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 9fb426c1a044b..82be2c800ff7a 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13606,8 +13606,6 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { if (conceptParams > 0 && conceptParams == E->getTemplateParameterList()->size()) { - getSema().Diag(E->getTemplateParameterList()->getLAngleLoc(), - diag::err_expected_non_concept_template_parameter); return ExprError(); } } >From 6680a4d1a47d69f37286268106919eafe34d61d9 Mon Sep 17 00:00:00 2001 From: knightXun <badgangkil...@gmail.com> Date: Sat, 9 Dec 2023 22:44:27 +0800 Subject: [PATCH 4/7] try -to fix --- clang/lib/Sema/TreeTransform.h | 51 ++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 82be2c800ff7a..005e174ea8b1c 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6439,6 +6439,25 @@ QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, Sema::ExpressionEvaluationContextRecord::EK_Decltype); + auto EE = T->getUnderlyingExpr(); + if (EE->isInstantiationDependent()) { + // Check the number of the Concept template parameters + size_t conceptParams = 0; + if (auto lambdaExpr = dyn_cast<LambdaExpr>(EE)) { + for (auto P : *lambdaExpr->getTemplateParameterList()) { + const TemplateTypeParmDecl *CD = dyn_cast<TemplateTypeParmDecl>(P); + if (CD && CD->hasTypeConstraint()) { + conceptParams++; + } + } + + if (conceptParams > 0 && + conceptParams == lambdaExpr->getTemplateParameterList()->size()) { + return QualType(); + } + } + } + ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); if (E.isInvalid()) return QualType(); @@ -13594,21 +13613,23 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { getSema().AddTemplateParametersToLambdaCallOperator(NewCallOperator, Class, TPL); - if (E->getTemplateParameterList()) { - // 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()) { - return ExprError(); - } - } + // if (E->getTemplateParameterList()) { + // // 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(); + // } + // } // Transform the type of the original lambda's call operator. // The transformation MUST be done in the CurrentInstantiationScope since >From 8f1365b8ef8137cf654b416f4945a70769c104ee Mon Sep 17 00:00:00 2001 From: knightXun <badgangkil...@gmail.com> Date: Sat, 9 Dec 2023 23:00:44 +0800 Subject: [PATCH 5/7] try -to fix --- clang/lib/Sema/TreeTransform.h | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 005e174ea8b1c..24470e5e689d9 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6444,16 +6444,18 @@ QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, // Check the number of the Concept template parameters size_t conceptParams = 0; if (auto lambdaExpr = dyn_cast<LambdaExpr>(EE)) { - for (auto P : *lambdaExpr->getTemplateParameterList()) { - const TemplateTypeParmDecl *CD = dyn_cast<TemplateTypeParmDecl>(P); - if (CD && CD->hasTypeConstraint()) { - conceptParams++; + if (lambdaExpr->getTemplateParameterList()) { + for (auto P : *lambdaExpr->getTemplateParameterList()) { + const TemplateTypeParmDecl *CD = dyn_cast<TemplateTypeParmDecl>(P); + if (CD && CD->hasTypeConstraint()) { + conceptParams++; + } } - } - if (conceptParams > 0 && - conceptParams == lambdaExpr->getTemplateParameterList()->size()) { - return QualType(); + if (conceptParams > 0 && + conceptParams == lambdaExpr->getTemplateParameterList()->size()) { + return QualType(); + } } } } >From a77a441334e01fc35ba7c64ca3012f2bd3bb33aa Mon Sep 17 00:00:00 2001 From: knightXun <badgangkil...@gmail.com> Date: Sun, 10 Dec 2023 01:07:54 +0800 Subject: [PATCH 6/7] try -to fix --- clang/lib/Sema/SemaTemplateDeduction.cpp | 18 +++++++++++ clang/lib/Sema/TreeTransform.h | 40 +++++++++++++----------- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 699e0985e595b..9180ab16fdbc6 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -3646,6 +3646,24 @@ Sema::TemplateDeductionResult Sema::FinishTemplateArgumentDeduction( if (CheckNonDependent()) return TDK_NonDependentConversionFailure; + if (FunctionTemplate->getTemplateParameters()) { + // Check the number of the Concept template parameters + size_t conceptParams = 0; + for (auto P : *FunctionTemplate->getTemplateParameters()) { + const TemplateTypeParmDecl *CD = dyn_cast<TemplateTypeParmDecl>(P); + if (CD && CD->hasTypeConstraint()) { + conceptParams++; + } + } + + if (conceptParams > 0 && + conceptParams == FunctionTemplate->getTemplateParameters()->size()) { + // getSema().Diag(E->getTemplateParameterList()->getLAngleLoc(), + // diag::err_expected_non_concept_template_parameter); + return TDK_SubstitutionFailure; + } + } + // Form the template argument list from the deduced template arguments. TemplateArgumentList *SugaredDeducedArgumentList = TemplateArgumentList::CreateCopy(Context, SugaredBuilder); diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 24470e5e689d9..e263cc1596c82 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6439,26 +6439,28 @@ QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, Sema::ExpressionEvaluationContextRecord::EK_Decltype); - auto EE = T->getUnderlyingExpr(); - if (EE->isInstantiationDependent()) { - // Check the number of the Concept template parameters - size_t conceptParams = 0; - if (auto lambdaExpr = dyn_cast<LambdaExpr>(EE)) { - if (lambdaExpr->getTemplateParameterList()) { - for (auto P : *lambdaExpr->getTemplateParameterList()) { - const TemplateTypeParmDecl *CD = dyn_cast<TemplateTypeParmDecl>(P); - if (CD && CD->hasTypeConstraint()) { - conceptParams++; - } - } + // while(auto EE = T->getUnderlyingExpr()){} + // if (EE->isInstantiationDependent()) { - if (conceptParams > 0 && - conceptParams == lambdaExpr->getTemplateParameterList()->size()) { - return QualType(); - } - } - } - } + // // Check the number of the Concept template parameters + // size_t conceptParams = 0; + // if (auto lambdaExpr = dyn_cast<LambdaExpr>(EE)) { + // if (lambdaExpr->getTemplateParameterList()) { + // for (auto P : *lambdaExpr->getTemplateParameterList()) { + // const TemplateTypeParmDecl *CD = dyn_cast<TemplateTypeParmDecl>(P); + // if (CD && CD->hasTypeConstraint()) { + // conceptParams++; + // } + // } + + // if (conceptParams > 0 && + // conceptParams == lambdaExpr->getTemplateParameterList()->size()) + // { + // return QualType(); + // } + // } + // } + // } ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); if (E.isInvalid()) >From b1915bd4c8c751831e7824234e6eabe87dd599b5 Mon Sep 17 00:00:00 2001 From: knightXun <badgangkil...@gmail.com> Date: Sun, 10 Dec 2023 02:08:45 +0800 Subject: [PATCH 7/7] try -to fix --- clang/lib/Sema/SemaTemplateDeduction.cpp | 34 +++++++++++------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 9180ab16fdbc6..cab0c1c74e4e2 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -3646,24 +3646,6 @@ Sema::TemplateDeductionResult Sema::FinishTemplateArgumentDeduction( if (CheckNonDependent()) return TDK_NonDependentConversionFailure; - if (FunctionTemplate->getTemplateParameters()) { - // Check the number of the Concept template parameters - size_t conceptParams = 0; - for (auto P : *FunctionTemplate->getTemplateParameters()) { - const TemplateTypeParmDecl *CD = dyn_cast<TemplateTypeParmDecl>(P); - if (CD && CD->hasTypeConstraint()) { - conceptParams++; - } - } - - if (conceptParams > 0 && - conceptParams == FunctionTemplate->getTemplateParameters()->size()) { - // getSema().Diag(E->getTemplateParameterList()->getLAngleLoc(), - // diag::err_expected_non_concept_template_parameter); - return TDK_SubstitutionFailure; - } - } - // Form the template argument list from the deduced template arguments. TemplateArgumentList *SugaredDeducedArgumentList = TemplateArgumentList::CreateCopy(Context, SugaredBuilder); @@ -3719,6 +3701,22 @@ Sema::TemplateDeductionResult Sema::FinishTemplateArgumentDeduction( return TDK_SubstitutionFailure; } + if (FunctionTemplate->getTemplateParameters()) { + // Check the number of the Concept template parameters + size_t conceptParams = 0; + for (auto P : *FunctionTemplate->getTemplateParameters()) { + const TemplateTypeParmDecl *CD = dyn_cast<TemplateTypeParmDecl>(P); + if (CD && CD->hasTypeConstraint()) { + conceptParams++; + } + } + + if (FunctionTemplate->getTemplateParameters()->size() - conceptParams != + Info.getNumExplicitArgs()) { + return TDK_SubstitutionFailure; + } + } + // C++2a [temp.deduct]p5 // [...] When all template arguments have been deduced [...] all uses of // template parameters [...] are replaced with the corresponding deduced _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits