1059b85e7SAaron Ballman // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 -ast-dump %s | FileCheck -strict-whitespace %s
2059b85e7SAaron Ballman 
3059b85e7SAaron Ballman namespace std {
4059b85e7SAaron Ballman using size_t = decltype(sizeof(0));
5059b85e7SAaron Ballman 
6059b85e7SAaron Ballman class type_info {
7059b85e7SAaron Ballman public:
8059b85e7SAaron Ballman   virtual ~type_info();
9059b85e7SAaron Ballman   bool operator==(const type_info& rhs) const noexcept;
10059b85e7SAaron Ballman   bool operator!=(const type_info& rhs) const noexcept;
11059b85e7SAaron Ballman   type_info(const type_info& rhs) = delete; // cannot be copied
12059b85e7SAaron Ballman   type_info& operator=(const type_info& rhs) = delete; // cannot be copied
13059b85e7SAaron Ballman };
14059b85e7SAaron Ballman 
15059b85e7SAaron Ballman class bad_typeid {
16059b85e7SAaron Ballman public:
17059b85e7SAaron Ballman   bad_typeid() noexcept;
18059b85e7SAaron Ballman   bad_typeid(const bad_typeid&) noexcept;
19059b85e7SAaron Ballman   virtual ~bad_typeid();
20059b85e7SAaron Ballman   bad_typeid& operator=(const bad_typeid&) noexcept;
21059b85e7SAaron Ballman   const char* what() const noexcept;
22059b85e7SAaron Ballman };
23059b85e7SAaron Ballman } // namespace std
24059b85e7SAaron Ballman void *operator new(std::size_t, void *ptr);
25059b85e7SAaron Ballman 
26059b85e7SAaron Ballman struct S {
27059b85e7SAaron Ballman   virtual ~S() = default;
28059b85e7SAaron Ballman 
29059b85e7SAaron Ballman   void func(int);
30059b85e7SAaron Ballman   template <typename Ty>
31059b85e7SAaron Ballman   Ty foo();
32059b85e7SAaron Ballman 
33059b85e7SAaron Ballman   int i;
34059b85e7SAaron Ballman };
35059b85e7SAaron Ballman 
36059b85e7SAaron Ballman struct T : S {};
37059b85e7SAaron Ballman 
38059b85e7SAaron Ballman template <typename>
39059b85e7SAaron Ballman struct U {};
40059b85e7SAaron Ballman 
41059b85e7SAaron Ballman void Throw() {
42059b85e7SAaron Ballman   throw 12;
43059b85e7SAaron Ballman   // CHECK: CXXThrowExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'void'
44059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:9> 'int' 12
45059b85e7SAaron Ballman 
46059b85e7SAaron Ballman   throw;
47059b85e7SAaron Ballman   // CHECK: CXXThrowExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'void'
48059b85e7SAaron Ballman }
49059b85e7SAaron Ballman 
50059b85e7SAaron Ballman void PointerToMember(S obj1, S *obj2, int S::* data, void (S::*call)(int)) {
51059b85e7SAaron Ballman   obj1.*data;
52059b85e7SAaron Ballman   // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'int' lvalue '.*'
53059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'obj1' 'S'
54059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
55059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:9> 'int S::*' lvalue ParmVar 0x{{[^ ]*}} 'data' 'int S::*'
56059b85e7SAaron Ballman 
57059b85e7SAaron Ballman   obj2->*data;
58059b85e7SAaron Ballman   // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> 'int' lvalue '->*'
59059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
60059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'obj2' 'S *'
61059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
62059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'int S::*' lvalue ParmVar 0x{{[^ ]*}} 'data' 'int S::*'
63059b85e7SAaron Ballman 
64059b85e7SAaron Ballman   (obj1.*call)(12);
65059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'void'
66059b85e7SAaron Ballman   // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} <col:3, col:14> '<bound member function type>'
67059b85e7SAaron Ballman   // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:4, col:10> '<bound member function type>' '.*'
68059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'S' lvalue ParmVar 0x{{[^ ]*}} 'obj1' 'S'
69059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
70059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'void (S::*)(int)' lvalue ParmVar 0x{{[^ ]*}} 'call' 'void (S::*)(int)'
71059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:16> 'int' 12
72059b85e7SAaron Ballman 
73059b85e7SAaron Ballman   (obj2->*call)(12);
74059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> 'void'
75059b85e7SAaron Ballman   // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} <col:3, col:15> '<bound member function type>'
76059b85e7SAaron Ballman   // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:4, col:11> '<bound member function type>' '->*'
77059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
78059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'obj2' 'S *'
79059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
80059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> 'void (S::*)(int)' lvalue ParmVar 0x{{[^ ]*}} 'call' 'void (S::*)(int)'
81059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:17> 'int' 12
82059b85e7SAaron Ballman }
83059b85e7SAaron Ballman 
84059b85e7SAaron Ballman void Casting(const S *s) {
85059b85e7SAaron Ballman   // FIXME: The cast expressions contain "struct S" instead of "S".
86059b85e7SAaron Ballman 
87059b85e7SAaron Ballman   const_cast<S *>(s);
88059b85e7SAaron Ballman   // CHECK: CXXConstCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:20> 'S *' const_cast<struct S *> <NoOp>
89059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:19> 'const S *' <LValueToRValue> part_of_explicit_cast
90059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'
91059b85e7SAaron Ballman 
92059b85e7SAaron Ballman   static_cast<const T *>(s);
93059b85e7SAaron Ballman   // CHECK: CXXStaticCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:27> 'const T *' static_cast<const struct T *> <BaseToDerived (S)>
94059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:26> 'const S *' <LValueToRValue> part_of_explicit_cast
95059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:26> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'
96059b85e7SAaron Ballman 
97059b85e7SAaron Ballman   dynamic_cast<const T *>(s);
98059b85e7SAaron Ballman   // CHECK: CXXDynamicCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:28> 'const T *' dynamic_cast<const struct T *> <Dynamic>
99059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:27> 'const S *' <LValueToRValue> part_of_explicit_cast
100059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:27> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'
101059b85e7SAaron Ballman 
102059b85e7SAaron Ballman   reinterpret_cast<const int *>(s);
103059b85e7SAaron Ballman   // CHECK: CXXReinterpretCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:34> 'const int *' reinterpret_cast<const int *> <BitCast>
104059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:33> 'const S *' <LValueToRValue> part_of_explicit_cast
105059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:33> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'
106059b85e7SAaron Ballman }
107059b85e7SAaron Ballman 
108059b85e7SAaron Ballman template <typename... Ts>
109059b85e7SAaron Ballman void UnaryExpressions(int *p) {
110059b85e7SAaron Ballman   sizeof...(Ts);
111059b85e7SAaron Ballman   // CHECK: SizeOfPackExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:15> 'unsigned long' 0x{{[^ ]*}} Ts
112059b85e7SAaron Ballman 
113059b85e7SAaron Ballman   noexcept(p - p);
114059b85e7SAaron Ballman   // CHECK: CXXNoexceptExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> 'bool'
115059b85e7SAaron Ballman   // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:12, col:16> 'long' '-'
116059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
117059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
118059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
119059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
120059b85e7SAaron Ballman 
121059b85e7SAaron Ballman   ::new int;
122059b85e7SAaron Ballman   // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'int *' global Function 0x{{[^ ]*}} 'operator new' 'void *(unsigned long)'
123059b85e7SAaron Ballman 
124059b85e7SAaron Ballman   new (int);
125059b85e7SAaron Ballman   // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(unsigned long)'
126059b85e7SAaron Ballman 
127059b85e7SAaron Ballman   new int{12};
128059b85e7SAaron Ballman   // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:13> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(unsigned long)'
129059b85e7SAaron Ballman   // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:10, col:13> 'int'
130059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 12
131059b85e7SAaron Ballman 
132059b85e7SAaron Ballman   new int[2];
133059b85e7SAaron Ballman   // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'int *' array Function 0x{{[^ ]*}} 'operator new[]' 'void *(unsigned long)'
134059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
135059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 2
136059b85e7SAaron Ballman 
137059b85e7SAaron Ballman   new int[2]{1, 2};
138059b85e7SAaron Ballman   // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'int *' array Function 0x{{[^ ]*}} 'operator new[]' 'void *(unsigned long)'
139059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
140059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 2
141059b85e7SAaron Ballman   // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:13, col:18> 'int [2]'
142059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 1
143059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:17> 'int' 2
144059b85e7SAaron Ballman 
145059b85e7SAaron Ballman   new (p) int;
146059b85e7SAaron Ballman   // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(std::size_t, void *)'
147059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void *' <BitCast>
148059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <LValueToRValue>
149059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
150059b85e7SAaron Ballman 
151059b85e7SAaron Ballman   new (p) int{12};
152059b85e7SAaron Ballman   // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(std::size_t, void *)'
153059b85e7SAaron Ballman   // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:14, col:17> 'int'
154059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:15> 'int' 12
155059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void *' <BitCast>
156059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <LValueToRValue>
157059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
158059b85e7SAaron Ballman 
159059b85e7SAaron Ballman   ::delete p;
160059b85e7SAaron Ballman   // CHECK: CXXDeleteExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'void' global Function 0x{{[^ ]*}} 'operator delete' 'void (void *) noexcept'
161059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
162059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
163059b85e7SAaron Ballman 
164059b85e7SAaron Ballman   delete [] p;
165059b85e7SAaron Ballman   // CHECK: CXXDeleteExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:13> 'void' array Function 0x{{[^ ]*}} 'operator delete[]' 'void (void *) noexcept'
166059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
167059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:13> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
168059b85e7SAaron Ballman }
169059b85e7SAaron Ballman 
170059b85e7SAaron Ballman void PostfixExpressions(S a, S *p, U<int> *r) {
171059b85e7SAaron Ballman   a.func(0);
172059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'void'
173059b85e7SAaron Ballman   // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:5> '<bound member function type>' .func 0x{{[^ ]*}}
174059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
175059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:10> 'int' 0
176059b85e7SAaron Ballman 
177059b85e7SAaron Ballman   p->func(0);
178059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'void'
179059b85e7SAaron Ballman   // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:6> '<bound member function type>' ->func 0x{{[^ ]*}}
180059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
181059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'
182059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 0
183059b85e7SAaron Ballman 
184059b85e7SAaron Ballman   // FIXME: there is no mention that this used the template keyword.
185059b85e7SAaron Ballman   p->template foo<int>();
186059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:24> 'int':'int'
187059b85e7SAaron Ballman   // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:22> '<bound member function type>' ->foo 0x{{[^ ]*}}
188059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
189059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'
190059b85e7SAaron Ballman 
191059b85e7SAaron Ballman   // FIXME: there is no mention that this used the template keyword.
192059b85e7SAaron Ballman   a.template foo<float>();
193059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:25> 'float':'float'
194059b85e7SAaron Ballman   // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:23> '<bound member function type>' .foo 0x{{[^ ]*}}
195059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
196059b85e7SAaron Ballman 
197059b85e7SAaron Ballman   p->~S();
198059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'void'
199059b85e7SAaron Ballman   // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:7> '<bound member function type>' ->~S 0x{{[^ ]*}}
200059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
201059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'
202059b85e7SAaron Ballman 
203059b85e7SAaron Ballman   a.~S();
204059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'void'
205059b85e7SAaron Ballman   // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:6> '<bound member function type>' .~S 0x{{[^ ]*}}
206059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
207059b85e7SAaron Ballman 
208059b85e7SAaron Ballman   // FIXME: there seems to be no way to distinguish the construct below from
209059b85e7SAaron Ballman   // the construct above.
210059b85e7SAaron Ballman   a.~decltype(a)();
211059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'void'
212059b85e7SAaron Ballman   // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:5> '<bound member function type>' .~S 0x{{[^ ]*}}
213059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
214059b85e7SAaron Ballman 
215059b85e7SAaron Ballman   // FIXME: similarly, there is no way to distinguish the construct below from
216059b85e7SAaron Ballman   // the p->~S() case.
217059b85e7SAaron Ballman   p->::S::~S();
218059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:14> 'void'
219059b85e7SAaron Ballman   // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:12> '<bound member function type>' ->~S 0x{{[^ ]*}}
220059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
221059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'
222059b85e7SAaron Ballman 
223059b85e7SAaron Ballman   // FIXME: there is no mention that this used the template keyword.
224059b85e7SAaron Ballman   r->template U<int>::~U();
225059b85e7SAaron Ballman   // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:26> 'void'
226059b85e7SAaron Ballman   // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:24> '<bound member function type>' ->~U 0x{{[^ ]*}}
227059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
228059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'U<int> *' lvalue ParmVar 0x{{[^ ]*}} 'r' 'U<int> *'
229059b85e7SAaron Ballman 
230059b85e7SAaron Ballman   typeid(a);
231059b85e7SAaron Ballman   // CHECK: CXXTypeidExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'const std::type_info' lvalue
232059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
233059b85e7SAaron Ballman 
234059b85e7SAaron Ballman   // FIXME: no type information is printed for the argument.
235059b85e7SAaron Ballman   typeid(S);
236059b85e7SAaron Ballman   // CHECK: CXXTypeidExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'const std::type_info' lvalue
237059b85e7SAaron Ballman }
238059b85e7SAaron Ballman 
239059b85e7SAaron Ballman template <typename... Ts>
240059b85e7SAaron Ballman void PrimaryExpressions(Ts... a) {
241059b85e7SAaron Ballman   struct V {
242059b85e7SAaron Ballman     void f() {
243059b85e7SAaron Ballman       this;
244059b85e7SAaron Ballman       // CHECK: CXXThisExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7> 'V *' this
245059b85e7SAaron Ballman       [this]{};
246059b85e7SAaron Ballman       // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7, col:14>
247059b85e7SAaron Ballman       // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:7> col:7 implicit class definition
248059b85e7SAaron Ballman       // CHECK-NEXT: DefinitionData lambda
249059b85e7SAaron Ballman       // CHECK-NEXT: DefaultConstructor
250059b85e7SAaron Ballman       // CHECK-NEXT: CopyConstructor
251059b85e7SAaron Ballman       // CHECK-NEXT: MoveConstructor
252059b85e7SAaron Ballman       // CHECK-NEXT: CopyAssignment
253059b85e7SAaron Ballman       // CHECK-NEXT: MoveAssignment
254059b85e7SAaron Ballman       // CHECK-NEXT: Destructor
255059b85e7SAaron Ballman       // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'V *'
256059b85e7SAaron Ballman       // CHECK-NEXT: CXXMethodDecl
257059b85e7SAaron Ballman       // CHECK-NEXT: CompoundStmt
258059b85e7SAaron Ballman       // CHECK-NEXT: CXXThisExpr 0x{{[^ ]*}} <col:8> 'V *' this
259059b85e7SAaron Ballman 
260059b85e7SAaron Ballman       [*this]{};
261059b85e7SAaron Ballman       // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7, col:15>
262059b85e7SAaron Ballman       // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:7> col:7 implicit class definition
263059b85e7SAaron Ballman       // CHECK-NEXT: DefinitionData lambda
264059b85e7SAaron Ballman       // CHECK-NEXT: DefaultConstructor
265059b85e7SAaron Ballman       // CHECK-NEXT: CopyConstructor
266059b85e7SAaron Ballman       // CHECK-NEXT: MoveConstructor
267059b85e7SAaron Ballman       // CHECK-NEXT: CopyAssignment
268059b85e7SAaron Ballman       // CHECK-NEXT: MoveAssignment
269059b85e7SAaron Ballman       // CHECK-NEXT: Destructor
270059b85e7SAaron Ballman       // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'V'
271059b85e7SAaron Ballman       // CHECK-NEXT: CXXMethodDecl
272059b85e7SAaron Ballman       // CHECK-NEXT: CompoundStmt
273059b85e7SAaron Ballman       // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:8> 'NULL TYPE'
274059b85e7SAaron Ballman       // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:8> '<dependent type>' prefix '*' cannot overflow
275059b85e7SAaron Ballman       // CHECK-NEXT: CXXThisExpr 0x{{[^ ]*}} <col:8> 'V *' this
276059b85e7SAaron Ballman     }
277059b85e7SAaron Ballman   };
278059b85e7SAaron Ballman 
279059b85e7SAaron Ballman   int b, c;
280059b85e7SAaron Ballman 
281059b85e7SAaron Ballman   [](){};
282059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> '(lambda at {{.*}}:[[@LINE-1]]:3)'
283059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
284059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
285059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
286059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
287059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
288059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
289059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
290059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
291059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:6, col:8> col:3 operator() 'auto () const' inline
292059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
293059b85e7SAaron Ballman   // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:8> col:3 implicit constexpr operator auto (*)() 'auto (*() const)()' inline
294059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:8> col:3 implicit __invoke 'auto ()' static inline
295059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:8>
296059b85e7SAaron Ballman 
297059b85e7SAaron Ballman   [a...]{};
298059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> '(lambda at {{.*}}:[[@LINE-1]]:3)'
299059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
300059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
301059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
302059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
303059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
304059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
305059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
306059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
307059b85e7SAaron Ballman   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'Ts...'
308059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:10> col:3 operator() 'auto () const -> auto' inline
309059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
310059b85e7SAaron Ballman   // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:4> 'NULL TYPE'
311059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts...' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
312059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:9, col:10>
313059b85e7SAaron Ballman 
314059b85e7SAaron Ballman   [=]{};
315059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> '(lambda at {{.*}}:[[@LINE-1]]:3)'
316059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
317059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
318059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
319059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
320059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
321059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
322059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
323059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
324059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:7> col:3 operator() 'auto () const -> auto' inline
325059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
326059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:6, col:7>
327059b85e7SAaron Ballman 
328059b85e7SAaron Ballman   [=] { return b; };
329059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)'
330059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
331059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
332059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
333059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
334059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
335059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
336059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
337059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
338059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:19> col:3 operator() 'auto () const -> auto' inline
339059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
340059b85e7SAaron Ballman   // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>
341059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
342059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:19>
343059b85e7SAaron Ballman   // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>
344059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
345059b85e7SAaron Ballman 
346059b85e7SAaron Ballman   [&]{};
347059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> '(lambda at {{.*}}:[[@LINE-1]]:3)'
348059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
349059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
350059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
351059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
352059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
353059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
354059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
355059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
356059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:7> col:3 operator() 'auto () const -> auto' inline
357059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
358059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:6, col:7>
359059b85e7SAaron Ballman 
360059b85e7SAaron Ballman   [&] { return c; };
361059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)'
362059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
363059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
364059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
365059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
366059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
367059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
368059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
369059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
370059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:19> col:3 operator() 'auto () const -> auto' inline
371059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
372059b85e7SAaron Ballman   // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>
373059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
374059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:19>
375059b85e7SAaron Ballman   // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>
376059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
377059b85e7SAaron Ballman 
378059b85e7SAaron Ballman   [b, &c]{ return b + c; };
379059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:26> '(lambda at {{.*}}:[[@LINE-1]]:3)'
380059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
381059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
382059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
383059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
384059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
385059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
386059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
387059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
388059b85e7SAaron Ballman   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'int'
389059b85e7SAaron Ballman   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'int &'
390059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:9, col:26> col:3 operator() 'auto () const -> auto' inline
391059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
392059b85e7SAaron Ballman   // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:12, col:23>
393059b85e7SAaron Ballman   // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '+'
394059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
395059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
396059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
397059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
398059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
399059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
400059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
401059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:10, col:26>
402059b85e7SAaron Ballman   // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:12, col:23>
403059b85e7SAaron Ballman   // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '+'
404059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
405059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
406059b85e7SAaron Ballman   // CHECK-NEXT: ImplicitCastExpr
407059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
408059b85e7SAaron Ballman 
409059b85e7SAaron Ballman   [a..., x = 12]{};
410059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)'
411059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
412059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
413059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
414059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
415059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
416059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
417059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
418059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
419059b85e7SAaron Ballman   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'Ts...'
420059b85e7SAaron Ballman   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:10> col:10 implicit 'int':'int'
421059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:16, col:18> col:3 operator() 'auto () const -> auto' inline
422059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
423059b85e7SAaron Ballman   // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:4> 'NULL TYPE'
424059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts...' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
425059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 12
426059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18>
427059b85e7SAaron Ballman 
428059b85e7SAaron Ballman   []() constexpr {};
429059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)'
430059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
431059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
432059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
433059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
434059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
435059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
436059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
437059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
438059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:19> col:3 constexpr operator() 'auto () const' inline
439059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
440059b85e7SAaron Ballman   // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:19> col:3 implicit constexpr operator auto (*)() 'auto (*() const)()' inline
441059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:19> col:3 implicit __invoke 'auto ()' static inline
442059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:18, col:19>
443059b85e7SAaron Ballman 
444059b85e7SAaron Ballman   []() mutable {};
445059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> '(lambda at {{.*}}:[[@LINE-1]]:3)'
446059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
447059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
448059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
449059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
450059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
451059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
452059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
453059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
454059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:17> col:3 operator() 'auto ()' inline
455059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
456059b85e7SAaron Ballman   // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:17> col:3 implicit constexpr operator auto (*)() 'auto (*() const)()' inline
457059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:17> col:3 implicit __invoke 'auto ()' static inline
458059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:16, col:17>
459059b85e7SAaron Ballman 
460059b85e7SAaron Ballman   []() noexcept {};
461059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)'
462059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
463059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
464059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
465059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
466059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
467059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
468059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
469059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
470059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:18> col:3 operator() 'auto () const noexcept' inline
471059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
472059b85e7SAaron Ballman   // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit constexpr operator auto (*)() noexcept 'auto (*() const)() noexcept' inline
473059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit __invoke 'auto () noexcept' static inline
474059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18>
475059b85e7SAaron Ballman 
476059b85e7SAaron Ballman   []() -> int { return 0; };
477059b85e7SAaron Ballman   // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:27> '(lambda at {{.*}}:[[@LINE-1]]:3)'
478059b85e7SAaron Ballman   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
479059b85e7SAaron Ballman   // CHECK-NEXT: DefinitionData lambda
480059b85e7SAaron Ballman   // CHECK-NEXT: DefaultConstructor
481059b85e7SAaron Ballman   // CHECK-NEXT: CopyConstructor
482059b85e7SAaron Ballman   // CHECK-NEXT: MoveConstructor
483059b85e7SAaron Ballman   // CHECK-NEXT: CopyAssignment
484059b85e7SAaron Ballman   // CHECK-NEXT: MoveAssignment
485059b85e7SAaron Ballman   // CHECK-NEXT: Destructor
486059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:11, col:27> col:3 operator() 'auto () const -> int' inline
487059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt
488059b85e7SAaron Ballman   // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:17, col:24>
489059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:24> 'int' 0
490059b85e7SAaron Ballman   // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:27> col:3 implicit constexpr operator int (*)() 'auto (*() const)() -> int' inline
491059b85e7SAaron Ballman   // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:27> col:3 implicit __invoke 'auto () -> int' static inline
492059b85e7SAaron Ballman   // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:15, col:27>
493059b85e7SAaron Ballman   // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:17, col:24>
494059b85e7SAaron Ballman   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:24> 'int' 0
495059b85e7SAaron Ballman 
496059b85e7SAaron Ballman   (a + ...);
497059b85e7SAaron Ballman   // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> '<dependent type>'
498059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts...' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
499059b85e7SAaron Ballman   // CHECK-NEXT: <<<NULL>>>
500059b85e7SAaron Ballman 
501059b85e7SAaron Ballman   (... + a);
502059b85e7SAaron Ballman   // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> '<dependent type>'
503059b85e7SAaron Ballman   // CHECK-NEXT: <<<NULL>>>
504059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'Ts...' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
505059b85e7SAaron Ballman 
506059b85e7SAaron Ballman   (a + ... + b);
507059b85e7SAaron Ballman   // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:15> '<dependent type>'
508059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts...' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
509059b85e7SAaron Ballman   // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
510059b85e7SAaron Ballman }
511*5cdc2cdaSEric Fiselier 
512*5cdc2cdaSEric Fiselier 
513*5cdc2cdaSEric Fiselier namespace NS {
514*5cdc2cdaSEric Fiselier struct X {};
515*5cdc2cdaSEric Fiselier void f(X);
516*5cdc2cdaSEric Fiselier void y(...);
517*5cdc2cdaSEric Fiselier } // namespace NS
518*5cdc2cdaSEric Fiselier 
519*5cdc2cdaSEric Fiselier // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}ADLCall 'void ()'
520*5cdc2cdaSEric Fiselier void ADLCall() {
521*5cdc2cdaSEric Fiselier   NS::X x;
522*5cdc2cdaSEric Fiselier   // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}}
523*5cdc2cdaSEric Fiselier   f(x);
524*5cdc2cdaSEric Fiselier   // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}}
525*5cdc2cdaSEric Fiselier   y(x);
526*5cdc2cdaSEric Fiselier }
527*5cdc2cdaSEric Fiselier 
528*5cdc2cdaSEric Fiselier // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall 'void ()'
529*5cdc2cdaSEric Fiselier void NonADLCall() {
530*5cdc2cdaSEric Fiselier   NS::X x;
531*5cdc2cdaSEric Fiselier   // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}}
532*5cdc2cdaSEric Fiselier   NS::f(x);
533*5cdc2cdaSEric Fiselier }
534*5cdc2cdaSEric Fiselier 
535*5cdc2cdaSEric Fiselier // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall2 'void ()'
536*5cdc2cdaSEric Fiselier void NonADLCall2() {
537*5cdc2cdaSEric Fiselier   NS::X x;
538*5cdc2cdaSEric Fiselier   using NS::f;
539*5cdc2cdaSEric Fiselier   // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}}
540*5cdc2cdaSEric Fiselier   f(x);
541*5cdc2cdaSEric Fiselier   // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}}
542*5cdc2cdaSEric Fiselier   y(x);
543*5cdc2cdaSEric Fiselier }
544*5cdc2cdaSEric Fiselier 
545*5cdc2cdaSEric Fiselier namespace test_adl_call_three {
546*5cdc2cdaSEric Fiselier using namespace NS;
547*5cdc2cdaSEric Fiselier // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall3 'void ()'
548*5cdc2cdaSEric Fiselier void NonADLCall3() {
549*5cdc2cdaSEric Fiselier   X x;
550*5cdc2cdaSEric Fiselier   // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}}
551*5cdc2cdaSEric Fiselier   f(x);
552*5cdc2cdaSEric Fiselier }
553*5cdc2cdaSEric Fiselier } // namespace test_adl_call_three