[clang] fixing -ast-print for variadic parameter pack in lambda capture

Summary:
currently for:
```
 template<typename ... T>
void f(T... t) {
  auto l = [t...]{};
}
```
`clang -ast-print file.cpp`
outputs:

```
template <typename ...T> void f(T ...t) {
    auto l = [t]         {
        }
;
}
```
notice that there is not `...` in the capture list of the lambda. this patch fixes this issue. and add test for it.

Patch by Tyker

Reviewers: rsmith

Reviewed By: rsmith

Subscribers: cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D61556

llvm-svn: 359980
This commit is contained in:
Nicolas Lesser 2019-05-05 12:35:12 +00:00
parent ee0571734f
commit 5125a02a03
2 changed files with 39 additions and 0 deletions

View File

@ -1895,6 +1895,9 @@ void StmtPrinter::VisitLambdaExpr(LambdaExpr *Node) {
llvm_unreachable("VLA type in explicit captures.");
}
if (C->isPackExpansion())
OS << "...";
if (Node->isInitCapture(C))
PrintExpr(C->getCapturedVar()->getInit());
}

View File

@ -0,0 +1,36 @@
// RUN: %clang_cc1 -ast-print -std=c++17 %s | FileCheck %s
struct S {
template<typename ... T>
void test1(int i, T... t) {
{
auto lambda = [i]{};
//CHECK: [i] {
}
{
auto lambda = [=]{};
//CHECK: [=] {
}
{
auto lambda = [&]{};
//CHECK: [&] {
}
{
auto lambda = [t..., i]{};
//CHECK: [t..., i] {
}
{
auto lambda = [&t...]{};
//CHECK: [&t...] {
}
{
auto lambda = [this, &t...]{};
//CHECK: [this, &t...] {
}
{
auto lambda = [t..., this]{};
//CHECK: [t..., this] {
}
}
};