brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.8 KiB · 7a686b2 Raw
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