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