599 lines · cpp
1// Test without serialization:2// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 -ast-dump %s \3// RUN: | FileCheck --strict-whitespace %s4//5// Test with serialization:6// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 -emit-pch -o %t %s7// RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 \8// RUN: -include-pch %t -ast-dump-all /dev/null \9// RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \10// RUN: | FileCheck --strict-whitespace %s11 12namespace std {13using size_t = decltype(sizeof(0));14 15class type_info {16public:17 virtual ~type_info();18 bool operator==(const type_info& rhs) const noexcept;19 bool operator!=(const type_info& rhs) const noexcept;20 type_info(const type_info& rhs) = delete; // cannot be copied21 type_info& operator=(const type_info& rhs) = delete; // cannot be copied22};23 24class bad_typeid {25public:26 bad_typeid() noexcept;27 bad_typeid(const bad_typeid&) noexcept;28 virtual ~bad_typeid();29 bad_typeid& operator=(const bad_typeid&) noexcept;30 const char* what() const noexcept;31};32} // namespace std33void *operator new(std::size_t, void *ptr);34 35struct S {36 virtual ~S() = default;37 38 void func(int);39 template <typename Ty>40 Ty foo();41 42 int i;43};44 45struct T : S {};46 47template <typename>48struct U {};49 50void Throw() {51 throw 12;52 // CHECK: CXXThrowExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'void'53 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:9> 'int' 1254 55 throw;56 // CHECK: CXXThrowExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'void'57}58 59void PointerToMember(S obj1, S *obj2, int S::* data, void (S::*call)(int)) {60 obj1.*data;61 // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'int' lvalue '.*'62 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'obj1' 'S'63 // CHECK-NEXT: ImplicitCastExpr64 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:9> 'int S::*' lvalue ParmVar 0x{{[^ ]*}} 'data' 'int S::*'65 66 obj2->*data;67 // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> 'int' lvalue '->*'68 // CHECK-NEXT: ImplicitCastExpr69 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'obj2' 'S *'70 // CHECK-NEXT: ImplicitCastExpr71 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'int S::*' lvalue ParmVar 0x{{[^ ]*}} 'data' 'int S::*'72 73 (obj1.*call)(12);74 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'void'75 // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} <col:3, col:14> '<bound member function type>'76 // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:4, col:10> '<bound member function type>' '.*'77 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'S' lvalue ParmVar 0x{{[^ ]*}} 'obj1' 'S'78 // CHECK-NEXT: ImplicitCastExpr79 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'void (S::*)(int)' lvalue ParmVar 0x{{[^ ]*}} 'call' 'void (S::*)(int)'80 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:16> 'int' 1281 82 (obj2->*call)(12);83 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> 'void'84 // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} <col:3, col:15> '<bound member function type>'85 // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:4, col:11> '<bound member function type>' '->*'86 // CHECK-NEXT: ImplicitCastExpr87 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'obj2' 'S *'88 // CHECK-NEXT: ImplicitCastExpr89 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> 'void (S::*)(int)' lvalue ParmVar 0x{{[^ ]*}} 'call' 'void (S::*)(int)'90 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:17> 'int' 1291}92 93void Casting(const S *s) {94 const_cast<S *>(s);95 // CHECK: CXXConstCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:20> 'S *' const_cast<S *> <NoOp>96 // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:19> 'const S *' <LValueToRValue> part_of_explicit_cast97 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'98 99 static_cast<const T *>(s);100 // CHECK: CXXStaticCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:27> 'const T *' static_cast<const T *> <BaseToDerived (S)>101 // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:26> 'const S *' <LValueToRValue> part_of_explicit_cast102 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:26> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'103 104 dynamic_cast<const T *>(s);105 // CHECK: CXXDynamicCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:28> 'const T *' dynamic_cast<const T *> <Dynamic>106 // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:27> 'const S *' <LValueToRValue> part_of_explicit_cast107 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:27> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'108 109 reinterpret_cast<const int *>(s);110 // CHECK: CXXReinterpretCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:34> 'const int *' reinterpret_cast<const int *> <BitCast>111 // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:33> 'const S *' <LValueToRValue> part_of_explicit_cast112 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:33> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *'113}114 115template <typename... Ts>116void UnaryExpressions(int *p) {117 sizeof...(Ts);118 // CHECK: SizeOfPackExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:15> '__size_t':'unsigned long' 0x{{[^ ]*}} Ts119 120 noexcept(p - p);121 // CHECK: CXXNoexceptExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> 'bool'122 // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:12, col:16> '__ptrdiff_t':'long' '-'123 // CHECK-NEXT: ImplicitCastExpr124 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'125 // CHECK-NEXT: ImplicitCastExpr126 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'127 128 ::new int;129 // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'int *' global Function 0x{{[^ ]*}} 'operator new' 'void *(__size_t)'130 131 new (int);132 // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(__size_t)'133 134 new int{12};135 // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:13> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(__size_t)'136 // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:10, col:13> 'int'137 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 12138 139 new int[2];140 // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'int *' array Function 0x{{[^ ]*}} 'operator new[]' 'void *(__size_t)'141 // CHECK-NEXT: ImplicitCastExpr142 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 2143 144 new int[2]{1, 2};145 // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'int *' array Function 0x{{[^ ]*}} 'operator new[]' 'void *(__size_t)'146 // CHECK-NEXT: ImplicitCastExpr147 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 2148 // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:13, col:18> 'int[2]'149 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 1150 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:17> 'int' 2151 152 new (p) int;153 // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(std::size_t, void *)'154 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void *' <BitCast>155 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <LValueToRValue>156 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'157 158 new (p) int{12};159 // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(std::size_t, void *)'160 // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:14, col:17> 'int'161 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:15> 'int' 12162 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void *' <BitCast>163 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <LValueToRValue>164 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'165 166 ::delete p;167 // CHECK: CXXDeleteExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'void' global Function 0x{{[^ ]*}} 'operator delete' 'void (void *, __size_t) noexcept'168 // CHECK-NEXT: ImplicitCastExpr169 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'170 171 delete [] p;172 // CHECK: CXXDeleteExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:13> 'void' array Function 0x{{[^ ]*}} 'operator delete[]' 'void (void *) noexcept'173 // CHECK-NEXT: ImplicitCastExpr174 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:13> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *'175}176 177void PostfixExpressions(S a, S *p, U<int> *r) {178 a.func(0);179 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'void'180 // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:5> '<bound member function type>' .func 0x{{[^ ]*}}181 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'182 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:10> 'int' 0183 184 p->func(0);185 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'void'186 // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:6> '<bound member function type>' ->func 0x{{[^ ]*}}187 // CHECK-NEXT: ImplicitCastExpr188 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'189 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 0190 191 // FIXME: there is no mention that this used the template keyword.192 p->template foo<int>();193 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:24> 'int'194 // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:22> '<bound member function type>' ->foo 0x{{[^ ]*}}195 // CHECK-NEXT: ImplicitCastExpr196 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'197 198 // FIXME: there is no mention that this used the template keyword.199 a.template foo<float>();200 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:25> 'float'201 // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:23> '<bound member function type>' .foo 0x{{[^ ]*}}202 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'203 204 p->~S();205 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'void'206 // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:7> '<bound member function type>' ->~S 0x{{[^ ]*}}207 // CHECK-NEXT: ImplicitCastExpr208 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'209 210 a.~S();211 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'void'212 // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:6> '<bound member function type>' .~S 0x{{[^ ]*}}213 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'214 215 // FIXME: there seems to be no way to distinguish the construct below from216 // the construct above.217 a.~decltype(a)();218 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'void'219 // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:5> '<bound member function type>' .~S 0x{{[^ ]*}}220 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'221 222 p->::S::~S();223 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:14> 'void'224 // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:12> '<bound member function type>' ->~S 0x{{[^ ]*}}225 // CHECK-NEXT: NestedNameSpecifier TypeSpec '::S'226 // CHECK-NEXT: ImplicitCastExpr227 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *'228 229 r->template U<int>::~U();230 // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:26> 'void'231 // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:24> '<bound member function type>' ->~U 0x{{[^ ]*}}232 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'template U<int>':'U<int>'233 // CHECK-NEXT: ImplicitCastExpr234 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'U<int> *' lvalue ParmVar 0x{{[^ ]*}} 'r' 'U<int> *'235 236 typeid(a);237 // CHECK: CXXTypeidExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'const std::type_info' lvalue238 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S'239 240 // FIXME: no type information is printed for the argument.241 typeid(S);242 // CHECK: CXXTypeidExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'const std::type_info' lvalue243}244 245template <typename... Ts>246void PrimaryExpressions(Ts... a) {247 struct V {248 void f() {249 this;250 // CHECK: CXXThisExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7> 'V *' this251 [this]{};252 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7, col:14>253 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:7> col:7 implicit class definition254 // CHECK-NEXT: DefinitionData lambda255 // CHECK-NEXT: DefaultConstructor256 // CHECK-NEXT: CopyConstructor257 // CHECK-NEXT: MoveConstructor258 // CHECK-NEXT: CopyAssignment259 // CHECK-NEXT: MoveAssignment260 // CHECK-NEXT: Destructor261 // CHECK-NEXT: CXXMethodDecl262 // CHECK-NEXT: CompoundStmt263 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'V *'264 // CHECK-NEXT: ParenListExpr265 // CHECK-NEXT: CXXThisExpr 0x{{[^ ]*}} <col:8> 'V *' this266 267 [*this]{};268 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7, col:15>269 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:7> col:7 implicit class definition270 // CHECK-NEXT: DefinitionData lambda271 // CHECK-NEXT: DefaultConstructor272 // CHECK-NEXT: CopyConstructor273 // CHECK-NEXT: MoveConstructor274 // CHECK-NEXT: CopyAssignment275 // CHECK-NEXT: MoveAssignment276 // CHECK-NEXT: Destructor277 // CHECK-NEXT: CXXMethodDecl278 // CHECK-NEXT: CompoundStmt279 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'V'280 // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:8> 'NULL TYPE'281 // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:8> 'V' lvalue prefix '*' cannot overflow282 // CHECK-NEXT: CXXThisExpr 0x{{[^ ]*}} <col:8> 'V *' this283 }284 };285 286 int b, c;287 288 [](){};289 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> '(lambda at {{.*}}:[[@LINE-1]]:3)'290 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition291 // CHECK-NEXT: DefinitionData lambda292 // CHECK-NEXT: DefaultConstructor293 // CHECK-NEXT: CopyConstructor294 // CHECK-NEXT: MoveConstructor295 // CHECK-NEXT: CopyAssignment296 // CHECK-NEXT: MoveAssignment297 // CHECK-NEXT: Destructor298 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:6, col:8> col:3 operator() 'auto () const' inline299 // CHECK-NEXT: CompoundStmt300 // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:8> col:3 implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline301 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:8> col:3 implicit __invoke 'auto ()' static inline302 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:8>303 304 [](int a, ...){};305 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)'306 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition307 // CHECK-NEXT: DefinitionData lambda308 // CHECK-NEXT: DefaultConstructor309 // CHECK-NEXT: CopyConstructor310 // CHECK-NEXT: MoveConstructor311 // CHECK-NEXT: CopyAssignment312 // CHECK-NEXT: MoveAssignment313 // CHECK-NEXT: Destructor314 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:16, col:18> col:3 operator() 'auto (int, ...) const' inline315 // CHECK-NEXT: ParmVarDecl 0x{{[^ ]*}} <col:6, col:10> col:10 a 'int'316 // CHECK-NEXT: CompoundStmt317 // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit constexpr operator auto (*)(int, ...) 'auto (*() const noexcept)(int, ...)' inline318 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit __invoke 'auto (int, ...)' static inline319 // CHECK-NEXT: ParmVarDecl 0x{{[^ ]*}} <col:6, col:10> col:10 a 'int'320 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18>321 322 [a...]{};323 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> '(lambda at {{.*}}:[[@LINE-1]]:3)'324 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition325 // CHECK-NEXT: DefinitionData lambda326 // CHECK-NEXT: DefaultConstructor327 // CHECK-NEXT: CopyConstructor328 // CHECK-NEXT: MoveConstructor329 // CHECK-NEXT: CopyAssignment330 // CHECK-NEXT: MoveAssignment331 // CHECK-NEXT: Destructor332 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:10> col:3 operator() 'auto () const -> auto' inline333 // CHECK-NEXT: CompoundStmt334 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'Ts...'335 // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:4> 'NULL TYPE'336 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'337 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:9, col:10>338 339 [=]{};340 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> '(lambda at {{.*}}:[[@LINE-1]]:3)'341 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition342 // CHECK-NEXT: DefinitionData lambda343 // CHECK-NEXT: DefaultConstructor344 // CHECK-NEXT: CopyConstructor345 // CHECK-NEXT: MoveConstructor346 // CHECK-NEXT: CopyAssignment347 // CHECK-NEXT: MoveAssignment348 // CHECK-NEXT: Destructor349 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:7> col:3 operator() 'auto () const -> auto' inline350 // CHECK-NEXT: CompoundStmt351 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:6, col:7>352 353 [=] { return b; };354 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)'355 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition356 // CHECK-NEXT: DefinitionData lambda357 // CHECK-NEXT: DefaultConstructor358 // CHECK-NEXT: CopyConstructor359 // CHECK-NEXT: MoveConstructor360 // CHECK-NEXT: CopyAssignment361 // CHECK-NEXT: MoveAssignment362 // CHECK-NEXT: Destructor363 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:19> col:3 operator() 'auto () const -> auto' inline364 // CHECK-NEXT: CompoundStmt365 // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>366 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'367 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:19>368 // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>369 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'370 371 [&]{};372 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> '(lambda at {{.*}}:[[@LINE-1]]:3)'373 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition374 // CHECK-NEXT: DefinitionData lambda375 // CHECK-NEXT: DefaultConstructor376 // CHECK-NEXT: CopyConstructor377 // CHECK-NEXT: MoveConstructor378 // CHECK-NEXT: CopyAssignment379 // CHECK-NEXT: MoveAssignment380 // CHECK-NEXT: Destructor381 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:7> col:3 operator() 'auto () const -> auto' inline382 // CHECK-NEXT: CompoundStmt383 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:6, col:7>384 385 [&] { return c; };386 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)'387 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition388 // CHECK-NEXT: DefinitionData lambda389 // CHECK-NEXT: DefaultConstructor390 // CHECK-NEXT: CopyConstructor391 // CHECK-NEXT: MoveConstructor392 // CHECK-NEXT: CopyAssignment393 // CHECK-NEXT: MoveAssignment394 // CHECK-NEXT: Destructor395 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:19> col:3 operator() 'auto () const -> auto' inline396 // CHECK-NEXT: CompoundStmt397 // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>398 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'399 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:19>400 // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16>401 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'402 403 [b, &c]{ return b + c; };404 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:26> '(lambda at {{.*}}:[[@LINE-1]]:3)'405 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition406 // CHECK-NEXT: DefinitionData lambda407 // CHECK-NEXT: DefaultConstructor408 // CHECK-NEXT: CopyConstructor409 // CHECK-NEXT: MoveConstructor410 // CHECK-NEXT: CopyAssignment411 // CHECK-NEXT: MoveAssignment412 // CHECK-NEXT: Destructor413 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:9, col:26> col:3 operator() 'auto () const -> auto' inline414 // CHECK-NEXT: CompoundStmt415 // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:12, col:23>416 // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '+'417 // CHECK-NEXT: ImplicitCastExpr418 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'419 // CHECK-NEXT: ImplicitCastExpr420 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'421 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'int'422 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'int &'423 // CHECK-NEXT: ImplicitCastExpr424 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int' lvalue Var 0x{{[^ ]*}} 'b' 'int'425 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'426 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:10, col:26>427 // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:12, col:23>428 // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '+'429 // CHECK-NEXT: ImplicitCastExpr430 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int'431 // CHECK-NEXT: ImplicitCastExpr432 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int'433 434 [a..., x = 12]{};435 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)'436 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition437 // CHECK-NEXT: DefinitionData lambda438 // CHECK-NEXT: DefaultConstructor439 // CHECK-NEXT: CopyConstructor440 // CHECK-NEXT: MoveConstructor441 // CHECK-NEXT: CopyAssignment442 // CHECK-NEXT: MoveAssignment443 // CHECK-NEXT: Destructor444 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:16, col:18> col:3 operator() 'auto () const -> auto' inline445 // CHECK-NEXT: CompoundStmt446 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'Ts...'447 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:10> col:10 implicit 'int'448 // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:4> 'NULL TYPE'449 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'450 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 12451 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18>452 453 []() constexpr {};454 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)'455 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition456 // CHECK-NEXT: DefinitionData lambda457 // CHECK-NEXT: DefaultConstructor458 // CHECK-NEXT: CopyConstructor459 // CHECK-NEXT: MoveConstructor460 // CHECK-NEXT: CopyAssignment461 // CHECK-NEXT: MoveAssignment462 // CHECK-NEXT: Destructor463 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:19> col:3 constexpr operator() 'auto () const' inline464 // CHECK-NEXT: CompoundStmt465 // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:19> col:3 implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline466 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:19> col:3 implicit constexpr __invoke 'auto ()' static inline467 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:18, col:19>468 469 []() mutable {};470 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> '(lambda at {{.*}}:[[@LINE-1]]:3)'471 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition472 // CHECK-NEXT: DefinitionData lambda473 // CHECK-NEXT: DefaultConstructor474 // CHECK-NEXT: CopyConstructor475 // CHECK-NEXT: MoveConstructor476 // CHECK-NEXT: CopyAssignment477 // CHECK-NEXT: MoveAssignment478 // CHECK-NEXT: Destructor479 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:17> col:3 operator() 'auto ()' inline480 // CHECK-NEXT: CompoundStmt481 // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:17> col:3 implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline482 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:17> col:3 implicit __invoke 'auto ()' static inline483 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:16, col:17>484 485 []() noexcept {};486 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)'487 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition488 // CHECK-NEXT: DefinitionData lambda489 // CHECK-NEXT: DefaultConstructor490 // CHECK-NEXT: CopyConstructor491 // CHECK-NEXT: MoveConstructor492 // CHECK-NEXT: CopyAssignment493 // CHECK-NEXT: MoveAssignment494 // CHECK-NEXT: Destructor495 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:18> col:3 operator() 'auto () const noexcept' inline496 // CHECK-NEXT: CompoundStmt497 // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit constexpr operator auto (*)() noexcept 'auto (*() const noexcept)() noexcept' inline498 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit __invoke 'auto () noexcept' static inline499 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18>500 501 []() -> int { return 0; };502 // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:27> '(lambda at {{.*}}:[[@LINE-1]]:3)'503 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition504 // CHECK-NEXT: DefinitionData lambda505 // CHECK-NEXT: DefaultConstructor506 // CHECK-NEXT: CopyConstructor507 // CHECK-NEXT: MoveConstructor508 // CHECK-NEXT: CopyAssignment509 // CHECK-NEXT: MoveAssignment510 // CHECK-NEXT: Destructor511 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:11, col:27> col:3 operator() 'auto () const -> int' inline512 // CHECK-NEXT: CompoundStmt513 // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:17, col:24>514 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:24> 'int' 0515 // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:27> col:3 implicit constexpr operator int (*)() 'auto (*() const noexcept)() -> int' inline516 // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:27> col:3 implicit __invoke 'auto () -> int' static inline517 // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:15, col:27>518 // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:17, col:24>519 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:24> 'int' 0520 521 (a + ...);522 // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> '<dependent type>'523 // CHECK-NEXT: <<<NULL>>>524 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'525 // CHECK-NEXT: <<<NULL>>>526 527 (... + a);528 // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> '<dependent type>'529 // CHECK-NEXT: <<<NULL>>>530 // CHECK-NEXT: <<<NULL>>>531 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'532 533 (a + ... + b);534 // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:15> '<dependent type>'535 // CHECK-NEXT: <<<NULL>>>536 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...'537 // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int' lvalue Var 0x{{[^ ]*}} 'b' 'int'538}539 540 541namespace NS {542struct X {};543void f(X);544void y(...);545} // namespace NS546 547// CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}ADLCall 'void ()'548void ADLCall() {549 NS::X x;550 // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}}551 f(x);552 // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}}553 y(x);554}555 556// CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall 'void ()'557void NonADLCall() {558 NS::X x;559 // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}}560 NS::f(x);561}562 563// CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall2 'void ()'564void NonADLCall2() {565 NS::X x;566 using NS::f;567 // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}}568 f(x);569 // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}}570 y(x);571}572 573namespace test_adl_call_three {574using namespace NS;575// CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall3 'void ()'576void NonADLCall3() {577 X x;578 // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}}579 f(x);580}581} // namespace test_adl_call_three582 583namespace GH35300 {584struct Sock {};585void leakNewFn() { new struct Sock; }586// CHECK: CXXNewExpr {{.*}} <col:20, col:31> 'struct Sock *'587}588 589namespace GH143711 {590struct S {591 S(int, int);592};593 594void f() {595 S(S(0, 1));596}597// CHECK: CXXTemporaryObjectExpr {{.*}} <col:5, col:11> 'S' 'void (int, int)'598}599