Clang Project

clang_source_code/test/AST/sourceranges.cpp
1// RUN: %clang_cc1 -triple i686-mingw32 -ast-dump %s | FileCheck %s
2// RUN: %clang_cc1 -triple i686-mingw32 -std=c++1z -ast-dump %s | FileCheck %s -check-prefix=CHECK-1Z
3
4template<class T>
5class P {
6 public:
7  P(T* t) {}
8};
9
10namespace foo {
11class A { public: A(int = 0) {} };
12enum B {};
13typedef int C;
14}
15
16// CHECK: VarDecl {{0x[0-9a-fA-F]+}} <line:[[@LINE+1]]:1, col:36> col:15 ImplicitConstrArray 'foo::A [2]'
17static foo::A ImplicitConstrArray[2];
18
19int main() {
20  // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::A *'
21  P<foo::A> p14 = new foo::A;
22  // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::B *'
23  P<foo::B> p24 = new foo::B;
24  // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::C *'
25  P<foo::C> pr4 = new foo::C;
26}
27
28foo::A getName() {
29  // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}} <col:10, col:17> 'foo::A'
30  return foo::A();
31}
32
33void destruct(foo::A *a1, foo::A *a2, P<int> *p1) {
34  // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:8> '<bound member function type>' ->~A
35  a1->~A();
36  // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:16> '<bound member function type>' ->~A
37  a2->foo::A::~A();
38  // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:13> '<bound member function type>' ->~P
39  p1->~P<int>();
40}
41
42struct D {
43  D(int);
44  ~D();
45};
46
47void construct() {
48  using namespace foo;
49  A a = A(12);
50  // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}} <col:9, col:13> 'foo::A' 'void (int){{( __attribute__\(\(thiscall\)\))?}}'
51  D d = D(12);
52  // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}} <col:9, col:13> 'D' 'void (int){{( __attribute__\(\(thiscall\)\))?}}'
53}
54
55namespace PR38987 {
56struct A { A(); };
57template <class T> void f() { T{}; }
58template void f<A>();
59// CHECK: CXXTemporaryObjectExpr {{.*}} <col:31, col:33> 'PR38987::A':'PR38987::A'
60}
61
62void abort() __attribute__((noreturn));
63
64namespace std {
65typedef decltype(sizeof(int)) size_t;
66
67template <typename E> struct initializer_list {
68  const E *p;
69  size_t n;
70  initializer_list(const E *p, size_t n) : p(p), n(n) {}
71};
72
73template <typename F, typename S> struct pair {
74  F f;
75  S s;
76  pair(const F &f, const S &s) : f(f), s(s) {}
77};
78
79struct string {
80  const char *str;
81  string() { abort(); }
82  string(const char *S) : str(S) {}
83  ~string() { abort(); }
84};
85
86template<typename K, typename V>
87struct map {
88  using T = pair<K, V>;
89  map(initializer_list<T> i, const string &s = string()) {}
90  ~map() { abort(); }
91};
92
93}; // namespace std
94
95#if __cplusplus >= 201703L
96// CHECK-1Z: FunctionDecl {{.*}} construct_with_init_list
97std::map<int, int> construct_with_init_list() {
98  // CHECK-1Z-NEXT: CompoundStmt
99  // CHECK-1Z-NEXT: ReturnStmt {{.*}} <line:[[@LINE+5]]:3, col:35
100  // CHECK-1Z-NEXT: ExprWithCleanups {{.*}} <col:10, col:35
101  // CHECK-1Z-NEXT: CXXBindTemporaryExpr {{.*}} <col:10, col:35
102  // CHECK-1Z-NEXT: CXXTemporaryObjectExpr {{.*}} <col:10, col:35
103  // CHECK-1Z-NEXT: CXXStdInitializerListExpr {{.*}} <col:28, col:35
104  return std::map<int, int>{{0, 0}};
105}
106
107// CHECK-1Z: NamespaceDecl {{.*}} in_class_init
108namespace in_class_init {
109  struct A {};
110
111  // CHECK-1Z: CXXRecordDecl {{.*}} struct B definition
112  struct B {
113    // CHECK-1Z: FieldDecl {{.*}} a 'in_class_init::A'
114    // CHECK-1Z-NEXT: InitListExpr {{.*}} <col:11, col:12
115    A a = {};
116  };
117}
118
119// CHECK-1Z: NamespaceDecl {{.*}} delegating_constructor_init
120namespace delegating_constructor_init {
121  struct A {};
122
123  struct B : A {
124    A a;
125    B(A a) : a(a) {}
126  };
127
128  // CHECK-1Z: CXXRecordDecl {{.*}} struct C definition
129  struct C : B {
130    // CHECK-1Z: CXXConstructorDecl {{.*}} C
131    // CHECK-1Z-NEXT: CXXCtorInitializer 'delegating_constructor_init::B'
132    // CHECK-1Z-NEXT: CXXConstructExpr {{.*}} <col:11, col:15
133    // CHECK-1Z-NEXT: InitListExpr {{.*}} <col:13, col:14
134    C() : B({}) {};
135  };
136}
137
138// CHECK-1Z: NamespaceDecl {{.*}} new_init
139namespace new_init {
140  void A() {
141    // CHECK-1Z: CXXNewExpr {{.*}} <line:[[@LINE+2]]:5, col:14
142    // CHECK-1Z-NEXT: InitListExpr {{.*}} <col:12, col:14
143    new int{0};
144  }
145}
146#endif
147