1*6a79f5aaSBruno Ricci // Test without serialization:
2*6a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
3*6a79f5aaSBruno Ricci // RUN: 					 -ast-dump %s | FileCheck -strict-whitespace %s
4*6a79f5aaSBruno Ricci 
5*6a79f5aaSBruno Ricci // Test with serialization:
6*6a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
7*6a79f5aaSBruno Ricci // RUN:            -emit-pch -o %t %s
8*6a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
9*6a79f5aaSBruno Ricci // RUN:            -x c++ -include-pch %t -ast-dump-all | FileCheck -strict-whitespace %s
10*6a79f5aaSBruno Ricci 
11*6a79f5aaSBruno Ricci // XFAIL: *
12*6a79f5aaSBruno Ricci 
13*6a79f5aaSBruno Ricci template <typename... Ts> void test(Ts... a) {
14*6a79f5aaSBruno Ricci   struct V {
15*6a79f5aaSBruno Ricci     void f() {
16*6a79f5aaSBruno Ricci       [this] {};
17*6a79f5aaSBruno Ricci       [*this] {};
18*6a79f5aaSBruno Ricci     }
19*6a79f5aaSBruno Ricci   };
20*6a79f5aaSBruno Ricci   int b, c;
21*6a79f5aaSBruno Ricci   []() {};
22*6a79f5aaSBruno Ricci   [](int a, ...) {};
23*6a79f5aaSBruno Ricci   [a...] {};
24*6a79f5aaSBruno Ricci   [=] {};
25*6a79f5aaSBruno Ricci   [=] { return b; };
26*6a79f5aaSBruno Ricci   [&] {};
27*6a79f5aaSBruno Ricci   [&] { return c; };
28*6a79f5aaSBruno Ricci   [b, &c] { return b + c; };
29*6a79f5aaSBruno Ricci   [a..., x = 12] {};
30*6a79f5aaSBruno Ricci   []() constexpr {};
31*6a79f5aaSBruno Ricci   []() mutable {};
32*6a79f5aaSBruno Ricci   []() noexcept {};
33*6a79f5aaSBruno Ricci   []() -> int { return 0; };
34*6a79f5aaSBruno Ricci }
35*6a79f5aaSBruno Ricci // CHECK: TranslationUnitDecl {{.*}} <<invalid sloc>> <invalid sloc>{{( <undeserialized declarations>)?}}
36*6a79f5aaSBruno Ricci // CHECK: `-FunctionTemplateDecl {{.*}} <{{.*}}ast-dump-lambda.cpp:13:1, line:34:1> line:13:32{{( imported)?}} test
37*6a79f5aaSBruno Ricci // CHECK-NEXT:   |-TemplateTypeParmDecl {{.*}} <col:11, col:23> col:23{{( imported)?}} referenced typename depth 0 index 0 ... Ts
38*6a79f5aaSBruno Ricci // CHECK-NEXT:   `-FunctionDecl {{.*}} <col:27, line:34:1> line:13:32{{( imported)?}} test 'void (Ts...)'
39*6a79f5aaSBruno Ricci // CHECK-NEXT:     |-ParmVarDecl {{.*}} <col:37, col:43> col:43{{( imported)?}} referenced a 'Ts...' pack
40*6a79f5aaSBruno Ricci // CHECK-NEXT:     `-CompoundStmt {{.*}} <col:46, line:34:1>
41*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-DeclStmt {{.*}} <line:14:3, line:19:4>
42*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-CXXRecordDecl {{.*}} <line:14:3, line:19:3> line:14:10{{( imported)?}}{{( <undeserialized declarations>)?}} struct V definition
43*6a79f5aaSBruno Ricci // CHECK-NEXT:       |   |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
44*6a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr
45*6a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
46*6a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-MoveConstructor exists simple trivial needs_implicit
47*6a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param
48*6a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-MoveAssignment exists simple trivial needs_implicit
49*6a79f5aaSBruno Ricci // CHECK-NEXT:       |   | `-Destructor simple irrelevant trivial needs_implicit
50*6a79f5aaSBruno Ricci // CHECK-NEXT:       |   |-CXXRecordDecl {{.*}} <col:3, col:10> col:10{{( imported)?}} implicit struct V
51*6a79f5aaSBruno Ricci // CHECK-NEXT:       |   `-CXXMethodDecl {{.*}} <line:15:5, line:18:5> line:15:10{{( imported)?}} f 'void ()'
52*6a79f5aaSBruno Ricci // CHECK-NEXT:       |     `-CompoundStmt {{.*}} <col:14, line:18:5>
53*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       |-LambdaExpr {{.*}} <line:16:7, col:15> '(lambda at {{.*}}ast-dump-lambda.cpp:16:7)'
54*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | |-CXXRecordDecl {{.*}} <col:7> col:7{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
55*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
56*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-DefaultConstructor
57*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
58*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-MoveConstructor exists simple trivial needs_implicit
59*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
60*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-MoveAssignment
61*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | `-Destructor simple irrelevant trivial needs_implicit
62*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | |-CXXMethodDecl {{.*}} <col:12, col:15> col:7{{( imported)?}} operator() 'auto () const -> auto' inline
63*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | `-CompoundStmt {{.*}} <col:14, col:15>
64*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'V *'
65*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | |-ParenListExpr {{.*}} <col:8> 'NULL TYPE'
66*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | `-CXXThisExpr {{.*}} <col:8> 'V *' this
67*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       | `-<<<NULL>>>
68*6a79f5aaSBruno Ricci // CHECK-NEXT:       |       `-LambdaExpr {{.*}} <line:17:7, col:16> '(lambda at {{.*}}ast-dump-lambda.cpp:17:7)'
69*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         |-CXXRecordDecl {{.*}} <col:7> col:7{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
70*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
71*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-DefaultConstructor defaulted_is_constexpr
72*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
73*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-MoveConstructor exists simple trivial needs_implicit
74*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
75*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-MoveAssignment
76*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | `-Destructor simple irrelevant trivial needs_implicit
77*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | |-CXXMethodDecl {{.*}} <col:13, col:16> col:7{{( imported)?}} operator() 'auto () const -> auto' inline
78*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | `-CompoundStmt {{.*}} <col:15, col:16>
79*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'V'
80*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         |-ParenListExpr {{.*}} <col:8> 'NULL TYPE'
81*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         | `-UnaryOperator {{.*}} <col:8> '<dependent type>' prefix '*' cannot overflow
82*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         |   `-CXXThisExpr {{.*}} <col:8> 'V *' this
83*6a79f5aaSBruno Ricci // CHECK-NEXT:       |         `-<<<NULL>>>
84*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-DeclStmt {{.*}} <line:20:3, col:11>
85*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-VarDecl {{.*}} <col:3, col:7> col:7{{( imported)?}} referenced b 'int'
86*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-VarDecl {{.*}} <col:3, col:10> col:10{{( imported)?}} referenced c 'int'
87*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:21:3, col:9> '(lambda at {{.*}}ast-dump-lambda.cpp:21:3)'
88*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
89*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
90*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
91*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
92*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
93*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
94*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
95*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
96*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:6, col:9> col:3{{( imported)?}} operator() 'auto () const' inline
97*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:8, col:9>
98*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:9> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
99*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:9> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline
100*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
101*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:22:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:22:3)'
102*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
103*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
104*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
105*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
106*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
107*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
108*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
109*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
110*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:16, col:19> col:3{{( imported)?}} operator() 'auto (int, ...) const' inline
111*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-ParmVarDecl {{.*}} <col:6, col:10> col:10{{( imported)?}} a 'int'
112*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:18, col:19>
113*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit constexpr operator auto (*)(int, ...) 'auto (*() const noexcept)(int, ...)' inline
114*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit __invoke 'auto (int, ...)' static inline
115*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-ParmVarDecl {{.*}} <col:6, col:10> col:10{{( imported)?}} a 'int'
116*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
117*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:23:3, col:11> '(lambda at {{.*}}ast-dump-lambda.cpp:23:3)'
118*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
119*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
120*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor
121*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
122*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
123*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
124*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
125*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
126*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:8, col:11> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
127*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:10, col:11>
128*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'Ts...'
129*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-ParenListExpr {{.*}} <col:4> 'NULL TYPE'
130*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-DeclRefExpr {{.*}} <col:4> 'Ts...' lvalue ParmVar {{.*}} 'a' 'Ts...'
131*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
132*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:24:3, col:8> '(lambda at {{.*}}ast-dump-lambda.cpp:24:3)'
133*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
134*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
135*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
136*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
137*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
138*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
139*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
140*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
141*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:5, col:8> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
142*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-CompoundStmt {{.*}} <col:7, col:8>
143*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
144*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:25:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:25:3)'
145*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
146*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
147*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
148*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
149*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
150*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
151*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
152*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
153*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:5, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
154*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-CompoundStmt {{.*}} <col:7, col:19>
155*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |     `-ReturnStmt {{.*}} <col:9, col:16>
156*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |       `-DeclRefExpr {{.*}} <col:16> 'const int' lvalue Var {{.*}} 'b' 'int'
157*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
158*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:26:3, col:8> '(lambda at {{.*}}ast-dump-lambda.cpp:26:3)'
159*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
160*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
161*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
162*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
163*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
164*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
165*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
166*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
167*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:5, col:8> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
168*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-CompoundStmt {{.*}} <col:7, col:8>
169*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
170*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:27:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:27:3)'
171*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
172*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
173*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
174*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
175*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
176*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
177*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
178*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
179*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:5, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
180*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-CompoundStmt {{.*}} <col:7, col:19>
181*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |     `-ReturnStmt {{.*}} <col:9, col:16>
182*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |       `-DeclRefExpr {{.*}} <col:16> 'int' lvalue Var {{.*}} 'c' 'int'
183*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
184*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:28:3, col:27> '(lambda at {{.*}}ast-dump-lambda.cpp:28:3)'
185*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
186*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda trivially_copyable literal can_const_default_init
187*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor
188*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
189*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
190*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
191*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
192*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
193*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:9, col:27> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
194*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:11, col:27>
195*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |   `-ReturnStmt {{.*}} <col:13, col:24>
196*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |     `-BinaryOperator {{.*}} <col:20, col:24> 'int' '+'
197*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |       |-ImplicitCastExpr {{.*}} <col:20> 'int' <LValueToRValue>
198*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |       | `-DeclRefExpr {{.*}} <col:20> 'const int' lvalue Var {{.*}} 'b' 'int'
199*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |       `-ImplicitCastExpr {{.*}} <col:24> 'int' <LValueToRValue>
200*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |         `-DeclRefExpr {{.*}} <col:24> 'int' lvalue Var {{.*}} 'c' 'int'
201*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'int'
202*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'int &'
203*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-ImplicitCastExpr {{.*}} <col:4> 'int' <LValueToRValue>
204*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-DeclRefExpr {{.*}} <col:4> 'int' lvalue Var {{.*}} 'b' 'int'
205*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-DeclRefExpr {{.*}} <col:8> 'int' lvalue Var {{.*}} 'c' 'int'
206*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
207*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:29:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:29:3)'
208*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
209*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
210*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor
211*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
212*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
213*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
214*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
215*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
216*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:16, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
217*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:18, col:19>
218*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'Ts...'
219*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-FieldDecl {{.*}} <col:10> col:10{{( imported)?}} implicit 'int':'int'
220*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-ParenListExpr {{.*}} <col:4> 'NULL TYPE'
221*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-DeclRefExpr {{.*}} <col:4> 'Ts...' lvalue ParmVar {{.*}} 'a' 'Ts...'
222*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-IntegerLiteral {{.*}} <col:14> 'int' 12
223*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
224*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:30:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:30:3)'
225*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
226*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
227*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
228*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
229*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
230*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
231*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
232*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
233*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:8, col:19> col:3{{( imported)?}} constexpr operator() 'auto () const' inline
234*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:18, col:19>
235*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
236*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline
237*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
238*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:31:3, col:17> '(lambda at {{.*}}ast-dump-lambda.cpp:31:3)'
239*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
240*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
241*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
242*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
243*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
244*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
245*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
246*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
247*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:8, col:17> col:3{{( imported)?}} operator() 'auto ()' inline
248*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:16, col:17>
249*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:17> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
250*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:17> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline
251*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
252*6a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:32:3, col:18> '(lambda at {{.*}}ast-dump-lambda.cpp:32:3)'
253*6a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
254*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
255*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
256*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
257*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
258*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
259*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
260*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
261*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:8, col:18> col:3{{( imported)?}} operator() 'auto () const noexcept' inline
262*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:17, col:18>
263*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:18> col:3{{( imported)?}} implicit constexpr operator auto (*)() noexcept 'auto (*() const noexcept)() noexcept' inline
264*6a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:18> col:3{{( imported)?}} implicit __invoke 'auto () noexcept' static inline
265*6a79f5aaSBruno Ricci // CHECK-NEXT:       | `-<<<NULL>>>
266*6a79f5aaSBruno Ricci // CHECK-NEXT:       `-LambdaExpr {{.*}} <line:33:3, col:27> '(lambda at {{.*}}ast-dump-lambda.cpp:33:3)'
267*6a79f5aaSBruno Ricci // CHECK-NEXT:         |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
268*6a79f5aaSBruno Ricci // CHECK-NEXT:         | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
269*6a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-DefaultConstructor defaulted_is_constexpr
270*6a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
271*6a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-MoveConstructor exists simple trivial needs_implicit
272*6a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
273*6a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-MoveAssignment
274*6a79f5aaSBruno Ricci // CHECK-NEXT:         | | `-Destructor simple irrelevant trivial needs_implicit
275*6a79f5aaSBruno Ricci // CHECK-NEXT:         | |-CXXMethodDecl {{.*}} <col:11, col:27> col:3{{( imported)?}} operator() 'auto () const -> int' inline
276*6a79f5aaSBruno Ricci // CHECK-NEXT:         | | `-CompoundStmt {{.*}} <col:15, col:27>
277*6a79f5aaSBruno Ricci // CHECK-NEXT:         | |   `-ReturnStmt {{.*}} <col:17, col:24>
278*6a79f5aaSBruno Ricci // CHECK-NEXT:         | |     `-IntegerLiteral {{.*}} <col:24> 'int' 0
279*6a79f5aaSBruno Ricci // CHECK-NEXT:         | |-CXXConversionDecl {{.*}} <col:3, col:27> col:3{{( imported)?}} implicit constexpr operator int (*)() 'auto (*() const noexcept)() -> int' inline
280*6a79f5aaSBruno Ricci // CHECK-NEXT:         | `-CXXMethodDecl {{.*}} <col:3, col:27> col:3{{( imported)?}} implicit __invoke 'auto () -> int' static inline
281*6a79f5aaSBruno Ricci // CHECK-NEXT:         `-<<<NULL>>>
282