16a79f5aaSBruno Ricci // Test without serialization:
26a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
36a79f5aaSBruno Ricci // RUN: 					 -ast-dump %s | FileCheck -strict-whitespace %s
46a79f5aaSBruno Ricci 
56a79f5aaSBruno Ricci // Test with serialization:
66a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
76a79f5aaSBruno Ricci // RUN:            -emit-pch -o %t %s
86a79f5aaSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
96a79f5aaSBruno Ricci // RUN:            -x c++ -include-pch %t -ast-dump-all | FileCheck -strict-whitespace %s
106a79f5aaSBruno Ricci 
1105843dc6SBruno Ricci 
126a79f5aaSBruno Ricci 
136a79f5aaSBruno Ricci template <typename... Ts> void test(Ts... a) {
146a79f5aaSBruno Ricci   struct V {
156a79f5aaSBruno Ricci     void f() {
166a79f5aaSBruno Ricci       [this] {};
176a79f5aaSBruno Ricci       [*this] {};
186a79f5aaSBruno Ricci     }
196a79f5aaSBruno Ricci   };
206a79f5aaSBruno Ricci   int b, c;
216a79f5aaSBruno Ricci   []() {};
226a79f5aaSBruno Ricci   [](int a, ...) {};
236a79f5aaSBruno Ricci   [a...] {};
246a79f5aaSBruno Ricci   [=] {};
256a79f5aaSBruno Ricci   [=] { return b; };
266a79f5aaSBruno Ricci   [&] {};
276a79f5aaSBruno Ricci   [&] { return c; };
286a79f5aaSBruno Ricci   [b, &c] { return b + c; };
296a79f5aaSBruno Ricci   [a..., x = 12] {};
306a79f5aaSBruno Ricci   []() constexpr {};
316a79f5aaSBruno Ricci   []() mutable {};
326a79f5aaSBruno Ricci   []() noexcept {};
336a79f5aaSBruno Ricci   []() -> int { return 0; };
346a79f5aaSBruno Ricci }
356a79f5aaSBruno Ricci // CHECK: TranslationUnitDecl {{.*}} <<invalid sloc>> <invalid sloc>{{( <undeserialized declarations>)?}}
366a79f5aaSBruno Ricci // CHECK: `-FunctionTemplateDecl {{.*}} <{{.*}}ast-dump-lambda.cpp:13:1, line:34:1> line:13:32{{( imported)?}} test
376a79f5aaSBruno Ricci // CHECK-NEXT:   |-TemplateTypeParmDecl {{.*}} <col:11, col:23> col:23{{( imported)?}} referenced typename depth 0 index 0 ... Ts
386a79f5aaSBruno Ricci // CHECK-NEXT:   `-FunctionDecl {{.*}} <col:27, line:34:1> line:13:32{{( imported)?}} test 'void (Ts...)'
396a79f5aaSBruno Ricci // CHECK-NEXT:     |-ParmVarDecl {{.*}} <col:37, col:43> col:43{{( imported)?}} referenced a 'Ts...' pack
406a79f5aaSBruno Ricci // CHECK-NEXT:     `-CompoundStmt {{.*}} <col:46, line:34:1>
416a79f5aaSBruno Ricci // CHECK-NEXT:       |-DeclStmt {{.*}} <line:14:3, line:19:4>
426a79f5aaSBruno Ricci // CHECK-NEXT:       | `-CXXRecordDecl {{.*}} <line:14:3, line:19:3> line:14:10{{( imported)?}}{{( <undeserialized declarations>)?}} struct V definition
436a79f5aaSBruno Ricci // CHECK-NEXT:       |   |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
446a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr
456a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
466a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-MoveConstructor exists simple trivial needs_implicit
476a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param
486a79f5aaSBruno Ricci // CHECK-NEXT:       |   | |-MoveAssignment exists simple trivial needs_implicit
496a79f5aaSBruno Ricci // CHECK-NEXT:       |   | `-Destructor simple irrelevant trivial needs_implicit
506a79f5aaSBruno Ricci // CHECK-NEXT:       |   |-CXXRecordDecl {{.*}} <col:3, col:10> col:10{{( imported)?}} implicit struct V
516a79f5aaSBruno Ricci // CHECK-NEXT:       |   `-CXXMethodDecl {{.*}} <line:15:5, line:18:5> line:15:10{{( imported)?}} f 'void ()'
526a79f5aaSBruno Ricci // CHECK-NEXT:       |     `-CompoundStmt {{.*}} <col:14, line:18:5>
536a79f5aaSBruno Ricci // CHECK-NEXT:       |       |-LambdaExpr {{.*}} <line:16:7, col:15> '(lambda at {{.*}}ast-dump-lambda.cpp:16:7)'
546a79f5aaSBruno Ricci // CHECK-NEXT:       |       | |-CXXRecordDecl {{.*}} <col:7> col:7{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
556a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
566a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-DefaultConstructor
576a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
586a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-MoveConstructor exists simple trivial needs_implicit
596a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
606a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | |-MoveAssignment
616a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | `-Destructor simple irrelevant trivial needs_implicit
626a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | |-CXXMethodDecl {{.*}} <col:12, col:15> col:7{{( imported)?}} operator() 'auto () const -> auto' inline
636a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | | `-CompoundStmt {{.*}} <col:14, col:15>
646a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'V *'
656a79f5aaSBruno Ricci // CHECK-NEXT:       |       | |-ParenListExpr {{.*}} <col:8> 'NULL TYPE'
666a79f5aaSBruno Ricci // CHECK-NEXT:       |       | | `-CXXThisExpr {{.*}} <col:8> 'V *' this
6705843dc6SBruno Ricci // CHECK-NEXT:       |       | `-CompoundStmt {{.*}} <col:14, col:15>
686a79f5aaSBruno Ricci // CHECK-NEXT:       |       `-LambdaExpr {{.*}} <line:17:7, col:16> '(lambda at {{.*}}ast-dump-lambda.cpp:17:7)'
696a79f5aaSBruno Ricci // CHECK-NEXT:       |         |-CXXRecordDecl {{.*}} <col:7> col:7{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
706a79f5aaSBruno Ricci // CHECK-NEXT:       |         | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
716a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-DefaultConstructor defaulted_is_constexpr
726a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
736a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-MoveConstructor exists simple trivial needs_implicit
746a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
756a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | |-MoveAssignment
766a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | `-Destructor simple irrelevant trivial needs_implicit
776a79f5aaSBruno Ricci // CHECK-NEXT:       |         | |-CXXMethodDecl {{.*}} <col:13, col:16> col:7{{( imported)?}} operator() 'auto () const -> auto' inline
786a79f5aaSBruno Ricci // CHECK-NEXT:       |         | | `-CompoundStmt {{.*}} <col:15, col:16>
796a79f5aaSBruno Ricci // CHECK-NEXT:       |         | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'V'
806a79f5aaSBruno Ricci // CHECK-NEXT:       |         |-ParenListExpr {{.*}} <col:8> 'NULL TYPE'
816a79f5aaSBruno Ricci // CHECK-NEXT:       |         | `-UnaryOperator {{.*}} <col:8> '<dependent type>' prefix '*' cannot overflow
826a79f5aaSBruno Ricci // CHECK-NEXT:       |         |   `-CXXThisExpr {{.*}} <col:8> 'V *' this
8305843dc6SBruno Ricci // CHECK-NEXT:       |         `-CompoundStmt {{.*}} <col:15, col:16>
846a79f5aaSBruno Ricci // CHECK-NEXT:       |-DeclStmt {{.*}} <line:20:3, col:11>
856a79f5aaSBruno Ricci // CHECK-NEXT:       | |-VarDecl {{.*}} <col:3, col:7> col:7{{( imported)?}} referenced b 'int'
866a79f5aaSBruno Ricci // CHECK-NEXT:       | `-VarDecl {{.*}} <col:3, col:10> col:10{{( imported)?}} referenced c 'int'
876a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:21:3, col:9> '(lambda at {{.*}}ast-dump-lambda.cpp:21:3)'
886a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
896a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
906a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
916a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
926a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
936a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
946a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
956a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
966a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:6, col:9> col:3{{( imported)?}} operator() 'auto () const' inline
976a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:8, col:9>
986a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:9> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
996a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:9> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline
10005843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:8, col:9>
1016a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:22:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:22:3)'
1026a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1036a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
1046a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
1056a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1066a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
1076a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1086a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
1096a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
1106a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:16, col:19> col:3{{( imported)?}} operator() 'auto (int, ...) const' inline
1116a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-ParmVarDecl {{.*}} <col:6, col:10> col:10{{( imported)?}} a 'int'
1126a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:18, col:19>
1136a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit constexpr operator auto (*)(int, ...) 'auto (*() const noexcept)(int, ...)' inline
1146a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit __invoke 'auto (int, ...)' static inline
1156a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-ParmVarDecl {{.*}} <col:6, col:10> col:10{{( imported)?}} a 'int'
11605843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:18, col:19>
1176a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:23:3, col:11> '(lambda at {{.*}}ast-dump-lambda.cpp:23:3)'
1186a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1196a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
1206a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor
1216a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1226a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
1236a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1246a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
1256a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
1266a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:8, col:11> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
1276a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:10, col:11>
1286a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'Ts...'
1296a79f5aaSBruno Ricci // CHECK-NEXT:       | |-ParenListExpr {{.*}} <col:4> 'NULL TYPE'
130*6f9fe31cSRichard Smith // CHECK-NEXT:       | | `-DeclRefExpr {{.*}} <col:4> 'Ts' lvalue ParmVar {{.*}} 'a' 'Ts...'
13105843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:10, col:11>
1326a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:24:3, col:8> '(lambda at {{.*}}ast-dump-lambda.cpp:24:3)'
1336a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1346a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
1356a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
1366a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1376a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
1386a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1396a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
1406a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
1416a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:5, col:8> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
1426a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-CompoundStmt {{.*}} <col:7, col:8>
14305843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:7, col:8>
1446a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:25:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:25:3)'
1456a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1466a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
1476a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
1486a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1496a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
1506a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1516a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
1526a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
1536a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:5, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
1546a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-CompoundStmt {{.*}} <col:7, col:19>
1556a79f5aaSBruno Ricci // CHECK-NEXT:       | |     `-ReturnStmt {{.*}} <col:9, col:16>
1566a79f5aaSBruno Ricci // CHECK-NEXT:       | |       `-DeclRefExpr {{.*}} <col:16> 'const int' lvalue Var {{.*}} 'b' 'int'
15705843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:7, col:19>
15805843dc6SBruno Ricci // CHECK-NEXT:       |   `-ReturnStmt {{.*}} <col:9, col:16>
15905843dc6SBruno Ricci // CHECK-NEXT:       |     `-DeclRefExpr {{.*}} <col:16> 'const int' lvalue Var {{.*}} 'b' 'int'
1606a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:26:3, col:8> '(lambda at {{.*}}ast-dump-lambda.cpp:26:3)'
1616a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1626a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
1636a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
1646a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1656a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
1666a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1676a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
1686a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
1696a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:5, col:8> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
1706a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-CompoundStmt {{.*}} <col:7, col:8>
17105843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:7, col:8>
1726a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:27:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:27:3)'
1736a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1746a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
1756a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
1766a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1776a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
1786a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1796a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
1806a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
1816a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:5, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
1826a79f5aaSBruno Ricci // CHECK-NEXT:       | |   `-CompoundStmt {{.*}} <col:7, col:19>
1836a79f5aaSBruno Ricci // CHECK-NEXT:       | |     `-ReturnStmt {{.*}} <col:9, col:16>
1846a79f5aaSBruno Ricci // CHECK-NEXT:       | |       `-DeclRefExpr {{.*}} <col:16> 'int' lvalue Var {{.*}} 'c' 'int'
18505843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:7, col:19>
18605843dc6SBruno Ricci // CHECK-NEXT:       |   `-ReturnStmt {{.*}} <col:9, col:16>
18705843dc6SBruno Ricci // CHECK-NEXT:       |     `-DeclRefExpr {{.*}} <col:16> 'int' lvalue Var {{.*}} 'c' 'int'
1886a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:28:3, col:27> '(lambda at {{.*}}ast-dump-lambda.cpp:28:3)'
1896a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
1906a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda trivially_copyable literal can_const_default_init
1916a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor
1926a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
1936a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
1946a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
1956a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
1966a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
1976a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:9, col:27> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
1986a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:11, col:27>
1996a79f5aaSBruno Ricci // CHECK-NEXT:       | | |   `-ReturnStmt {{.*}} <col:13, col:24>
2006a79f5aaSBruno Ricci // CHECK-NEXT:       | | |     `-BinaryOperator {{.*}} <col:20, col:24> 'int' '+'
2016a79f5aaSBruno Ricci // CHECK-NEXT:       | | |       |-ImplicitCastExpr {{.*}} <col:20> 'int' <LValueToRValue>
2026a79f5aaSBruno Ricci // CHECK-NEXT:       | | |       | `-DeclRefExpr {{.*}} <col:20> 'const int' lvalue Var {{.*}} 'b' 'int'
2036a79f5aaSBruno Ricci // CHECK-NEXT:       | | |       `-ImplicitCastExpr {{.*}} <col:24> 'int' <LValueToRValue>
2046a79f5aaSBruno Ricci // CHECK-NEXT:       | | |         `-DeclRefExpr {{.*}} <col:24> 'int' lvalue Var {{.*}} 'c' 'int'
2056a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'int'
2066a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-FieldDecl {{.*}} <col:8> col:8{{( imported)?}} implicit 'int &'
2076a79f5aaSBruno Ricci // CHECK-NEXT:       | |-ImplicitCastExpr {{.*}} <col:4> 'int' <LValueToRValue>
2086a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-DeclRefExpr {{.*}} <col:4> 'int' lvalue Var {{.*}} 'b' 'int'
2096a79f5aaSBruno Ricci // CHECK-NEXT:       | |-DeclRefExpr {{.*}} <col:8> 'int' lvalue Var {{.*}} 'c' 'int'
21005843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:11, col:27>
21105843dc6SBruno Ricci // CHECK-NEXT:       |   `-ReturnStmt {{.*}} <col:13, col:24>
21205843dc6SBruno Ricci // CHECK-NEXT:       |     `-BinaryOperator {{.*}} <col:20, col:24> 'int' '+'
21305843dc6SBruno Ricci // CHECK-NEXT:       |       |-ImplicitCastExpr {{.*}} <col:20> 'int' <LValueToRValue>
21405843dc6SBruno Ricci // CHECK-NEXT:       |       | `-DeclRefExpr {{.*}} <col:20> 'const int' lvalue Var {{.*}} 'b' 'int'
21505843dc6SBruno Ricci // CHECK-NEXT:       |       `-ImplicitCastExpr {{.*}} <col:24> 'int' <LValueToRValue>
21605843dc6SBruno Ricci // CHECK-NEXT:       |         `-DeclRefExpr {{.*}} <col:24> 'int' lvalue Var {{.*}} 'c' 'int'
2176a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:29:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:29:3)'
2186a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2196a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda standard_layout trivially_copyable can_const_default_init
2206a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor
2216a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2226a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
2236a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2246a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
2256a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
2266a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:16, col:19> col:3{{( imported)?}} operator() 'auto () const -> auto' inline
2276a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:18, col:19>
2286a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-FieldDecl {{.*}} <col:4> col:4{{( imported)?}} implicit 'Ts...'
2296a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-FieldDecl {{.*}} <col:10> col:10{{( imported)?}} implicit 'int':'int'
2306a79f5aaSBruno Ricci // CHECK-NEXT:       | |-ParenListExpr {{.*}} <col:4> 'NULL TYPE'
231*6f9fe31cSRichard Smith // CHECK-NEXT:       | | `-DeclRefExpr {{.*}} <col:4> 'Ts' lvalue ParmVar {{.*}} 'a' 'Ts...'
2326a79f5aaSBruno Ricci // CHECK-NEXT:       | |-IntegerLiteral {{.*}} <col:14> 'int' 12
23305843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:18, col:19>
2346a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:30:3, col:19> '(lambda at {{.*}}ast-dump-lambda.cpp:30:3)'
2356a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2366a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
2376a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
2386a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2396a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
2406a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2416a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
2426a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
2436a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:8, col:19> col:3{{( imported)?}} constexpr operator() 'auto () const' inline
2446a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:18, col:19>
2456a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
2466a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:19> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline
24705843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:18, col:19>
2486a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:31:3, col:17> '(lambda at {{.*}}ast-dump-lambda.cpp:31:3)'
2496a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2506a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
2516a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
2526a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2536a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
2546a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2556a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
2566a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
2576a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:8, col:17> col:3{{( imported)?}} operator() 'auto ()' inline
2586a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:16, col:17>
2596a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:17> col:3{{( imported)?}} implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
2606a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:17> col:3{{( imported)?}} implicit __invoke 'auto ()' static inline
26105843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:16, col:17>
2626a79f5aaSBruno Ricci // CHECK-NEXT:       |-LambdaExpr {{.*}} <line:32:3, col:18> '(lambda at {{.*}}ast-dump-lambda.cpp:32:3)'
2636a79f5aaSBruno Ricci // CHECK-NEXT:       | |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2646a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
2656a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-DefaultConstructor defaulted_is_constexpr
2666a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2676a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveConstructor exists simple trivial needs_implicit
2686a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2696a79f5aaSBruno Ricci // CHECK-NEXT:       | | | |-MoveAssignment
2706a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-Destructor simple irrelevant trivial needs_implicit
2716a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXMethodDecl {{.*}} <col:8, col:18> col:3{{( imported)?}} operator() 'auto () const noexcept' inline
2726a79f5aaSBruno Ricci // CHECK-NEXT:       | | | `-CompoundStmt {{.*}} <col:17, col:18>
2736a79f5aaSBruno Ricci // CHECK-NEXT:       | | |-CXXConversionDecl {{.*}} <col:3, col:18> col:3{{( imported)?}} implicit constexpr operator auto (*)() noexcept 'auto (*() const noexcept)() noexcept' inline
2746a79f5aaSBruno Ricci // CHECK-NEXT:       | | `-CXXMethodDecl {{.*}} <col:3, col:18> col:3{{( imported)?}} implicit __invoke 'auto () noexcept' static inline
27505843dc6SBruno Ricci // CHECK-NEXT:       | `-CompoundStmt {{.*}} <col:17, col:18>
2766a79f5aaSBruno Ricci // CHECK-NEXT:       `-LambdaExpr {{.*}} <line:33:3, col:27> '(lambda at {{.*}}ast-dump-lambda.cpp:33:3)'
2776a79f5aaSBruno Ricci // CHECK-NEXT:         |-CXXRecordDecl {{.*}} <col:3> col:3{{( imported)?}} implicit{{( <undeserialized declarations>)?}} class definition
2786a79f5aaSBruno Ricci // CHECK-NEXT:         | |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init
2796a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-DefaultConstructor defaulted_is_constexpr
2806a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
2816a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-MoveConstructor exists simple trivial needs_implicit
2826a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
2836a79f5aaSBruno Ricci // CHECK-NEXT:         | | |-MoveAssignment
2846a79f5aaSBruno Ricci // CHECK-NEXT:         | | `-Destructor simple irrelevant trivial needs_implicit
2856a79f5aaSBruno Ricci // CHECK-NEXT:         | |-CXXMethodDecl {{.*}} <col:11, col:27> col:3{{( imported)?}} operator() 'auto () const -> int' inline
2866a79f5aaSBruno Ricci // CHECK-NEXT:         | | `-CompoundStmt {{.*}} <col:15, col:27>
2876a79f5aaSBruno Ricci // CHECK-NEXT:         | |   `-ReturnStmt {{.*}} <col:17, col:24>
2886a79f5aaSBruno Ricci // CHECK-NEXT:         | |     `-IntegerLiteral {{.*}} <col:24> 'int' 0
2896a79f5aaSBruno Ricci // CHECK-NEXT:         | |-CXXConversionDecl {{.*}} <col:3, col:27> col:3{{( imported)?}} implicit constexpr operator int (*)() 'auto (*() const noexcept)() -> int' inline
2906a79f5aaSBruno Ricci // CHECK-NEXT:         | `-CXXMethodDecl {{.*}} <col:3, col:27> col:3{{( imported)?}} implicit __invoke 'auto () -> int' static inline
29105843dc6SBruno Ricci // CHECK-NEXT:         `-CompoundStmt {{.*}} <col:15, col:27>
29205843dc6SBruno Ricci // CHECK-NEXT:           `-ReturnStmt {{.*}} <col:17, col:24>
29305843dc6SBruno Ricci // CHECK-NEXT:             `-IntegerLiteral {{.*}} <col:24> 'int' 0
294