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