1ecbf2f5fSBruno Ricci // Test without serialization:
2ecbf2f5fSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 -ast-dump %s \
3ecbf2f5fSBruno Ricci // RUN: | FileCheck --strict-whitespace %s
4ecbf2f5fSBruno Ricci //
5ecbf2f5fSBruno Ricci // Test with serialization:
6ecbf2f5fSBruno Ricci // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 -emit-pch -o %t %s
7ecbf2f5fSBruno Ricci // RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 \
8ecbf2f5fSBruno Ricci // RUN: -include-pch %t -ast-dump-all /dev/null \
9ecbf2f5fSBruno Ricci // RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \
10ecbf2f5fSBruno Ricci // RUN: | FileCheck --strict-whitespace %s
11059b85e7SAaron Ballman
12059b85e7SAaron Ballman namespace std {
13059b85e7SAaron Ballman using size_t = decltype(sizeof(0));
14059b85e7SAaron Ballman
15059b85e7SAaron Ballman class type_info {
16059b85e7SAaron Ballman public:
17059b85e7SAaron Ballman virtual ~type_info();
18059b85e7SAaron Ballman bool operator==(const type_info& rhs) const noexcept;
19059b85e7SAaron Ballman bool operator!=(const type_info& rhs) const noexcept;
20059b85e7SAaron Ballman type_info(const type_info& rhs) = delete; // cannot be copied
21059b85e7SAaron Ballman type_info& operator=(const type_info& rhs) = delete; // cannot be copied
22059b85e7SAaron Ballman };
23059b85e7SAaron Ballman
24059b85e7SAaron Ballman class bad_typeid {
25059b85e7SAaron Ballman public:
26059b85e7SAaron Ballman bad_typeid() noexcept;
27059b85e7SAaron Ballman bad_typeid(const bad_typeid&) noexcept;
28059b85e7SAaron Ballman virtual ~bad_typeid();
29059b85e7SAaron Ballman bad_typeid& operator=(const bad_typeid&) noexcept;
30059b85e7SAaron Ballman const char* what() const noexcept;
31059b85e7SAaron Ballman };
32059b85e7SAaron Ballman } // namespace std
33059b85e7SAaron Ballman void *operator new(std::size_t, void *ptr);
34059b85e7SAaron Ballman
35059b85e7SAaron Ballman struct S {
36059b85e7SAaron Ballman virtual ~S() = default;
37059b85e7SAaron Ballman
38059b85e7SAaron Ballman void func(int);
39059b85e7SAaron Ballman template <typename Ty>
40059b85e7SAaron Ballman Ty foo();
41059b85e7SAaron Ballman
42059b85e7SAaron Ballman int i;
43059b85e7SAaron Ballman };
44059b85e7SAaron Ballman
45059b85e7SAaron Ballman struct T : S {};
46059b85e7SAaron Ballman
47059b85e7SAaron Ballman template <typename>
48059b85e7SAaron Ballman struct U {};
49059b85e7SAaron Ballman
Throw()50059b85e7SAaron Ballman void Throw() {
51059b85e7SAaron Ballman throw 12;
52059b85e7SAaron Ballman // CHECK: CXXThrowExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'void'
53059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:9> 'int' 12
54059b85e7SAaron Ballman
55059b85e7SAaron Ballman throw;
56059b85e7SAaron Ballman // CHECK: CXXThrowExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'void'
57059b85e7SAaron Ballman }
58059b85e7SAaron Ballman
PointerToMember(S obj1,S * obj2,int S::* data,void (S::* call)(int))59059b85e7SAaron Ballman void PointerToMember(S obj1, S *obj2, int S::* data, void (S::*call)(int)) {
60059b85e7SAaron Ballman obj1.*data;
61059b85e7SAaron Ballman // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'int' lvalue '.*'
62*888673b6SJonas Devlieghere // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'obj1' 'S'
63059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
64059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:9> 'int S::*' lvalue ParmVar 0x{{[^ ]*}} 'data' 'int S::*'
65059b85e7SAaron Ballman
66059b85e7SAaron Ballman obj2->*data;
67059b85e7SAaron Ballman // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> 'int' lvalue '->*'
68059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
69059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'obj2' 'S *'
70059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
71059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'int S::*' lvalue ParmVar 0x{{[^ ]*}} 'data' 'int S::*'
72059b85e7SAaron Ballman
73059b85e7SAaron Ballman (obj1.*call)(12);
74059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'void'
75059b85e7SAaron Ballman // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} <col:3, col:14> '<bound member function type>'
76059b85e7SAaron Ballman // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:4, col:10> '<bound member function type>' '.*'
77*888673b6SJonas Devlieghere // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'S' lvalue ParmVar 0x{{[^ ]*}} 'obj1' 'S'
78059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
79059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'void (S::*)(int)' lvalue ParmVar 0x{{[^ ]*}} 'call' 'void (S::*)(int)'
80059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:16> 'int' 12
81059b85e7SAaron Ballman
82059b85e7SAaron Ballman (obj2->*call)(12);
83059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> 'void'
84059b85e7SAaron Ballman // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} <col:3, col:15> '<bound member function type>'
85059b85e7SAaron Ballman // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:4, col:11> '<bound member function type>' '->*'
86059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
87059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'obj2' 'S *'
88059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
89059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> 'void (S::*)(int)' lvalue ParmVar 0x{{[^ ]*}} 'call' 'void (S::*)(int)'
90059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:17> 'int' 12
91059b85e7SAaron Ballman }
92059b85e7SAaron Ballman
Casting(const S * s)93059b85e7SAaron Ballman void Casting(const S *s) {
94*888673b6SJonas Devlieghere // FIXME: The cast expressions contain "struct S" instead of "S".
95*888673b6SJonas Devlieghere
96059b85e7SAaron Ballman const_cast<S *>(s);
97*888673b6SJonas Devlieghere // CHECK: CXXConstCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:20> 'S *' const_cast<struct S *> <NoOp>
98059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:19> 'const S *' <LValueToRValue> part_of_explicit_cast
99059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'
100059b85e7SAaron Ballman
101059b85e7SAaron Ballman static_cast<const T *>(s);
102*888673b6SJonas Devlieghere // CHECK: CXXStaticCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:27> 'const T *' static_cast<const struct T *> <BaseToDerived (S)>
103059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:26> 'const S *' <LValueToRValue> part_of_explicit_cast
104059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:26> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'
105059b85e7SAaron Ballman
106059b85e7SAaron Ballman dynamic_cast<const T *>(s);
107*888673b6SJonas Devlieghere // CHECK: CXXDynamicCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:28> 'const T *' dynamic_cast<const struct T *> <Dynamic>
108059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:27> 'const S *' <LValueToRValue> part_of_explicit_cast
109059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:27> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'
110059b85e7SAaron Ballman
111059b85e7SAaron Ballman reinterpret_cast<const int *>(s);
112059b85e7SAaron Ballman // CHECK: CXXReinterpretCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:34> 'const int *' reinterpret_cast<const int *> <BitCast>
113059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:33> 'const S *' <LValueToRValue> part_of_explicit_cast
114059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:33> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'
115059b85e7SAaron Ballman }
116059b85e7SAaron Ballman
117059b85e7SAaron Ballman template <typename... Ts>
UnaryExpressions(int * p)118059b85e7SAaron Ballman void UnaryExpressions(int *p) {
119059b85e7SAaron Ballman sizeof...(Ts);
120059b85e7SAaron Ballman // CHECK: SizeOfPackExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:15> 'unsigned long' 0x{{[^ ]*}} Ts
121059b85e7SAaron Ballman
122059b85e7SAaron Ballman noexcept(p - p);
123059b85e7SAaron Ballman // CHECK: CXXNoexceptExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> 'bool'
124059b85e7SAaron Ballman // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:12, col:16> 'long' '-'
125059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
126059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
127059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
128059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
129059b85e7SAaron Ballman
130059b85e7SAaron Ballman ::new int;
131059b85e7SAaron Ballman // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'int *' global Function 0x{{[^ ]*}} 'operator new' 'void *(unsigned long)'
132059b85e7SAaron Ballman
133059b85e7SAaron Ballman new (int);
134059b85e7SAaron Ballman // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(unsigned long)'
135059b85e7SAaron Ballman
136059b85e7SAaron Ballman new int{12};
137059b85e7SAaron Ballman // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:13> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(unsigned long)'
138059b85e7SAaron Ballman // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:10, col:13> 'int'
139059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 12
140059b85e7SAaron Ballman
141059b85e7SAaron Ballman new int[2];
142059b85e7SAaron Ballman // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'int *' array Function 0x{{[^ ]*}} 'operator new[]' 'void *(unsigned long)'
143059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
144059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 2
145059b85e7SAaron Ballman
146059b85e7SAaron Ballman new int[2]{1, 2};
147059b85e7SAaron Ballman // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'int *' array Function 0x{{[^ ]*}} 'operator new[]' 'void *(unsigned long)'
148059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
149059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 2
150059b85e7SAaron Ballman // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:13, col:18> 'int[2]'
151059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 1
152059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:17> 'int' 2
153059b85e7SAaron Ballman
154059b85e7SAaron Ballman new (p) int;
155059b85e7SAaron Ballman // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(std::size_t, void *)'
156059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void *' <BitCast>
157059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <LValueToRValue>
158059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
159059b85e7SAaron Ballman
160059b85e7SAaron Ballman new (p) int{12};
161059b85e7SAaron Ballman // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(std::size_t, void *)'
162059b85e7SAaron Ballman // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:14, col:17> 'int'
163059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:15> 'int' 12
164059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void *' <BitCast>
165059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <LValueToRValue>
166059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
167059b85e7SAaron Ballman
168059b85e7SAaron Ballman ::delete p;
169059b85e7SAaron Ballman // CHECK: CXXDeleteExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'void' global Function 0x{{[^ ]*}} 'operator delete' 'void (void *) noexcept'
170059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
171059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
172059b85e7SAaron Ballman
173059b85e7SAaron Ballman delete [] p;
174059b85e7SAaron Ballman // CHECK: CXXDeleteExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:13> 'void' array Function 0x{{[^ ]*}} 'operator delete[]' 'void (void *) noexcept'
175059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
176059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:13> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'
177059b85e7SAaron Ballman }
178059b85e7SAaron Ballman
PostfixExpressions(S a,S * p,U<int> * r)179059b85e7SAaron Ballman void PostfixExpressions(S a, S *p, U<int> *r) {
180059b85e7SAaron Ballman a.func(0);
181059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'void'
182059b85e7SAaron Ballman // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:5> '<bound member function type>' .func 0x{{[^ ]*}}
183*888673b6SJonas Devlieghere // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
184059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:10> 'int' 0
185059b85e7SAaron Ballman
186059b85e7SAaron Ballman p->func(0);
187059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'void'
188059b85e7SAaron Ballman // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:6> '<bound member function type>' ->func 0x{{[^ ]*}}
189059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
190059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'
191059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 0
192059b85e7SAaron Ballman
193059b85e7SAaron Ballman // FIXME: there is no mention that this used the template keyword.
194059b85e7SAaron Ballman p->template foo<int>();
195059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:24> 'int':'int'
196059b85e7SAaron Ballman // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:22> '<bound member function type>' ->foo 0x{{[^ ]*}}
197059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
198059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'
199059b85e7SAaron Ballman
200059b85e7SAaron Ballman // FIXME: there is no mention that this used the template keyword.
201059b85e7SAaron Ballman a.template foo<float>();
202059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:25> 'float':'float'
203059b85e7SAaron Ballman // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:23> '<bound member function type>' .foo 0x{{[^ ]*}}
204*888673b6SJonas Devlieghere // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
205059b85e7SAaron Ballman
206059b85e7SAaron Ballman p->~S();
207059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'void'
208059b85e7SAaron Ballman // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:7> '<bound member function type>' ->~S 0x{{[^ ]*}}
209059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
210059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'
211059b85e7SAaron Ballman
212059b85e7SAaron Ballman a.~S();
213059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'void'
214059b85e7SAaron Ballman // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:6> '<bound member function type>' .~S 0x{{[^ ]*}}
215*888673b6SJonas Devlieghere // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
216059b85e7SAaron Ballman
217059b85e7SAaron Ballman // FIXME: there seems to be no way to distinguish the construct below from
218059b85e7SAaron Ballman // the construct above.
219059b85e7SAaron Ballman a.~decltype(a)();
220059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'void'
221059b85e7SAaron Ballman // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:5> '<bound member function type>' .~S 0x{{[^ ]*}}
222*888673b6SJonas Devlieghere // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
223059b85e7SAaron Ballman
224059b85e7SAaron Ballman // FIXME: similarly, there is no way to distinguish the construct below from
225059b85e7SAaron Ballman // the p->~S() case.
226059b85e7SAaron Ballman p->::S::~S();
227059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:14> 'void'
228059b85e7SAaron Ballman // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:12> '<bound member function type>' ->~S 0x{{[^ ]*}}
229059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
230059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'
231059b85e7SAaron Ballman
232059b85e7SAaron Ballman // FIXME: there is no mention that this used the template keyword.
233059b85e7SAaron Ballman r->template U<int>::~U();
234059b85e7SAaron Ballman // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:26> 'void'
235059b85e7SAaron Ballman // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:24> '<bound member function type>' ->~U 0x{{[^ ]*}}
236059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
237059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'U<int> *' lvalue ParmVar 0x{{[^ ]*}} 'r' 'U<int> *'
238059b85e7SAaron Ballman
239059b85e7SAaron Ballman typeid(a);
240059b85e7SAaron Ballman // CHECK: CXXTypeidExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'const std::type_info' lvalue
241*888673b6SJonas Devlieghere // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'
242059b85e7SAaron Ballman
243059b85e7SAaron Ballman // FIXME: no type information is printed for the argument.
244059b85e7SAaron Ballman typeid(S);
245059b85e7SAaron Ballman // CHECK: CXXTypeidExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'const std::type_info' lvalue
246059b85e7SAaron Ballman }
247059b85e7SAaron Ballman
248059b85e7SAaron Ballman template <typename... Ts>
PrimaryExpressions(Ts...a)249059b85e7SAaron Ballman void PrimaryExpressions(Ts... a) {
250059b85e7SAaron Ballman struct V {
251059b85e7SAaron Ballman void f() {
252059b85e7SAaron Ballman this;
253059b85e7SAaron Ballman // CHECK: CXXThisExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7> 'V *' this
254059b85e7SAaron Ballman [this]{};
255059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7, col:14>
256059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:7> col:7 implicit class definition
257059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
258059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
259059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
260059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
261059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
262059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
263059b85e7SAaron Ballman // CHECK-NEXT: Destructor
264059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl
265059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
26630116531SRichard Smith // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'V *'
267e518235aSRichard Smith // CHECK-NEXT: ParenListExpr
268b5a45bb7SRichard Smith // CHECK-NEXT: CXXThisExpr 0x{{[^ ]*}} <col:8> 'V *' this
269059b85e7SAaron Ballman
270059b85e7SAaron Ballman [*this]{};
271059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7, col:15>
272059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:7> col:7 implicit class definition
273059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
274059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
275059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
276059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
277059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
278059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
279059b85e7SAaron Ballman // CHECK-NEXT: Destructor
280059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl
281059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
28230116531SRichard Smith // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'V'
283059b85e7SAaron Ballman // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:8> 'NULL TYPE'
284059b85e7SAaron Ballman // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:8> '<dependent type>' prefix '*' cannot overflow
285b5a45bb7SRichard Smith // CHECK-NEXT: CXXThisExpr 0x{{[^ ]*}} <col:8> 'V *' this
286059b85e7SAaron Ballman }
287059b85e7SAaron Ballman };
288059b85e7SAaron Ballman
289059b85e7SAaron Ballman int b, c;
290059b85e7SAaron Ballman
291059b85e7SAaron Ballman [](){};
292059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> '(lambda at {{.*}}:[[@LINE-1]]:3)'
293059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
294059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
295059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
296059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
297059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
298059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
299059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
300059b85e7SAaron Ballman // CHECK-NEXT: Destructor
301059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:6, col:8> col:3 operator() 'auto () const' inline
302059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
303a2b04ad5SAaron Ballman // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:8> col:3 implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
304059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:8> col:3 implicit __invoke 'auto ()' static inline
305059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:8>
306059b85e7SAaron Ballman
307fc86a998SAaron Ballman [](int a, ...){};
308fc86a998SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)'
309fc86a998SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
310fc86a998SAaron Ballman // CHECK-NEXT: DefinitionData lambda
311fc86a998SAaron Ballman // CHECK-NEXT: DefaultConstructor
312fc86a998SAaron Ballman // CHECK-NEXT: CopyConstructor
313fc86a998SAaron Ballman // CHECK-NEXT: MoveConstructor
314fc86a998SAaron Ballman // CHECK-NEXT: CopyAssignment
315fc86a998SAaron Ballman // CHECK-NEXT: MoveAssignment
316fc86a998SAaron Ballman // CHECK-NEXT: Destructor
317fc86a998SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:16, col:18> col:3 operator() 'auto (int, ...) const' inline
318fc86a998SAaron Ballman // CHECK-NEXT: ParmVarDecl 0x{{[^ ]*}} <col:6, col:10> col:10 a 'int'
319fc86a998SAaron Ballman // CHECK-NEXT: CompoundStmt
320a2b04ad5SAaron Ballman // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit constexpr operator auto (*)(int, ...) 'auto (*() const noexcept)(int, ...)' inline
321fc86a998SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit __invoke 'auto (int, ...)' static inline
322fc86a998SAaron Ballman // CHECK-NEXT: ParmVarDecl 0x{{[^ ]*}} <col:6, col:10> col:10 a 'int'
323fc86a998SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18>
324fc86a998SAaron Ballman
325059b85e7SAaron Ballman [a...]{};
326059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> '(lambda at {{.*}}:[[@LINE-1]]:3)'
327059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
328059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
329059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
330059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
331059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
332059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
333059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
334059b85e7SAaron Ballman // CHECK-NEXT: Destructor
335059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:10> col:3 operator() 'auto () const -> auto' inline
336059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
33730116531SRichard Smith // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'Ts...'
338059b85e7SAaron Ballman // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:4> 'NULL TYPE'
339c36b03e3SRichard Smith // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
340059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:9, col:10>
341059b85e7SAaron Ballman
342059b85e7SAaron Ballman [=]{};
343059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> '(lambda at {{.*}}:[[@LINE-1]]:3)'
344059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
345059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
346059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
347059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
348059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
349059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
350059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
351059b85e7SAaron Ballman // CHECK-NEXT: Destructor
352059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:7> col:3 operator() 'auto () const -> auto' inline
353059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
354059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:6, col:7>
355059b85e7SAaron Ballman
356059b85e7SAaron Ballman [=] { return b; };
357059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)'
358059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
359059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
360059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
361059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
362059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
363059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
364059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
365059b85e7SAaron Ballman // CHECK-NEXT: Destructor
366059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:19> col:3 operator() 'auto () const -> auto' inline
367059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
368059b85e7SAaron Ballman // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>
369059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
370059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:19>
371059b85e7SAaron Ballman // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>
372059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
373059b85e7SAaron Ballman
374059b85e7SAaron Ballman [&]{};
375059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> '(lambda at {{.*}}:[[@LINE-1]]:3)'
376059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
377059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
378059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
379059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
380059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
381059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
382059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
383059b85e7SAaron Ballman // CHECK-NEXT: Destructor
384059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:7> col:3 operator() 'auto () const -> auto' inline
385059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
386059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:6, col:7>
387059b85e7SAaron Ballman
388059b85e7SAaron Ballman [&] { return c; };
389059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)'
390059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
391059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
392059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
393059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
394059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
395059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
396059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
397059b85e7SAaron Ballman // CHECK-NEXT: Destructor
398059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:19> col:3 operator() 'auto () const -> auto' inline
399059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
400059b85e7SAaron Ballman // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>
401059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
402059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:19>
403059b85e7SAaron Ballman // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>
404059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
405059b85e7SAaron Ballman
406059b85e7SAaron Ballman [b, &c]{ return b + c; };
407059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:26> '(lambda at {{.*}}:[[@LINE-1]]:3)'
408059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
409059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
410059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
411059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
412059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
413059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
414059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
415059b85e7SAaron Ballman // CHECK-NEXT: Destructor
416059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:9, col:26> col:3 operator() 'auto () const -> auto' inline
417059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
418059b85e7SAaron Ballman // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:12, col:23>
419059b85e7SAaron Ballman // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '+'
420059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
421059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
422059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
423059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
42430116531SRichard Smith // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'int'
42530116531SRichard Smith // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'int &'
426059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
427059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
428059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
429059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:10, col:26>
430059b85e7SAaron Ballman // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:12, col:23>
431059b85e7SAaron Ballman // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '+'
432059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
433059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
434059b85e7SAaron Ballman // CHECK-NEXT: ImplicitCastExpr
435059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'
436059b85e7SAaron Ballman
437059b85e7SAaron Ballman [a..., x = 12]{};
438059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)'
439059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
440059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
441059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
442059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
443059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
444059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
445059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
446059b85e7SAaron Ballman // CHECK-NEXT: Destructor
447059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:16, col:18> col:3 operator() 'auto () const -> auto' inline
448059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
44930116531SRichard Smith // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'Ts...'
45030116531SRichard Smith // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:10> col:10 implicit 'int':'int'
451059b85e7SAaron Ballman // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:4> 'NULL TYPE'
452c36b03e3SRichard Smith // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
453059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 12
454059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18>
455059b85e7SAaron Ballman
456059b85e7SAaron Ballman []() constexpr {};
457059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)'
458059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
459059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
460059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
461059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
462059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
463059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
464059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
465059b85e7SAaron Ballman // CHECK-NEXT: Destructor
466059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:19> col:3 constexpr operator() 'auto () const' inline
467059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
468a2b04ad5SAaron Ballman // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:19> col:3 implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
469059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:19> col:3 implicit __invoke 'auto ()' static inline
470059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:18, col:19>
471059b85e7SAaron Ballman
472059b85e7SAaron Ballman []() mutable {};
473059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> '(lambda at {{.*}}:[[@LINE-1]]:3)'
474059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
475059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
476059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
477059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
478059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
479059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
480059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
481059b85e7SAaron Ballman // CHECK-NEXT: Destructor
482059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:17> col:3 operator() 'auto ()' inline
483059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
484a2b04ad5SAaron Ballman // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:17> col:3 implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline
485059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:17> col:3 implicit __invoke 'auto ()' static inline
486059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:16, col:17>
487059b85e7SAaron Ballman
488059b85e7SAaron Ballman []() noexcept {};
489059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)'
490059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
491059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
492059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
493059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
494059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
495059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
496059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
497059b85e7SAaron Ballman // CHECK-NEXT: Destructor
498059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:18> col:3 operator() 'auto () const noexcept' inline
499059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
500a2b04ad5SAaron Ballman // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit constexpr operator auto (*)() noexcept 'auto (*() const noexcept)() noexcept' inline
501059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit __invoke 'auto () noexcept' static inline
502059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18>
503059b85e7SAaron Ballman
504059b85e7SAaron Ballman []() -> int { return 0; };
505059b85e7SAaron Ballman // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:27> '(lambda at {{.*}}:[[@LINE-1]]:3)'
506059b85e7SAaron Ballman // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition
507059b85e7SAaron Ballman // CHECK-NEXT: DefinitionData lambda
508059b85e7SAaron Ballman // CHECK-NEXT: DefaultConstructor
509059b85e7SAaron Ballman // CHECK-NEXT: CopyConstructor
510059b85e7SAaron Ballman // CHECK-NEXT: MoveConstructor
511059b85e7SAaron Ballman // CHECK-NEXT: CopyAssignment
512059b85e7SAaron Ballman // CHECK-NEXT: MoveAssignment
513059b85e7SAaron Ballman // CHECK-NEXT: Destructor
514059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:11, col:27> col:3 operator() 'auto () const -> int' inline
515059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt
516059b85e7SAaron Ballman // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:17, col:24>
517059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:24> 'int' 0
518a2b04ad5SAaron Ballman // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:27> col:3 implicit constexpr operator int (*)() 'auto (*() const noexcept)() -> int' inline
519059b85e7SAaron Ballman // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:27> col:3 implicit __invoke 'auto () -> int' static inline
520059b85e7SAaron Ballman // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:15, col:27>
521059b85e7SAaron Ballman // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:17, col:24>
522059b85e7SAaron Ballman // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:24> 'int' 0
523059b85e7SAaron Ballman
524059b85e7SAaron Ballman (a + ...);
525059b85e7SAaron Ballman // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> '<dependent type>'
526ed5a18fcSRichard Smith // CHECK-NEXT: <<<NULL>>>
527c36b03e3SRichard Smith // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
528059b85e7SAaron Ballman // CHECK-NEXT: <<<NULL>>>
529059b85e7SAaron Ballman
530059b85e7SAaron Ballman (... + a);
531059b85e7SAaron Ballman // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> '<dependent type>'
532059b85e7SAaron Ballman // CHECK-NEXT: <<<NULL>>>
533ed5a18fcSRichard Smith // CHECK-NEXT: <<<NULL>>>
534c36b03e3SRichard Smith // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
535059b85e7SAaron Ballman
536059b85e7SAaron Ballman (a + ... + b);
537059b85e7SAaron Ballman // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:15> '<dependent type>'
538ed5a18fcSRichard Smith // CHECK-NEXT: <<<NULL>>>
539c36b03e3SRichard Smith // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'
540059b85e7SAaron Ballman // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int' lvalue Var 0x{{[^ ]*}} 'b' 'int'
541059b85e7SAaron Ballman }
5425cdc2cdaSEric Fiselier
5435cdc2cdaSEric Fiselier
5445cdc2cdaSEric Fiselier namespace NS {
5455cdc2cdaSEric Fiselier struct X {};
5465cdc2cdaSEric Fiselier void f(X);
5475cdc2cdaSEric Fiselier void y(...);
5485cdc2cdaSEric Fiselier } // namespace NS
5495cdc2cdaSEric Fiselier
5505cdc2cdaSEric Fiselier // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}ADLCall 'void ()'
ADLCall()5515cdc2cdaSEric Fiselier void ADLCall() {
5525cdc2cdaSEric Fiselier NS::X x;
5535cdc2cdaSEric Fiselier // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}}
5545cdc2cdaSEric Fiselier f(x);
5555cdc2cdaSEric Fiselier // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}}
5565cdc2cdaSEric Fiselier y(x);
5575cdc2cdaSEric Fiselier }
5585cdc2cdaSEric Fiselier
5595cdc2cdaSEric Fiselier // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall 'void ()'
NonADLCall()5605cdc2cdaSEric Fiselier void NonADLCall() {
5615cdc2cdaSEric Fiselier NS::X x;
5625cdc2cdaSEric Fiselier // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}}
5635cdc2cdaSEric Fiselier NS::f(x);
5645cdc2cdaSEric Fiselier }
5655cdc2cdaSEric Fiselier
5665cdc2cdaSEric Fiselier // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall2 'void ()'
NonADLCall2()5675cdc2cdaSEric Fiselier void NonADLCall2() {
5685cdc2cdaSEric Fiselier NS::X x;
5695cdc2cdaSEric Fiselier using NS::f;
5705cdc2cdaSEric Fiselier // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}}
5715cdc2cdaSEric Fiselier f(x);
5725cdc2cdaSEric Fiselier // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}}
5735cdc2cdaSEric Fiselier y(x);
5745cdc2cdaSEric Fiselier }
5755cdc2cdaSEric Fiselier
5765cdc2cdaSEric Fiselier namespace test_adl_call_three {
5775cdc2cdaSEric Fiselier using namespace NS;
5785cdc2cdaSEric Fiselier // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall3 'void ()'
NonADLCall3()5795cdc2cdaSEric Fiselier void NonADLCall3() {
5805cdc2cdaSEric Fiselier X x;
5815cdc2cdaSEric Fiselier // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}}
5825cdc2cdaSEric Fiselier f(x);
5835cdc2cdaSEric Fiselier }
5845cdc2cdaSEric Fiselier } // namespace test_adl_call_three
585