aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaLambda.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema/SemaLambda.cpp')
-rw-r--r--clang/lib/Sema/SemaLambda.cpp32
1 files changed, 27 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaLambda.cpp b/clang/lib/Sema/SemaLambda.cpp
index 26d3a66..5256d91 100644
--- a/clang/lib/Sema/SemaLambda.cpp
+++ b/clang/lib/Sema/SemaLambda.cpp
@@ -912,6 +912,17 @@ CXXMethodDecl *Sema::CreateLambdaCallOperator(SourceRange IntroducerRange,
return Method;
}
+void Sema::AddTemplateParametersToLambdaCallOperator(
+ CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
+ TemplateParameterList *TemplateParams) {
+ assert(TemplateParams && "no template parameters");
+ FunctionTemplateDecl *TemplateMethod = FunctionTemplateDecl::Create(
+ Context, Class, CallOperator->getLocation(), CallOperator->getDeclName(),
+ TemplateParams, CallOperator);
+ TemplateMethod->setAccess(AS_public);
+ CallOperator->setDescribedFunctionTemplate(TemplateMethod);
+}
+
void Sema::CompleteLambdaCallOperator(
CXXMethodDecl *Method, SourceLocation LambdaLoc,
SourceLocation CallOperatorLoc, Expr *TrailingRequiresClause,
@@ -930,11 +941,11 @@ void Sema::CompleteLambdaCallOperator(
DeclContext *DC = Method->getLexicalDeclContext();
Method->setLexicalDeclContext(LSI->Lambda);
if (TemplateParams) {
- FunctionTemplateDecl *TemplateMethod = FunctionTemplateDecl::Create(
- Context, LSI->Lambda, Method->getLocation(), Method->getDeclName(),
- TemplateParams, Method);
- TemplateMethod->setAccess(AS_public);
- Method->setDescribedFunctionTemplate(TemplateMethod);
+ FunctionTemplateDecl *TemplateMethod =
+ Method->getDescribedFunctionTemplate();
+ assert(TemplateMethod &&
+ "AddTemplateParametersToLambdaCallOperator should have been called");
+
LSI->Lambda->addDecl(TemplateMethod);
TemplateMethod->setLexicalDeclContext(DC);
} else {
@@ -1262,6 +1273,17 @@ void Sema::ActOnLambdaClosureParameters(
PushOnScopeChains(Param, LambdaScope, false);
}
+ // After the parameter list, we may parse a noexcept/requires/trailing return
+ // type which need to know whether the call operator constiture a dependent
+ // context, so we need to setup the FunctionTemplateDecl of generic lambdas
+ // now.
+ TemplateParameterList *TemplateParams =
+ getGenericLambdaTemplateParameterList(LSI, *this);
+ if (TemplateParams) {
+ AddTemplateParametersToLambdaCallOperator(LSI->CallOperator, LSI->Lambda,
+ TemplateParams);
+ LSI->Lambda->setLambdaIsGeneric(true);
+ }
LSI->AfterParameterList = true;
}