16a79f5aaSBruno Ricci // Test without serialization: 26a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \ 3e560280cSBruno Ricci // RUN: -ast-dump %s -ast-dump-filter test \ 4e560280cSBruno 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 \ 10c10295e1SBruno Ricci // RUN: -x c++ -include-pch %t -ast-dump-all -ast-dump-filter test /dev/null \ 11e560280cSBruno 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; }; 36*b2bc0a32SAaron Ballman [] [[noreturn]] () {}; 376a79f5aaSBruno Ricci } 38e560280cSBruno Ricci // CHECK:Dumping test: 39*b2bc0a32SAaron Ballman // CHECK-NEXT:FunctionTemplateDecl {{.*}} <{{.*}}ast-dump-lambda.cpp:15:1, line:37:1> line:15:32{{( imported)?}} test 406a79f5aaSBruno Ricci // CHECK-NEXT:|-TemplateTypeParmDecl {{.*}} <col:11, col:23> col:23{{( imported)?}} referenced typename depth 0 index 0 ... Ts 41*b2bc0a32SAaron Ballman // CHECK-NEXT:`-FunctionDecl {{.*}} <col:27, line:37:1> line:15:32{{( imported)?}} test 'void (Ts...)' 426a79f5aaSBruno Ricci // CHECK-NEXT: |-ParmVarDecl {{.*}} <col:37, col:43> col:43{{( imported)?}} referenced a 'Ts...' pack 43*b2bc0a32SAaron Ballman // CHECK-NEXT: `-CompoundStmt {{.*}} <col:46, line:37:1> 44e560280cSBruno Ricci // CHECK-NEXT: |-DeclStmt {{.*}} <line:16:3, line:21:4> 45e560280cSBruno Ricci // CHECK-NEXT: | `-CXXRecordDecl {{.*}} <line:16:3, line:21:3> line:16:10{{( imported)?}}{{( <undeserialized declarations>)?}} struct V definition 466a79f5aaSBruno Ricci // CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init 476a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr 486a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 496a79f5aaSBruno Ricci // CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit 506a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param 516a79f5aaSBruno Ricci // CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit 5223f700c7SRaphael Isemann // CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit 536a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3, col:10> col:10{{( imported)?}} implicit struct V 54e560280cSBruno Ricci // CHECK-NEXT: | `-CXXMethodDecl {{.*}} <line:17:5, line:20:5> line:17:10{{( imported)?}} f 'void ()' 55e560280cSBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:14, line:20:5> 56e560280cSBruno Ricci // CHECK-NEXT: | |-LambdaExpr {{.*}} <line:18:7, col:15> '(lambda at {{.*}}ast-dump-lambda.cpp:18:7)' 576a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXRecordDecl {{.*}} <col:7> col:7{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 586a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init 596a79f5aaSBruno Ricci // CHECK-NEXT: | | | | |-DefaultConstructor 606a79f5aaSBruno Ricci // CHECK-NEXT: | | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 616a79f5aaSBruno Ricci // CHECK-NEXT: | | | | |-MoveConstructor exists simple trivial needs_implicit 626a79f5aaSBruno Ricci // CHECK-NEXT: | | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 636a79f5aaSBruno Ricci // CHECK-NEXT: | | | | |-MoveAssignment 6423f700c7SRaphael Isemann // CHECK-NEXT: | | | | `-Destructor simple irrelevant trivial needs_implicit 656a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CXXMethodDecl {{.*}} <col:12, col:15> col:7{{( imported)?}} operator() 'auto () const -> auto' inline 666a79f5aaSBruno Ricci // CHECK-NEXT: | | | | `-CompoundStmt {{.*}} <col:14, col:15> 676a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'V *' 686a79f5aaSBruno Ricci // CHECK-NEXT: | | |-ParenListExpr {{.*}} <col:8> 'NULL TYPE' 696a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CXXThisExpr {{.*}} <col:8> 'V *' this 7005843dc6SBruno Ricci // CHECK-NEXT: | | `-CompoundStmt {{.*}} <col:14, col:15> 71e560280cSBruno Ricci // CHECK-NEXT: | `-LambdaExpr {{.*}} <line:19:7, col:16> '(lambda at {{.*}}ast-dump-lambda.cpp:19:7)' 726a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:7> col:7{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 736a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init 746a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 756a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 766a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 776a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 786a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 7923f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 806a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:13, col:16> col:7{{( imported)?}} operator() 'auto () const -> auto' inline 816a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:15, col:16> 826a79f5aaSBruno Ricci // CHECK-NEXT: | | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'V' 836a79f5aaSBruno Ricci // CHECK-NEXT: | |-ParenListExpr {{.*}} <col:8> 'NULL TYPE' 846a79f5aaSBruno Ricci // CHECK-NEXT: | | `-UnaryOperator {{.*}} <col:8> '<dependent type>' prefix '*' cannot overflow 856a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CXXThisExpr {{.*}} <col:8> 'V *' this 8605843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:15, col:16> 87e560280cSBruno Ricci // CHECK-NEXT: |-DeclStmt {{.*}} <line:22:3, col:11> 886a79f5aaSBruno Ricci // CHECK-NEXT: | |-VarDecl {{.*}} <col:3, col:7> col:7{{( imported)?}} referenced b 'int' 896a79f5aaSBruno Ricci // CHECK-NEXT: | `-VarDecl {{.*}} <col:3, col:10> col:10{{( imported)?}} referenced c 'int' 90e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:23:3, col:9> '(lambda at {{.*}}ast-dump-lambda.cpp:23:3)' 916a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 926a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 936a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 946a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 956a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 966a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 976a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 9823f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 996a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:6, col:9> col:3{{( imported)?}} operator() 'auto () const' inline 1006a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:8, col:9> 1016a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXConversionDecl {{.*}} <col:3, col:9> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline 1026a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:3, col:9> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline 10305843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:8, col:9> 104e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:24:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:24:3)' 1056a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 1066a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 1076a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 1086a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 1096a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 1106a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 1116a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 11223f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 1136a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:16, col:19> col:3{{( imported)?}} operator() 'auto (int, ...) const' inline 1146a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-ParmVarDecl {{.*}} <col:6, col:10> col:10{{( imported)?}} a 'int' 1156a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:18, col:19> 1166a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXConversionDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit constexpr operator auto (*)(int, ...) 'auto (*() const noexcept)(int, ...)' inline 1176a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit __invoke 'auto (int, ...)' static inline 1186a79f5aaSBruno Ricci // CHECK-NEXT: | | `-ParmVarDecl {{.*}} <col:6, col:10> col:10{{( imported)?}} a 'int' 11905843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:18, col:19> 120e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:25:3, col:11> '(lambda at {{.*}}ast-dump-lambda.cpp:25:3)' 1216a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 1226a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init 1236a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor 1246a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 1256a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 1266a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 1276a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 12823f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 1296a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:8, col:11> col:3{{( imported)?}} operator() 'auto () const -> auto' inline 1306a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:10, col:11> 1316a79f5aaSBruno Ricci // CHECK-NEXT: | | `-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'Ts...' 1326a79f5aaSBruno Ricci // CHECK-NEXT: | |-ParenListExpr {{.*}} <col:4> 'NULL TYPE' 1336f9fe31cSRichard Smith // CHECK-NEXT: | | `-DeclRefExpr {{.*}} <col:4> 'Ts' lvalue ParmVar {{.*}} 'a' 'Ts...' 13405843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:10, col:11> 1356a79f5aaSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:26:3, col:8> '(lambda at {{.*}}ast-dump-lambda.cpp:26:3)' 1366a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 1376a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 1386a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 1396a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 1406a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 1416a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 1426a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 14323f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 1446a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:5, col:8> col:3{{( imported)?}} operator() 'auto () const -> auto' inline 1456a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CompoundStmt {{.*}} <col:7, col:8> 14605843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:7, col:8> 1476a79f5aaSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:27:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:27:3)' 1486a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 1496a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 1506a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 1516a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 1526a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 1536a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 1546a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 15523f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 1566a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:5, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline 1576a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CompoundStmt {{.*}} <col:7, col:19> 1586a79f5aaSBruno Ricci // CHECK-NEXT: | | `-ReturnStmt {{.*}} <col:9, col:16> 159e560280cSBruno Ricci // CHECK-NEXT: | | `-DeclRefExpr {{.*}} <col:16> 'const int' lvalue Var {{.*}} 'b' 'int' 160e560280cSBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:7, col:19> 161e560280cSBruno Ricci // CHECK-NEXT: | `-ReturnStmt {{.*}} <col:9, col:16> 162e560280cSBruno Ricci // CHECK-NEXT: | `-DeclRefExpr {{.*}} <col:16> 'const int' lvalue Var {{.*}} 'b' 'int' 163e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:28:3, col:8> '(lambda at {{.*}}ast-dump-lambda.cpp:28:3)' 164e560280cSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 165e560280cSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 166e560280cSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 167e560280cSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 168e560280cSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 169e560280cSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 170e560280cSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 17123f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 172e560280cSBruno Ricci // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:5, col:8> col:3{{( imported)?}} operator() 'auto () const -> auto' inline 173e560280cSBruno Ricci // CHECK-NEXT: | | `-CompoundStmt {{.*}} <col:7, col:8> 174e560280cSBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:7, col:8> 175e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:29:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:29:3)' 176e560280cSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 177e560280cSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 178e560280cSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 179e560280cSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 180e560280cSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 181e560280cSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 182e560280cSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 18323f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 184e560280cSBruno Ricci // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:5, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline 185e560280cSBruno Ricci // CHECK-NEXT: | | `-CompoundStmt {{.*}} <col:7, col:19> 186e560280cSBruno Ricci // CHECK-NEXT: | | `-ReturnStmt {{.*}} <col:9, col:16> 1876a79f5aaSBruno Ricci // CHECK-NEXT: | | `-DeclRefExpr {{.*}} <col:16> 'int' lvalue Var {{.*}} 'c' 'int' 18805843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:7, col:19> 18905843dc6SBruno Ricci // CHECK-NEXT: | `-ReturnStmt {{.*}} <col:9, col:16> 19005843dc6SBruno Ricci // CHECK-NEXT: | `-DeclRefExpr {{.*}} <col:16> 'int' lvalue Var {{.*}} 'c' 'int' 191e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:30:3, col:27> '(lambda at {{.*}}ast-dump-lambda.cpp:30:3)' 1926a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 1936a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda trivially_copyable literal can_const_default_init 1946a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor 1956a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 1966a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 1976a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 1986a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 19923f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 2006a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:9, col:27> col:3{{( imported)?}} operator() 'auto () const -> auto' inline 2016a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:11, col:27> 2026a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-ReturnStmt {{.*}} <col:13, col:24> 2036a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-BinaryOperator {{.*}} <col:20, col:24> 'int' '+' 2046a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-ImplicitCastExpr {{.*}} <col:20> 'int' <LValueToRValue> 2056a79f5aaSBruno Ricci // CHECK-NEXT: | | | | `-DeclRefExpr {{.*}} <col:20> 'const int' lvalue Var {{.*}} 'b' 'int' 2066a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-ImplicitCastExpr {{.*}} <col:24> 'int' <LValueToRValue> 2076a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-DeclRefExpr {{.*}} <col:24> 'int' lvalue Var {{.*}} 'c' 'int' 2086a79f5aaSBruno Ricci // CHECK-NEXT: | | |-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'int' 2096a79f5aaSBruno Ricci // CHECK-NEXT: | | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'int &' 2106a79f5aaSBruno Ricci // CHECK-NEXT: | |-ImplicitCastExpr {{.*}} <col:4> 'int' <LValueToRValue> 2116a79f5aaSBruno Ricci // CHECK-NEXT: | | `-DeclRefExpr {{.*}} <col:4> 'int' lvalue Var {{.*}} 'b' 'int' 2126a79f5aaSBruno Ricci // CHECK-NEXT: | |-DeclRefExpr {{.*}} <col:8> 'int' lvalue Var {{.*}} 'c' 'int' 21305843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:11, col:27> 21405843dc6SBruno Ricci // CHECK-NEXT: | `-ReturnStmt {{.*}} <col:13, col:24> 21505843dc6SBruno Ricci // CHECK-NEXT: | `-BinaryOperator {{.*}} <col:20, col:24> 'int' '+' 21605843dc6SBruno Ricci // CHECK-NEXT: | |-ImplicitCastExpr {{.*}} <col:20> 'int' <LValueToRValue> 21705843dc6SBruno Ricci // CHECK-NEXT: | | `-DeclRefExpr {{.*}} <col:20> 'const int' lvalue Var {{.*}} 'b' 'int' 21805843dc6SBruno Ricci // CHECK-NEXT: | `-ImplicitCastExpr {{.*}} <col:24> 'int' <LValueToRValue> 21905843dc6SBruno Ricci // CHECK-NEXT: | `-DeclRefExpr {{.*}} <col:24> 'int' lvalue Var {{.*}} 'c' 'int' 220e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:31:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:31:3)' 2216a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 2226a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init 2236a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor 2246a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 2256a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 2266a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 2276a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 22823f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 2296a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:16, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline 2306a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:18, col:19> 2316a79f5aaSBruno Ricci // CHECK-NEXT: | | |-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'Ts...' 2326a79f5aaSBruno Ricci // CHECK-NEXT: | | `-FieldDecl {{.*}} <col:10> col:10{{( imported)?}} implicit 'int':'int' 2336a79f5aaSBruno Ricci // CHECK-NEXT: | |-ParenListExpr {{.*}} <col:4> 'NULL TYPE' 2346f9fe31cSRichard Smith // CHECK-NEXT: | | `-DeclRefExpr {{.*}} <col:4> 'Ts' lvalue ParmVar {{.*}} 'a' 'Ts...' 2356a79f5aaSBruno Ricci // CHECK-NEXT: | |-IntegerLiteral {{.*}} <col:14> 'int' 12 23605843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:18, col:19> 237e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:32:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:32:3)' 2386a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 2396a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 2406a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 2416a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 2426a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 2436a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 2446a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 24523f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 2466a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:8, col:19> col:3{{( imported)?}} constexpr operator() 'auto () const' inline 2476a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:18, col:19> 2486a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXConversionDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline 2496a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline 25005843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:18, col:19> 251e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:33:3, col:17> '(lambda at {{.*}}ast-dump-lambda.cpp:33:3)' 2526a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 2536a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 2546a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 2556a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 2566a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 2576a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 2586a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 25923f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 2606a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:8, col:17> col:3{{( imported)?}} operator() 'auto ()' inline 2616a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:16, col:17> 2626a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXConversionDecl {{.*}} <col:3, col:17> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline 2636a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:3, col:17> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline 26405843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:16, col:17> 265e560280cSBruno Ricci // CHECK-NEXT: |-LambdaExpr {{.*}} <line:34:3, col:18> '(lambda at {{.*}}ast-dump-lambda.cpp:34:3)' 2666a79f5aaSBruno Ricci // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 2676a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 2686a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 2696a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 2706a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 2716a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 2726a79f5aaSBruno Ricci // CHECK-NEXT: | | | |-MoveAssignment 27323f700c7SRaphael Isemann // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 2746a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:8, col:18> col:3{{( imported)?}} operator() 'auto () const noexcept' inline 2756a79f5aaSBruno Ricci // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:17, col:18> 2766a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CXXConversionDecl {{.*}} <col:3, col:18> col:3{{( imported)?}} implicit constexpr operator auto (*)() noexcept 'auto (*() const noexcept)() noexcept' inline 2776a79f5aaSBruno Ricci // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:3, col:18> col:3{{( imported)?}} implicit __invoke 'auto () noexcept' static inline 27805843dc6SBruno Ricci // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:17, col:18> 279*b2bc0a32SAaron Ballman // CHECK-NEXT: |-LambdaExpr {{.*}} <line:35:3, col:27> '(lambda at {{.*}}ast-dump-lambda.cpp:35:3)' 280*b2bc0a32SAaron Ballman // CHECK-NEXT: | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 281*b2bc0a32SAaron Ballman // CHECK-NEXT: | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 282*b2bc0a32SAaron Ballman // CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr 283*b2bc0a32SAaron Ballman // CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 284*b2bc0a32SAaron Ballman // CHECK-NEXT: | | | |-MoveConstructor exists simple trivial needs_implicit 285*b2bc0a32SAaron Ballman // CHECK-NEXT: | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 286*b2bc0a32SAaron Ballman // CHECK-NEXT: | | | |-MoveAssignment 287*b2bc0a32SAaron Ballman // CHECK-NEXT: | | | `-Destructor simple irrelevant trivial needs_implicit 288*b2bc0a32SAaron Ballman // CHECK-NEXT: | | |-CXXMethodDecl {{.*}} <col:11, col:27> col:3{{( imported)?}} operator() 'auto () const -> int' inline 289*b2bc0a32SAaron Ballman // CHECK-NEXT: | | | `-CompoundStmt {{.*}} <col:15, col:27> 290*b2bc0a32SAaron Ballman // CHECK-NEXT: | | | `-ReturnStmt {{.*}} <col:17, col:24> 291*b2bc0a32SAaron Ballman // CHECK-NEXT: | | | `-IntegerLiteral {{.*}} <col:24> 'int' 0 292*b2bc0a32SAaron Ballman // CHECK-NEXT: | | |-CXXConversionDecl {{.*}} <col:3, col:27> col:3{{( imported)?}} implicit constexpr operator int (*)() 'auto (*() const noexcept)() -> int' inline 293*b2bc0a32SAaron Ballman // CHECK-NEXT: | | `-CXXMethodDecl {{.*}} <col:3, col:27> col:3{{( imported)?}} implicit __invoke 'auto () -> int' static inline 294*b2bc0a32SAaron Ballman // CHECK-NEXT: | `-CompoundStmt {{.*}} <col:15, col:27> 295*b2bc0a32SAaron Ballman // CHECK-NEXT: | `-ReturnStmt {{.*}} <col:17, col:24> 296*b2bc0a32SAaron Ballman // CHECK-NEXT: | `-IntegerLiteral {{.*}} <col:24> 'int' 0 297*b2bc0a32SAaron Ballman // CHECK-NEXT: `-LambdaExpr {{.*}} <line:36:3, col:23> '(lambda at {{.*}}ast-dump-lambda.cpp:36:3)' 2986a79f5aaSBruno Ricci // CHECK-NEXT: |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition 2996a79f5aaSBruno Ricci // CHECK-NEXT: | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init 3006a79f5aaSBruno Ricci // CHECK-NEXT: | | |-DefaultConstructor defaulted_is_constexpr 3016a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param 3026a79f5aaSBruno Ricci // CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit 3036a79f5aaSBruno Ricci // CHECK-NEXT: | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param 3046a79f5aaSBruno Ricci // CHECK-NEXT: | | |-MoveAssignment 30523f700c7SRaphael Isemann // CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit 306*b2bc0a32SAaron Ballman // CHECK-NEXT: | |-CXXMethodDecl {{.*}} <col:20, col:23> col:3{{( imported)?}} operator() 'auto () const' inline 307*b2bc0a32SAaron Ballman // CHECK-NEXT: | | |-CompoundStmt {{.*}} <col:22, col:23> 308*b2bc0a32SAaron Ballman // CHECK-NEXT: | | `-CXX11NoReturnAttr {{.*}} <col:8> 309*b2bc0a32SAaron Ballman // CHECK-NEXT: | |-CXXConversionDecl {{.*}} <col:3, col:23> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline 310*b2bc0a32SAaron Ballman // CHECK-NEXT: | `-CXXMethodDecl {{.*}} <col:3, col:23> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline 311*b2bc0a32SAaron Ballman // CHECK-NEXT: `-CompoundStmt {{.*}} <col:22, col:23> 312