diff options
author | Hamza Sood <hamza_sood@me.com> | 2019-05-04 10:49:46 +0000 |
---|---|---|
committer | Hamza Sood <hamza_sood@me.com> | 2019-05-04 10:49:46 +0000 |
commit | 8205a814a691bfa62fed911b58b0a306ab5efe31 (patch) | |
tree | cbd4d43e2edb58be4b532986547b842cf2be207c /clang/lib/AST/DeclCXX.cpp | |
parent | 9c32fa1b1f60ea95e627a485b7a8e766ba3e622c (diff) | |
download | bcm5719-llvm-8205a814a691bfa62fed911b58b0a306ab5efe31.tar.gz bcm5719-llvm-8205a814a691bfa62fed911b58b0a306ab5efe31.zip |
[c++20] Implement P0428R2 - Familiar template syntax for generic lambdas
Differential Revision: https://reviews.llvm.org/D36527
llvm-svn: 359967
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
-rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 9946d16a858..b9ecdc65720 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -1421,13 +1421,30 @@ void CXXRecordDecl::getCaptureFields( TemplateParameterList * CXXRecordDecl::getGenericLambdaTemplateParameterList() const { - if (!isLambda()) return nullptr; + if (!isGenericLambda()) return nullptr; CXXMethodDecl *CallOp = getLambdaCallOperator(); if (FunctionTemplateDecl *Tmpl = CallOp->getDescribedFunctionTemplate()) return Tmpl->getTemplateParameters(); return nullptr; } +ArrayRef<NamedDecl *> +CXXRecordDecl::getLambdaExplicitTemplateParameters() const { + TemplateParameterList *List = getGenericLambdaTemplateParameterList(); + if (!List) + return {}; + + assert(std::is_partitioned(List->begin(), List->end(), + [](const NamedDecl *D) { return !D->isImplicit(); }) + && "Explicit template params should be ordered before implicit ones"); + + const auto ExplicitEnd = std::lower_bound(List->begin(), List->end(), false, + [](const NamedDecl *D, bool) { + return !D->isImplicit(); + }); + return llvm::makeArrayRef(List->begin(), ExplicitEnd); +} + Decl *CXXRecordDecl::getLambdaContextDecl() const { assert(isLambda() && "Not a lambda closure type!"); ExternalASTSource *Source = getParentASTContext().getExternalSource(); |