| // Test without serialization: |
| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 -ast-dump %s \ |
| // RUN: | FileCheck --strict-whitespace %s |
| // |
| // Test with serialization: |
| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 -emit-pch -o %t %s |
| // RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -Wno-unused-value -fcxx-exceptions -std=gnu++17 \ |
| // RUN: -include-pch %t -ast-dump-all /dev/null \ |
| // RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \ |
| // RUN: | FileCheck --strict-whitespace %s |
| |
| namespace std { |
| using size_t = decltype(sizeof(0)); |
| |
| class type_info { |
| public: |
| virtual ~type_info(); |
| bool operator==(const type_info& rhs) const noexcept; |
| bool operator!=(const type_info& rhs) const noexcept; |
| type_info(const type_info& rhs) = delete; // cannot be copied |
| type_info& operator=(const type_info& rhs) = delete; // cannot be copied |
| }; |
| |
| class bad_typeid { |
| public: |
| bad_typeid() noexcept; |
| bad_typeid(const bad_typeid&) noexcept; |
| virtual ~bad_typeid(); |
| bad_typeid& operator=(const bad_typeid&) noexcept; |
| const char* what() const noexcept; |
| }; |
| } // namespace std |
| void *operator new(std::size_t, void *ptr); |
| |
| struct S { |
| virtual ~S() = default; |
| |
| void func(int); |
| template <typename Ty> |
| Ty foo(); |
| |
| int i; |
| }; |
| |
| struct T : S {}; |
| |
| template <typename> |
| struct U {}; |
| |
| void Throw() { |
| throw 12; |
| // CHECK: CXXThrowExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'void' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:9> 'int' 12 |
| |
| throw; |
| // CHECK: CXXThrowExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'void' |
| } |
| |
| void PointerToMember(S obj1, S *obj2, int S::* data, void (S::*call)(int)) { |
| obj1.*data; |
| // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'int' lvalue '.*' |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'obj1' 'S' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:9> 'int S::*' lvalue ParmVar 0x{{[^ ]*}} 'data' 'int S::*' |
| |
| obj2->*data; |
| // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> 'int' lvalue '->*' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'obj2' 'S *' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'int S::*' lvalue ParmVar 0x{{[^ ]*}} 'data' 'int S::*' |
| |
| (obj1.*call)(12); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'void' |
| // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} <col:3, col:14> '<bound member function type>' |
| // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:4, col:10> '<bound member function type>' '.*' |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'S' lvalue ParmVar 0x{{[^ ]*}} 'obj1' 'S' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'void (S::*)(int)' lvalue ParmVar 0x{{[^ ]*}} 'call' 'void (S::*)(int)' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:16> 'int' 12 |
| |
| (obj2->*call)(12); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> 'void' |
| // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} <col:3, col:15> '<bound member function type>' |
| // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:4, col:11> '<bound member function type>' '->*' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'obj2' 'S *' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:11> 'void (S::*)(int)' lvalue ParmVar 0x{{[^ ]*}} 'call' 'void (S::*)(int)' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:17> 'int' 12 |
| } |
| |
| void Casting(const S *s) { |
| // FIXME: The cast expressions contain "struct S" instead of "S". |
| |
| const_cast<S *>(s); |
| // CHECK: CXXConstCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:20> 'S *' const_cast<struct S *> <NoOp> |
| // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:19> 'const S *' <LValueToRValue> part_of_explicit_cast |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *' |
| |
| static_cast<const T *>(s); |
| // CHECK: CXXStaticCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:27> 'const T *' static_cast<const struct T *> <BaseToDerived (S)> |
| // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:26> 'const S *' <LValueToRValue> part_of_explicit_cast |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:26> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *' |
| |
| dynamic_cast<const T *>(s); |
| // CHECK: CXXDynamicCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:28> 'const T *' dynamic_cast<const struct T *> <Dynamic> |
| // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:27> 'const S *' <LValueToRValue> part_of_explicit_cast |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:27> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *' |
| |
| reinterpret_cast<const int *>(s); |
| // CHECK: CXXReinterpretCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:34> 'const int *' reinterpret_cast<const int *> <BitCast> |
| // CHECK-NEXT: ImplicitCastExpr 0x{{[^ ]*}} <col:33> 'const S *' <LValueToRValue> part_of_explicit_cast |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:33> 'const S *' lvalue ParmVar 0x{{[^ ]*}} 's' 'const S *' |
| } |
| |
| template <typename... Ts> |
| void UnaryExpressions(int *p) { |
| sizeof...(Ts); |
| // CHECK: SizeOfPackExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:15> 'unsigned long' 0x{{[^ ]*}} Ts |
| |
| noexcept(p - p); |
| // CHECK: CXXNoexceptExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> 'bool' |
| // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:12, col:16> 'long' '-' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *' |
| |
| ::new int; |
| // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'int *' global Function 0x{{[^ ]*}} 'operator new' 'void *(unsigned long)' |
| |
| new (int); |
| // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(unsigned long)' |
| |
| new int{12}; |
| // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:13> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(unsigned long)' |
| // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:10, col:13> 'int' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 12 |
| |
| new int[2]; |
| // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'int *' array Function 0x{{[^ ]*}} 'operator new[]' 'void *(unsigned long)' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 2 |
| |
| new int[2]{1, 2}; |
| // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'int *' array Function 0x{{[^ ]*}} 'operator new[]' 'void *(unsigned long)' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 2 |
| // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:13, col:18> 'int[2]' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 1 |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:17> 'int' 2 |
| |
| new (p) int; |
| // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(std::size_t, void *)' |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void *' <BitCast> |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <LValueToRValue> |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *' |
| |
| new (p) int{12}; |
| // CHECK: CXXNewExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> 'int *' Function 0x{{[^ ]*}} 'operator new' 'void *(std::size_t, void *)' |
| // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:14, col:17> 'int' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:15> 'int' 12 |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void *' <BitCast> |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <LValueToRValue> |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *' |
| |
| ::delete p; |
| // CHECK: CXXDeleteExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'void' global Function 0x{{[^ ]*}} 'operator delete' 'void (void *) noexcept' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:12> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *' |
| |
| delete [] p; |
| // CHECK: CXXDeleteExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:13> 'void' array Function 0x{{[^ ]*}} 'operator delete[]' 'void (void *) noexcept' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:13> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'int *' |
| } |
| |
| void PostfixExpressions(S a, S *p, U<int> *r) { |
| a.func(0); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'void' |
| // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:5> '<bound member function type>' .func 0x{{[^ ]*}} |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:10> 'int' 0 |
| |
| p->func(0); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:12> 'void' |
| // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:6> '<bound member function type>' ->func 0x{{[^ ]*}} |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 0 |
| |
| // FIXME: there is no mention that this used the template keyword. |
| p->template foo<int>(); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:24> 'int':'int' |
| // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:22> '<bound member function type>' ->foo 0x{{[^ ]*}} |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *' |
| |
| // FIXME: there is no mention that this used the template keyword. |
| a.template foo<float>(); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:25> 'float':'float' |
| // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:23> '<bound member function type>' .foo 0x{{[^ ]*}} |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S' |
| |
| p->~S(); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'void' |
| // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:7> '<bound member function type>' ->~S 0x{{[^ ]*}} |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *' |
| |
| a.~S(); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'void' |
| // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:6> '<bound member function type>' .~S 0x{{[^ ]*}} |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S' |
| |
| // FIXME: there seems to be no way to distinguish the construct below from |
| // the construct above. |
| a.~decltype(a)(); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> 'void' |
| // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:5> '<bound member function type>' .~S 0x{{[^ ]*}} |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S' |
| |
| // FIXME: similarly, there is no way to distinguish the construct below from |
| // the p->~S() case. |
| p->::S::~S(); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:14> 'void' |
| // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:12> '<bound member function type>' ->~S 0x{{[^ ]*}} |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'S *' lvalue ParmVar 0x{{[^ ]*}} 'p' 'S *' |
| |
| // FIXME: there is no mention that this used the template keyword. |
| r->template U<int>::~U(); |
| // CHECK: CXXMemberCallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:26> 'void' |
| // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:24> '<bound member function type>' ->~U 0x{{[^ ]*}} |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'U<int> *' lvalue ParmVar 0x{{[^ ]*}} 'r' 'U<int> *' |
| |
| typeid(a); |
| // CHECK: CXXTypeidExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'const std::type_info' lvalue |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'S' lvalue ParmVar 0x{{[^ ]*}} 'a' 'S' |
| |
| // FIXME: no type information is printed for the argument. |
| typeid(S); |
| // CHECK: CXXTypeidExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'const std::type_info' lvalue |
| } |
| |
| template <typename... Ts> |
| void PrimaryExpressions(Ts... a) { |
| struct V { |
| void f() { |
| this; |
| // CHECK: CXXThisExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7> 'V *' this |
| [this]{}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7, col:14> |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:7> col:7 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'V *' |
| // CHECK-NEXT: ParenListExpr |
| // CHECK-NEXT: CXXThisExpr 0x{{[^ ]*}} <col:8> 'V *' this |
| |
| [*this]{}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:7, col:15> |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:7> col:7 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'V' |
| // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:8> 'NULL TYPE' |
| // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:8> '<dependent type>' prefix '*' cannot overflow |
| // CHECK-NEXT: CXXThisExpr 0x{{[^ ]*}} <col:8> 'V *' this |
| } |
| }; |
| |
| int b, c; |
| |
| [](){}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:6, col:8> col:3 operator() 'auto () const' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:8> col:3 implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:8> col:3 implicit __invoke 'auto ()' static inline |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:8> |
| |
| [](int a, ...){}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:16, col:18> col:3 operator() 'auto (int, ...) const' inline |
| // CHECK-NEXT: ParmVarDecl 0x{{[^ ]*}} <col:6, col:10> col:10 a 'int' |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit constexpr operator auto (*)(int, ...) 'auto (*() const noexcept)(int, ...)' inline |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit __invoke 'auto (int, ...)' static inline |
| // CHECK-NEXT: ParmVarDecl 0x{{[^ ]*}} <col:6, col:10> col:10 a 'int' |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18> |
| |
| [a...]{}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:10> col:3 operator() 'auto () const -> auto' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'Ts...' |
| // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:4> 'NULL TYPE' |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...' |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:9, col:10> |
| |
| [=]{}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:7> col:3 operator() 'auto () const -> auto' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:6, col:7> |
| |
| [=] { return b; }; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:19> col:3 operator() 'auto () const -> auto' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16> |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int' |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:19> |
| // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16> |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int' |
| |
| [&]{}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:7> col:3 operator() 'auto () const -> auto' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:6, col:7> |
| |
| [&] { return c; }; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:5, col:19> col:3 operator() 'auto () const -> auto' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16> |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int' |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:7, col:19> |
| // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:9, col:16> |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:16> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int' |
| |
| [b, &c]{ return b + c; }; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:26> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:9, col:26> col:3 operator() 'auto () const -> auto' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:12, col:23> |
| // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '+' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int' |
| // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'int' |
| // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:8> col:8 implicit 'int &' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int' lvalue Var 0x{{[^ ]*}} 'b' 'int' |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int' |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:10, col:26> |
| // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:12, col:23> |
| // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:19, col:23> 'int' '+' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'const int' lvalue Var 0x{{[^ ]*}} 'b' 'int' |
| // CHECK-NEXT: ImplicitCastExpr |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:23> 'int' lvalue Var 0x{{[^ ]*}} 'c' 'int' |
| |
| [a..., x = 12]{}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:16, col:18> col:3 operator() 'auto () const -> auto' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:4> col:4 implicit 'Ts...' |
| // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:10> col:10 implicit 'int':'int' |
| // CHECK-NEXT: ParenListExpr 0x{{[^ ]*}} <col:4> 'NULL TYPE' |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...' |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 12 |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18> |
| |
| []() constexpr {}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:19> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:19> col:3 constexpr operator() 'auto () const' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:19> col:3 implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:19> col:3 implicit __invoke 'auto ()' static inline |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:18, col:19> |
| |
| []() mutable {}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:17> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:17> col:3 operator() 'auto ()' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:17> col:3 implicit constexpr operator auto (*)() 'auto (*() const noexcept)()' inline |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:17> col:3 implicit __invoke 'auto ()' static inline |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:16, col:17> |
| |
| []() noexcept {}; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:18> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:8, col:18> col:3 operator() 'auto () const noexcept' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit constexpr operator auto (*)() noexcept 'auto (*() const noexcept)() noexcept' inline |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:18> col:3 implicit __invoke 'auto () noexcept' static inline |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:17, col:18> |
| |
| []() -> int { return 0; }; |
| // CHECK: LambdaExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:27> '(lambda at {{.*}}:[[@LINE-1]]:3)' |
| // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:3> col:3 implicit class definition |
| // CHECK-NEXT: DefinitionData lambda |
| // CHECK-NEXT: DefaultConstructor |
| // CHECK-NEXT: CopyConstructor |
| // CHECK-NEXT: MoveConstructor |
| // CHECK-NEXT: CopyAssignment |
| // CHECK-NEXT: MoveAssignment |
| // CHECK-NEXT: Destructor |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:11, col:27> col:3 operator() 'auto () const -> int' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:17, col:24> |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:24> 'int' 0 |
| // CHECK-NEXT: CXXConversionDecl 0x{{[^ ]*}} <col:3, col:27> col:3 implicit constexpr operator int (*)() 'auto (*() const noexcept)() -> int' inline |
| // CHECK-NEXT: CXXMethodDecl 0x{{[^ ]*}} <col:3, col:27> col:3 implicit __invoke 'auto () -> int' static inline |
| // CHECK-NEXT: CompoundStmt 0x{{[^ ]*}} <col:15, col:27> |
| // CHECK-NEXT: ReturnStmt 0x{{[^ ]*}} <col:17, col:24> |
| // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:24> 'int' 0 |
| |
| (a + ...); |
| // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> '<dependent type>' |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...' |
| // CHECK-NEXT: <<<NULL>>> |
| |
| (... + a); |
| // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> '<dependent type>' |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...' |
| |
| (a + ... + b); |
| // CHECK: CXXFoldExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:15> '<dependent type>' |
| // CHECK-NEXT: <<<NULL>>> |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'Ts' lvalue ParmVar 0x{{[^ ]*}} 'a' 'Ts...' |
| // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:14> 'int' lvalue Var 0x{{[^ ]*}} 'b' 'int' |
| } |
| |
| |
| namespace NS { |
| struct X {}; |
| void f(X); |
| void y(...); |
| } // namespace NS |
| |
| // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}ADLCall 'void ()' |
| void ADLCall() { |
| NS::X x; |
| // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}} |
| f(x); |
| // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}} |
| y(x); |
| } |
| |
| // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall 'void ()' |
| void NonADLCall() { |
| NS::X x; |
| // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}} |
| NS::f(x); |
| } |
| |
| // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall2 'void ()' |
| void NonADLCall2() { |
| NS::X x; |
| using NS::f; |
| // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}} |
| f(x); |
| // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void' adl{{$}} |
| y(x); |
| } |
| |
| namespace test_adl_call_three { |
| using namespace NS; |
| // CHECK-LABEL: FunctionDecl 0x{{[^ ]*}} {{.*}}NonADLCall3 'void ()' |
| void NonADLCall3() { |
| X x; |
| // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE+1]]:{{[^>]+}}> 'void'{{$}} |
| f(x); |
| } |
| } // namespace test_adl_call_three |