16a79f5aaSBruno Ricci // Test without serialization:
26a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
3*e560280cSBruno Ricci // RUN: 					 -ast-dump %s -ast-dump-filter test \
4*e560280cSBruno Ricci // RUN: | FileCheck -strict-whitespace --match-full-lines %s
56a79f5aaSBruno Ricci 
66a79f5aaSBruno Ricci // Test with serialization:
76a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
86a79f5aaSBruno Ricci // RUN:            -emit-pch -o %t %s
96a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
10*e560280cSBruno Ricci // RUN:            -x c++ -include-pch %t -ast-dump-all -ast-dump-filter test \
11*e560280cSBruno Ricci // RUN: | FileCheck -strict-whitespace --match-full-lines %s
126a79f5aaSBruno Ricci 
1305843dc6SBruno Ricci 
146a79f5aaSBruno Ricci 
156a79f5aaSBruno Ricci template <typename... Ts> void test(Ts... a) {
166a79f5aaSBruno Ricci   struct V {
176a79f5aaSBruno Ricci     void f() {
186a79f5aaSBruno Ricci       [this] {};
196a79f5aaSBruno Ricci       [*this] {};
206a79f5aaSBruno Ricci     }
216a79f5aaSBruno Ricci   };
226a79f5aaSBruno Ricci   int b, c;
236a79f5aaSBruno Ricci   []() {};
246a79f5aaSBruno Ricci   [](int a, ...) {};
256a79f5aaSBruno Ricci   [a...] {};
266a79f5aaSBruno Ricci   [=] {};
276a79f5aaSBruno Ricci   [=] { return b; };
286a79f5aaSBruno Ricci   [&] {};
296a79f5aaSBruno Ricci   [&] { return c; };
306a79f5aaSBruno Ricci   [b, &c] { return b + c; };
316a79f5aaSBruno Ricci   [a..., x = 12] {};
326a79f5aaSBruno Ricci   []() constexpr {};
336a79f5aaSBruno Ricci   []() mutable {};
346a79f5aaSBruno Ricci   []() noexcept {};
356a79f5aaSBruno Ricci   []() -> int { return 0; };
366a79f5aaSBruno Ricci }
37*e560280cSBruno Ricci // CHECK:Dumping test:
38*e560280cSBruno Ricci // CHECK-NEXT:FunctionTemplateDecl {{.*}} <{{.*}}ast-dump-lambda.cpp:15:1, line:36:1> line:15:32{{( imported)?}} test
396a79f5aaSBruno Ricci // CHECK-NEXT:|-TemplateTypeParmDecl {{.*}} <col:11, col:23> col:23{{( imported)?}} referenced typename depth 0 index 0 ... Ts
40*e560280cSBruno Ricci // CHECK-NEXT:`-FunctionDecl {{.*}} <col:27, line:36:1> line:15:32{{( imported)?}} test 'void (Ts...)'
416a79f5aaSBruno Ricci // CHECK-NEXT:  |-ParmVarDecl {{.*}} <col:37, col:43> col:43{{( imported)?}} referenced a 'Ts...' pack
42*e560280cSBruno Ricci // CHECK-NEXT:  `-CompoundStmt {{.*}} <col:46, line:36:1>
43*e560280cSBruno Ricci // CHECK-NEXT:    |-DeclStmt {{.*}} <line:16:3, line:21:4>
44*e560280cSBruno Ricci // CHECK-NEXT:    | `-CXXRecordDecl {{.*}} <line:16:3, line:21:3> line:16:10{{( imported)?}}{{( <undeserialized declarations>)?}} struct V definition
456a79f5aaSBruno Ricci // CHECK-NEXT:    |   |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
466a79f5aaSBruno Ricci // CHECK-NEXT:    |   | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr
476a79f5aaSBruno Ricci // CHECK-NEXT:    |   | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
486a79f5aaSBruno Ricci // CHECK-NEXT:    |   | |-MoveConstructor exists simple trivial needs_implicit
496a79f5aaSBruno Ricci // CHECK-NEXT:    |   | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param
506a79f5aaSBruno Ricci // CHECK-NEXT:    |   | |-MoveAssignment exists simple trivial needs_implicit
516a79f5aaSBruno Ricci // CHECK-NEXT:    |   | `-Destructor simple irrelevant trivial needs_implicit
526a79f5aaSBruno Ricci // CHECK-NEXT:    |   |-CXXRecordDecl {{.*}} <col:3, col:10> col:10{{( imported)?}} implicit struct V
53*e560280cSBruno Ricci // CHECK-NEXT:    |   `-CXXMethodDecl {{.*}} <line:17:5, line:20:5> line:17:10{{( imported)?}} f 'void ()'
54*e560280cSBruno Ricci // CHECK-NEXT:    |     `-CompoundStmt {{.*}} <col:14, line:20:5>
55*e560280cSBruno Ricci // CHECK-NEXT:    |       |-LambdaExpr {{.*}} <line:18:7, col:15> '(lambda at {{.*}}ast-dump-lambda.cpp:18:7)'
566a79f5aaSBruno Ricci // CHECK-NEXT:    |       | |-CXXRecordDecl {{.*}} <col:7> col:7{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
576a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
586a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | | |-DefaultConstructor
596a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
606a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | | |-MoveConstructor exists simple trivial needs_implicit
616a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
626a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | | |-MoveAssignment
636a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | | `-Destructor simple irrelevant trivial needs_implicit
646a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | |-CXXMethodDecl {{.*}} <col:12, col:15> col:7{{( imported)?}} operator() 'auto () const -> auto' inline
656a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | | `-CompoundStmt {{.*}} <col:14, col:15>
666a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'V *'
676a79f5aaSBruno Ricci // CHECK-NEXT:    |       | |-ParenListExpr {{.*}} <col:8> 'NULL TYPE'
686a79f5aaSBruno Ricci // CHECK-NEXT:    |       | | `-CXXThisExpr {{.*}} <col:8> 'V *' this
6905843dc6SBruno Ricci // CHECK-NEXT:    |       | `-CompoundStmt {{.*}} <col:14, col:15>
70*e560280cSBruno Ricci // CHECK-NEXT:    |       `-LambdaExpr {{.*}} <line:19:7, col:16> '(lambda at {{.*}}ast-dump-lambda.cpp:19:7)'
716a79f5aaSBruno Ricci // CHECK-NEXT:    |         |-CXXRecordDecl {{.*}} <col:7> col:7{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
726a79f5aaSBruno Ricci // CHECK-NEXT:    |         | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
736a79f5aaSBruno Ricci // CHECK-NEXT:    |         | | |-DefaultConstructor defaulted_is_constexpr
746a79f5aaSBruno Ricci // CHECK-NEXT:    |         | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
756a79f5aaSBruno Ricci // CHECK-NEXT:    |         | | |-MoveConstructor exists simple trivial needs_implicit
766a79f5aaSBruno Ricci // CHECK-NEXT:    |         | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
776a79f5aaSBruno Ricci // CHECK-NEXT:    |         | | |-MoveAssignment
786a79f5aaSBruno Ricci // CHECK-NEXT:    |         | | `-Destructor simple irrelevant trivial needs_implicit
796a79f5aaSBruno Ricci // CHECK-NEXT:    |         | |-CXXMethodDecl {{.*}} <col:13, col:16> col:7{{( imported)?}} operator() 'auto () const -> auto' inline
806a79f5aaSBruno Ricci // CHECK-NEXT:    |         | | `-CompoundStmt {{.*}} <col:15, col:16>
816a79f5aaSBruno Ricci // CHECK-NEXT:    |         | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'V'
826a79f5aaSBruno Ricci // CHECK-NEXT:    |         |-ParenListExpr {{.*}} <col:8> 'NULL TYPE'
836a79f5aaSBruno Ricci // CHECK-NEXT:    |         | `-UnaryOperator {{.*}} <col:8> '<dependent type>' prefix '*' cannot overflow
846a79f5aaSBruno Ricci // CHECK-NEXT:    |         |   `-CXXThisExpr {{.*}} <col:8> 'V *' this
8505843dc6SBruno Ricci // CHECK-NEXT:    |         `-CompoundStmt {{.*}} <col:15, col:16>
86*e560280cSBruno Ricci // CHECK-NEXT:    |-DeclStmt {{.*}} <line:22:3, col:11>
876a79f5aaSBruno Ricci // CHECK-NEXT:    | |-VarDecl {{.*}} <col:3, col:7> col:7{{( imported)?}} referenced b 'int'
886a79f5aaSBruno Ricci // CHECK-NEXT:    | `-VarDecl {{.*}} <col:3, col:10> col:10{{( imported)?}} referenced c 'int'
89*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:23:3, col:9> '(lambda at {{.*}}ast-dump-lambda.cpp:23:3)'
906a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
916a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
926a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor defaulted_is_constexpr
936a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
946a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
956a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
966a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
976a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
986a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXMethodDecl {{.*}} <col:6, col:9> col:3{{( imported)?}} operator() 'auto () const' inline
996a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-CompoundStmt {{.*}} <col:8, col:9>
1006a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXConversionDecl {{.*}} <col:3, col:9> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
1016a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-CXXMethodDecl {{.*}} <col:3, col:9> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline
10205843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:8, col:9>
103*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:24:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:24:3)'
1046a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1056a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
1066a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor defaulted_is_constexpr
1076a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1086a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
1096a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1106a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
1116a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
1126a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXMethodDecl {{.*}} <col:16, col:19> col:3{{( imported)?}} operator() 'auto (int, ...) const' inline
1136a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-ParmVarDecl {{.*}} <col:6, col:10> col:10{{( imported)?}} a 'int'
1146a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-CompoundStmt {{.*}} <col:18, col:19>
1156a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXConversionDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit constexpr operator auto (*)(int, ...) 'auto (*() const noexcept)(int, ...)' inline
1166a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-CXXMethodDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit __invoke 'auto (int, ...)' static inline
1176a79f5aaSBruno Ricci // CHECK-NEXT:    | |   `-ParmVarDecl {{.*}} <col:6, col:10> col:10{{( imported)?}} a 'int'
11805843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:18, col:19>
119*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:25:3, col:11> '(lambda at {{.*}}ast-dump-lambda.cpp:25:3)'
1206a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1216a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
1226a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor
1236a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1246a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
1256a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1266a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
1276a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
1286a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXMethodDecl {{.*}} <col:8, col:11> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
1296a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-CompoundStmt {{.*}} <col:10, col:11>
1306a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'Ts...'
1316a79f5aaSBruno Ricci // CHECK-NEXT:    | |-ParenListExpr {{.*}} <col:4> 'NULL TYPE'
1326f9fe31cSRichard Smith // CHECK-NEXT:    | | `-DeclRefExpr {{.*}} <col:4> 'Ts' lvalue ParmVar {{.*}} 'a' 'Ts...'
13305843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:10, col:11>
1346a79f5aaSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:26:3, col:8> '(lambda at {{.*}}ast-dump-lambda.cpp:26:3)'
1356a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1366a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
1376a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor defaulted_is_constexpr
1386a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1396a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
1406a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1416a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
1426a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
1436a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-CXXMethodDecl {{.*}} <col:5, col:8> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
1446a79f5aaSBruno Ricci // CHECK-NEXT:    | |   `-CompoundStmt {{.*}} <col:7, col:8>
14505843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:7, col:8>
1466a79f5aaSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:27:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:27:3)'
1476a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1486a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
1496a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor defaulted_is_constexpr
1506a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1516a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
1526a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1536a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
1546a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
1556a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-CXXMethodDecl {{.*}} <col:5, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
1566a79f5aaSBruno Ricci // CHECK-NEXT:    | |   `-CompoundStmt {{.*}} <col:7, col:19>
1576a79f5aaSBruno Ricci // CHECK-NEXT:    | |     `-ReturnStmt {{.*}} <col:9, col:16>
158*e560280cSBruno Ricci // CHECK-NEXT:    | |       `-DeclRefExpr {{.*}} <col:16> 'const int' lvalue Var {{.*}} 'b' 'int'
159*e560280cSBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:7, col:19>
160*e560280cSBruno Ricci // CHECK-NEXT:    |   `-ReturnStmt {{.*}} <col:9, col:16>
161*e560280cSBruno Ricci // CHECK-NEXT:    |     `-DeclRefExpr {{.*}} <col:16> 'const int' lvalue Var {{.*}} 'b' 'int'
162*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:28:3, col:8> '(lambda at {{.*}}ast-dump-lambda.cpp:28:3)'
163*e560280cSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
164*e560280cSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
165*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor defaulted_is_constexpr
166*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
167*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
168*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
169*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
170*e560280cSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
171*e560280cSBruno Ricci // CHECK-NEXT:    | | `-CXXMethodDecl {{.*}} <col:5, col:8> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
172*e560280cSBruno Ricci // CHECK-NEXT:    | |   `-CompoundStmt {{.*}} <col:7, col:8>
173*e560280cSBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:7, col:8>
174*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:29:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:29:3)'
175*e560280cSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
176*e560280cSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
177*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor defaulted_is_constexpr
178*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
179*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
180*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
181*e560280cSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
182*e560280cSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
183*e560280cSBruno Ricci // CHECK-NEXT:    | | `-CXXMethodDecl {{.*}} <col:5, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
184*e560280cSBruno Ricci // CHECK-NEXT:    | |   `-CompoundStmt {{.*}} <col:7, col:19>
185*e560280cSBruno Ricci // CHECK-NEXT:    | |     `-ReturnStmt {{.*}} <col:9, col:16>
1866a79f5aaSBruno Ricci // CHECK-NEXT:    | |       `-DeclRefExpr {{.*}} <col:16> 'int' lvalue Var {{.*}} 'c' 'int'
18705843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:7, col:19>
18805843dc6SBruno Ricci // CHECK-NEXT:    |   `-ReturnStmt {{.*}} <col:9, col:16>
18905843dc6SBruno Ricci // CHECK-NEXT:    |     `-DeclRefExpr {{.*}} <col:16> 'int' lvalue Var {{.*}} 'c' 'int'
190*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:30:3, col:27> '(lambda at {{.*}}ast-dump-lambda.cpp:30:3)'
1916a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1926a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda trivially_copyable literal can_const_default_init
1936a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor
1946a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1956a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
1966a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1976a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
1986a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
1996a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXMethodDecl {{.*}} <col:9, col:27> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
2006a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-CompoundStmt {{.*}} <col:11, col:27>
2016a79f5aaSBruno Ricci // CHECK-NEXT:    | | |   `-ReturnStmt {{.*}} <col:13, col:24>
2026a79f5aaSBruno Ricci // CHECK-NEXT:    | | |     `-BinaryOperator {{.*}} <col:20, col:24> 'int' '+'
2036a79f5aaSBruno Ricci // CHECK-NEXT:    | | |       |-ImplicitCastExpr {{.*}} <col:20> 'int' <LValueToRValue>
2046a79f5aaSBruno Ricci // CHECK-NEXT:    | | |       | `-DeclRefExpr {{.*}} <col:20> 'const int' lvalue Var {{.*}} 'b' 'int'
2056a79f5aaSBruno Ricci // CHECK-NEXT:    | | |       `-ImplicitCastExpr {{.*}} <col:24> 'int' <LValueToRValue>
2066a79f5aaSBruno Ricci // CHECK-NEXT:    | | |         `-DeclRefExpr {{.*}} <col:24> 'int' lvalue Var {{.*}} 'c' 'int'
2076a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'int'
2086a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'int &'
2096a79f5aaSBruno Ricci // CHECK-NEXT:    | |-ImplicitCastExpr {{.*}} <col:4> 'int' <LValueToRValue>
2106a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-DeclRefExpr {{.*}} <col:4> 'int' lvalue Var {{.*}} 'b' 'int'
2116a79f5aaSBruno Ricci // CHECK-NEXT:    | |-DeclRefExpr {{.*}} <col:8> 'int' lvalue Var {{.*}} 'c' 'int'
21205843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:11, col:27>
21305843dc6SBruno Ricci // CHECK-NEXT:    |   `-ReturnStmt {{.*}} <col:13, col:24>
21405843dc6SBruno Ricci // CHECK-NEXT:    |     `-BinaryOperator {{.*}} <col:20, col:24> 'int' '+'
21505843dc6SBruno Ricci // CHECK-NEXT:    |       |-ImplicitCastExpr {{.*}} <col:20> 'int' <LValueToRValue>
21605843dc6SBruno Ricci // CHECK-NEXT:    |       | `-DeclRefExpr {{.*}} <col:20> 'const int' lvalue Var {{.*}} 'b' 'int'
21705843dc6SBruno Ricci // CHECK-NEXT:    |       `-ImplicitCastExpr {{.*}} <col:24> 'int' <LValueToRValue>
21805843dc6SBruno Ricci // CHECK-NEXT:    |         `-DeclRefExpr {{.*}} <col:24> 'int' lvalue Var {{.*}} 'c' 'int'
219*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:31:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:31:3)'
2206a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2216a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
2226a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor
2236a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2246a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
2256a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2266a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
2276a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
2286a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXMethodDecl {{.*}} <col:16, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
2296a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-CompoundStmt {{.*}} <col:18, col:19>
2306a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'Ts...'
2316a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-FieldDecl {{.*}} <col:10> col:10{{( imported)?}} implicit 'int':'int'
2326a79f5aaSBruno Ricci // CHECK-NEXT:    | |-ParenListExpr {{.*}} <col:4> 'NULL TYPE'
2336f9fe31cSRichard Smith // CHECK-NEXT:    | | `-DeclRefExpr {{.*}} <col:4> 'Ts' lvalue ParmVar {{.*}} 'a' 'Ts...'
2346a79f5aaSBruno Ricci // CHECK-NEXT:    | |-IntegerLiteral {{.*}} <col:14> 'int' 12
23505843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:18, col:19>
236*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:32:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:32:3)'
2376a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2386a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
2396a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor defaulted_is_constexpr
2406a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2416a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
2426a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2436a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
2446a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
2456a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXMethodDecl {{.*}} <col:8, col:19> col:3{{( imported)?}} constexpr operator() 'auto () const' inline
2466a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-CompoundStmt {{.*}} <col:18, col:19>
2476a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXConversionDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
2486a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-CXXMethodDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline
24905843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:18, col:19>
250*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:33:3, col:17> '(lambda at {{.*}}ast-dump-lambda.cpp:33:3)'
2516a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2526a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
2536a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor defaulted_is_constexpr
2546a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2556a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
2566a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2576a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
2586a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
2596a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXMethodDecl {{.*}} <col:8, col:17> col:3{{( imported)?}} operator() 'auto ()' inline
2606a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-CompoundStmt {{.*}} <col:16, col:17>
2616a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXConversionDecl {{.*}} <col:3, col:17> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
2626a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-CXXMethodDecl {{.*}} <col:3, col:17> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline
26305843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:16, col:17>
264*e560280cSBruno Ricci // CHECK-NEXT:    |-LambdaExpr {{.*}} <line:34:3, col:18> '(lambda at {{.*}}ast-dump-lambda.cpp:34:3)'
2656a79f5aaSBruno Ricci // CHECK-NEXT:    | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2666a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
2676a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-DefaultConstructor defaulted_is_constexpr
2686a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2696a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveConstructor exists simple trivial needs_implicit
2706a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2716a79f5aaSBruno Ricci // CHECK-NEXT:    | | | |-MoveAssignment
2726a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-Destructor simple irrelevant trivial needs_implicit
2736a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXMethodDecl {{.*}} <col:8, col:18> col:3{{( imported)?}} operator() 'auto () const noexcept' inline
2746a79f5aaSBruno Ricci // CHECK-NEXT:    | | | `-CompoundStmt {{.*}} <col:17, col:18>
2756a79f5aaSBruno Ricci // CHECK-NEXT:    | | |-CXXConversionDecl {{.*}} <col:3, col:18> col:3{{( imported)?}} implicit constexpr operator auto (*)() noexcept 'auto (*() const noexcept)() noexcept' inline
2766a79f5aaSBruno Ricci // CHECK-NEXT:    | | `-CXXMethodDecl {{.*}} <col:3, col:18> col:3{{( imported)?}} implicit __invoke 'auto () noexcept' static inline
27705843dc6SBruno Ricci // CHECK-NEXT:    | `-CompoundStmt {{.*}} <col:17, col:18>
278*e560280cSBruno Ricci // CHECK-NEXT:    `-LambdaExpr {{.*}} <line:35:3, col:27> '(lambda at {{.*}}ast-dump-lambda.cpp:35:3)'
2796a79f5aaSBruno Ricci // CHECK-NEXT:      |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2806a79f5aaSBruno Ricci // CHECK-NEXT:      | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
2816a79f5aaSBruno Ricci // CHECK-NEXT:      | | |-DefaultConstructor defaulted_is_constexpr
2826a79f5aaSBruno Ricci // CHECK-NEXT:      | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2836a79f5aaSBruno Ricci // CHECK-NEXT:      | | |-MoveConstructor exists simple trivial needs_implicit
2846a79f5aaSBruno Ricci // CHECK-NEXT:      | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2856a79f5aaSBruno Ricci // CHECK-NEXT:      | | |-MoveAssignment
2866a79f5aaSBruno Ricci // CHECK-NEXT:      | | `-Destructor simple irrelevant trivial needs_implicit
2876a79f5aaSBruno Ricci // CHECK-NEXT:      | |-CXXMethodDecl {{.*}} <col:11, col:27> col:3{{( imported)?}} operator() 'auto () const -> int' inline
2886a79f5aaSBruno Ricci // CHECK-NEXT:      | | `-CompoundStmt {{.*}} <col:15, col:27>
2896a79f5aaSBruno Ricci // CHECK-NEXT:      | |   `-ReturnStmt {{.*}} <col:17, col:24>
2906a79f5aaSBruno Ricci // CHECK-NEXT:      | |     `-IntegerLiteral {{.*}} <col:24> 'int' 0
2916a79f5aaSBruno Ricci // CHECK-NEXT:      | |-CXXConversionDecl {{.*}} <col:3, col:27> col:3{{( imported)?}} implicit constexpr operator int (*)() 'auto (*() const noexcept)() -> int' inline
2926a79f5aaSBruno Ricci // CHECK-NEXT:      | `-CXXMethodDecl {{.*}} <col:3, col:27> col:3{{( imported)?}} implicit __invoke 'auto () -> int' static inline
29305843dc6SBruno Ricci // CHECK-NEXT:      `-CompoundStmt {{.*}} <col:15, col:27>
29405843dc6SBruno Ricci // CHECK-NEXT:        `-ReturnStmt {{.*}} <col:17, col:24>
29505843dc6SBruno Ricci // CHECK-NEXT:          `-IntegerLiteral {{.*}} <col:24> 'int' 0
296