1 | typedef int T; |
2 | struct X { int a, b; }; |
3 | void f(int x) { |
4 | for (T y = x; T z = x; ++x) { |
5 | } |
6 | if (T *z2 = &x) { } |
7 | while (T *z3 = &x) { } |
8 | switch (T z4 = x) { |
9 | case 17: break; |
10 | } |
11 | } |
12 | |
13 | // Test handling of C++ base specifiers. |
14 | class A { |
15 | void doA(); |
16 | }; |
17 | |
18 | class B { |
19 | void doB(); |
20 | }; |
21 | |
22 | class C : public A, private B { |
23 | void doC(); |
24 | }; |
25 | |
26 | class D : virtual public C, virtual private A {}; |
27 | |
28 | namespace std { |
29 | class type_info { }; |
30 | } |
31 | |
32 | void test_exprs(C *c) { |
33 | int typeid_marker; |
34 | typeid(C); |
35 | typeid(c); |
36 | typedef int Integer; |
37 | Integer *int_ptr; |
38 | int_ptr->Integer::~Integer(); |
39 | } |
40 | |
41 | namespace N { |
42 | int f(int); |
43 | float f(float); |
44 | |
45 | template<typename T> T g(T); |
46 | template<typename T> T g(T*); |
47 | } |
48 | |
49 | template<typename T> |
50 | void test_dependent_exprs(T t) { |
51 | N::f(t); |
52 | typedef T type; |
53 | N::g<type>(t); |
54 | type::template f<type*>(t); |
55 | t->type::template f<type*>(); |
56 | } |
57 | |
58 | struct Y { |
59 | int f(int); |
60 | float f(float); |
61 | |
62 | template<typename T> T g(T); |
63 | template<typename T> T g(T*); |
64 | }; |
65 | |
66 | template<typename T> |
67 | void test_more_dependent_exprs(T t, Y y) { |
68 | y.Y::f(t); |
69 | typedef T type; |
70 | y.g<type>(t); |
71 | } |
72 | |
73 | struct Pair { |
74 | Pair(int, int); |
75 | }; |
76 | |
77 | void *operator new(__SIZE_TYPE__, void*) throw(); |
78 | |
79 | void test_more_exprs(void *mem, int i, int j) { |
80 | new (mem) Pair(i, j); |
81 | typedef int Integer; |
82 | (void)Integer(i); |
83 | (Integer)i; |
84 | Integer(); |
85 | } |
86 | |
87 | template<typename T> |
88 | void test_even_more_dependent_exprs(T t, Y y) { |
89 | typedef T type; |
90 | (void)type(t, y); |
91 | (void)__has_nothrow_assign(type); |
92 | } |
93 | |
94 | struct Base { |
95 | Base(int); |
96 | }; |
97 | |
98 | struct Derived : public Base { |
99 | Derived(int x); |
100 | int member; |
101 | }; |
102 | |
103 | Derived::Derived(int x) |
104 | : member(x), Base(x) { |
105 | } |
106 | |
107 | void considered_harmful(int x) { |
108 | start_over: |
109 | void *ptr = &&start_over; |
110 | if (x > 17) |
111 | goto *ptr; |
112 | else |
113 | goto start_over; |
114 | } |
115 | |
116 | void casts(int *ip) { |
117 | (void)reinterpret_cast<float *>(ip); |
118 | } |
119 | |
120 | // RUN: c-index-test -test-load-source all -fno-delayed-template-parsing -frtti %s | FileCheck %s |
121 | // CHECK: load-stmts.cpp:1:13: TypedefDecl=T:1:13 (Definition) Extent=[1:1 - 1:14] |
122 | // CHECK: load-stmts.cpp:2:8: StructDecl=X:2:8 (Definition) Extent=[2:1 - 2:23] |
123 | // CHECK: load-stmts.cpp:2:16: FieldDecl=a:2:16 (Definition) Extent=[2:12 - 2:17] |
124 | // CHECK: load-stmts.cpp:2:19: FieldDecl=b:2:19 (Definition) Extent=[2:12 - 2:20] |
125 | // CHECK: load-stmts.cpp:3:6: FunctionDecl=f:3:6 (Definition) Extent=[3:1 - 11:2] |
126 | // CHECK: load-stmts.cpp:3:12: ParmDecl=x:3:12 (Definition) Extent=[3:8 - 3:13] |
127 | // CHECK: load-stmts.cpp:4:10: VarDecl=y:4:10 (Definition) Extent=[4:8 - 4:15] |
128 | // CHECK: load-stmts.cpp:4:8: TypeRef=T:1:13 Extent=[4:8 - 4:9] |
129 | // CHECK: load-stmts.cpp:4:14: DeclRefExpr=x:3:12 Extent=[4:14 - 4:15] |
130 | // CHECK: load-stmts.cpp:4:19: VarDecl=z:4:19 (Definition) Extent=[4:17 - 4:24] |
131 | // CHECK: load-stmts.cpp:4:17: TypeRef=T:1:13 Extent=[4:17 - 4:18] |
132 | // CHECK: load-stmts.cpp:4:23: DeclRefExpr=x:3:12 Extent=[4:23 - 4:24] |
133 | // CHECK: load-stmts.cpp:4:19: UnexposedExpr=z:4:19 Extent=[4:19 - 4:20] |
134 | // CHECK: load-stmts.cpp:4:19: DeclRefExpr=z:4:19 Extent=[4:19 - 4:20] |
135 | // CHECK: load-stmts.cpp:4:26: UnaryOperator= Extent=[4:26 - 4:29] |
136 | // CHECK: load-stmts.cpp:4:28: DeclRefExpr=x:3:12 Extent=[4:28 - 4:29] |
137 | // CHECK: load-stmts.cpp:6:10: VarDecl=z2:6:10 (Definition) Extent=[6:7 - 6:17] |
138 | // CHECK: load-stmts.cpp:6:7: TypeRef=T:1:13 Extent=[6:7 - 6:8] |
139 | // CHECK: load-stmts.cpp:6:15: UnaryOperator= Extent=[6:15 - 6:17] |
140 | // CHECK: load-stmts.cpp:6:16: DeclRefExpr=x:3:12 Extent=[6:16 - 6:17] |
141 | // CHECK: load-stmts.cpp:6:10: UnexposedExpr=z2:6:10 Extent=[6:10 - 6:12] |
142 | // CHECK: load-stmts.cpp:6:10: DeclRefExpr=z2:6:10 Extent=[6:10 - 6:12] |
143 | // CHECK: load-stmts.cpp:7:13: VarDecl=z3:7:13 (Definition) Extent=[7:10 - 7:20] |
144 | // CHECK: load-stmts.cpp:7:10: TypeRef=T:1:13 Extent=[7:10 - 7:11] |
145 | // CHECK: load-stmts.cpp:7:18: UnaryOperator= Extent=[7:18 - 7:20] |
146 | // CHECK: load-stmts.cpp:7:19: DeclRefExpr=x:3:12 Extent=[7:19 - 7:20] |
147 | // CHECK: load-stmts.cpp:7:13: UnexposedExpr=z3:7:13 Extent=[7:13 - 7:15] |
148 | // CHECK: load-stmts.cpp:7:13: DeclRefExpr=z3:7:13 Extent=[7:13 - 7:15] |
149 | // CHECK: load-stmts.cpp:8:13: VarDecl=z4:8:13 (Definition) Extent=[8:11 - 8:19] |
150 | // CHECK: load-stmts.cpp:8:11: TypeRef=T:1:13 Extent=[8:11 - 8:12] |
151 | // CHECK: load-stmts.cpp:8:18: DeclRefExpr=x:3:12 Extent=[8:18 - 8:19] |
152 | // CHECK: load-stmts.cpp:8:13: DeclRefExpr=z4:8:13 Extent=[8:13 - 8:15] |
153 | // CHECK: load-stmts.cpp:9:8: IntegerLiteral= Extent=[9:8 - 9:10] |
154 | // CHECK: load-stmts.cpp:14:7: ClassDecl=A:14:7 (Definition) Extent=[14:1 - 16:2] |
155 | // CHECK: load-stmts.cpp:15:8: CXXMethod=doA:15:8 Extent=[15:3 - 15:13] |
156 | // CHECK: load-stmts.cpp:18:7: ClassDecl=B:18:7 (Definition) Extent=[18:1 - 20:2] |
157 | // CHECK: load-stmts.cpp:19:8: CXXMethod=doB:19:8 Extent=[19:3 - 19:13] |
158 | // CHECK: load-stmts.cpp:22:7: ClassDecl=C:22:7 (Definition) Extent=[22:1 - 24:2] |
159 | // CHECK: load-stmts.cpp:22:18: C++ base class specifier=class A:14:7 [access=public isVirtual=false] |
160 | // CHECK: load-stmts.cpp:22:29: C++ base class specifier=class B:18:7 [access=private isVirtual=false] |
161 | // CHECK: load-stmts.cpp:23:8: CXXMethod=doC:23:8 Extent=[23:3 - 23:13] |
162 | // CHECK: load-stmts.cpp:26:7: ClassDecl=D:26:7 (Definition) Extent=[26:1 - 26:49] |
163 | // CHECK: load-stmts.cpp:26:26: C++ base class specifier=class C:22:7 [access=public isVirtual=true] |
164 | // CHECK: load-stmts.cpp:26:45: C++ base class specifier=class A:14:7 [access=private isVirtual=true] |
165 | // CHECK: load-stmts.cpp:33:7: VarDecl=typeid_marker:33:7 (Definition) |
166 | // CHECK: load-stmts.cpp:34:10: TypeRef=class C:22:7 Extent=[34:10 - 34:11] |
167 | // CHECK: load-stmts.cpp:35:10: DeclRefExpr=c:32:20 Extent=[35:10 - 35:11] |
168 | // CHECK: load-stmts.cpp:37:12: VarDecl=int_ptr:37:12 (Definition) Extent=[37:3 - 37:19] |
169 | // CHECK: load-stmts.cpp:37:3: TypeRef=Integer:36:15 Extent=[37:3 - 37:10] |
170 | // CHECK: load-stmts.cpp:38:3: DeclRefExpr=int_ptr:37:12 Extent=[38:3 - 38:10] |
171 | // CHECK: load-stmts.cpp:38:12: TypeRef=Integer:36:15 Extent=[38:12 - 38:19] |
172 | // CHECK: load-stmts.cpp:38:22: TypeRef=Integer:36:15 Extent=[38:22 - 38:29] |
173 | // CHECK: load-stmts.cpp:50:6: FunctionTemplate=test_dependent_exprs:50:6 (Definition) |
174 | // CHECK: load-stmts.cpp:51:3: CallExpr= Extent=[51:3 - 51:10] |
175 | // CHECK: load-stmts.cpp:51:3: NamespaceRef=N:41:11 Extent=[51:3 - 51:4] |
176 | // CHECK: load-stmts.cpp:51:8: DeclRefExpr=t:50:29 Extent=[51:8 - 51:9] |
177 | // CHECK: load-stmts.cpp:52:13: TypedefDecl=type:52:13 (Definition) Extent=[52:3 - 52:17] |
178 | // CHECK: load-stmts.cpp:53:3: CallExpr= Extent=[53:3 - 53:16] |
179 | // CHECK: load-stmts.cpp:53:3: NamespaceRef=N:41:11 Extent=[53:3 - 53:4] |
180 | // CHECK: load-stmts.cpp:53:8: TypeRef=type:52:13 Extent=[53:8 - 53:12] |
181 | // CHECK: load-stmts.cpp:53:14: DeclRefExpr=t:50:29 Extent=[53:14 - 53:15] |
182 | // CHECK: load-stmts.cpp:54:3: CallExpr= Extent=[54:3 - 54:29] |
183 | // CHECK: load-stmts.cpp:54:3: TypeRef=type:52:13 Extent=[54:3 - 54:7] |
184 | // CHECK: load-stmts.cpp:54:20: TypeRef=type:52:13 Extent=[54:20 - 54:24] |
185 | // CHECK: load-stmts.cpp:54:27: DeclRefExpr=t:50:29 Extent=[54:27 - 54:28] |
186 | // CHECK: load-stmts.cpp:55:3: CallExpr= Extent=[55:3 - 55:31] |
187 | // CHECK: load-stmts.cpp:55:3: DeclRefExpr=t:50:29 Extent=[55:3 - 55:4] |
188 | // CHECK: load-stmts.cpp:55:23: TypeRef=type:52:13 Extent=[55:23 - 55:27] |
189 | // CHECK: load-stmts.cpp:67:6: FunctionTemplate=test_more_dependent_exprs:67:6 (Definition) |
190 | // CHECK: load-stmts.cpp:68:3: CallExpr= Extent=[68:3 - 68:12] |
191 | // CHECK: load-stmts.cpp:68:3: DeclRefExpr=y:67:39 Extent=[68:3 - 68:4] |
192 | // CHECK: load-stmts.cpp:68:5: TypeRef=struct Y:58:8 Extent=[68:5 - 68:6] |
193 | // CHECK: load-stmts.cpp:68:10: DeclRefExpr=t:67:34 Extent=[68:10 - 68:11] |
194 | // CHECK: load-stmts.cpp:70:3: CallExpr= Extent=[70:3 - 70:15] |
195 | // CHECK: load-stmts.cpp:70:3: DeclRefExpr=y:67:39 Extent=[70:3 - 70:4] |
196 | // CHECK: load-stmts.cpp:70:7: TypeRef=type:69:13 Extent=[70:7 - 70:11] |
197 | // CHECK: load-stmts.cpp:70:13: DeclRefExpr=t:67:34 Extent=[70:13 - 70:14] |
198 | // CHECK: load-stmts.cpp:79:6: FunctionDecl=test_more_exprs:79:6 (Definition) |
199 | // CHECK: load-stmts.cpp:80:8: DeclRefExpr=mem:79:28 Extent=[80:8 - 80:11] |
200 | // CHECK: load-stmts.cpp:80:13: TypeRef=struct Pair:73:8 Extent=[80:13 - 80:17] |
201 | // CHECK: load-stmts.cpp:80:18: DeclRefExpr=i:79:37 Extent=[80:18 - 80:19] |
202 | // CHECK: load-stmts.cpp:80:21: DeclRefExpr=j:79:44 Extent=[80:21 - 80:22] |
203 | // CHECK: load-stmts.cpp:82:9: TypeRef=Integer:81:15 Extent=[82:9 - 82:16] |
204 | // CHECK: load-stmts.cpp:82:17: DeclRefExpr=i:79:37 Extent=[82:17 - 82:18] |
205 | // CHECK: load-stmts.cpp:83:3: CStyleCastExpr= Extent=[83:3 - 83:13] |
206 | // CHECK: load-stmts.cpp:83:4: TypeRef=Integer:81:15 Extent=[83:4 - 83:11] |
207 | // CHECK: load-stmts.cpp:83:12: UnexposedExpr=i:79:37 Extent=[83:12 - 83:13] |
208 | // CHECK: load-stmts.cpp:83:12: DeclRefExpr=i:79:37 Extent=[83:12 - 83:13] |
209 | // CHECK: load-stmts.cpp:84:3: UnexposedExpr= Extent=[84:3 - 84:12] |
210 | // CHECK: load-stmts.cpp:84:3: TypeRef=Integer:81:15 Extent=[84:3 - 84:10] |
211 | // CHECK: load-stmts.cpp:90:9: TypeRef=type:89:13 Extent=[90:9 - 90:13] |
212 | // CHECK: load-stmts.cpp:90:14: DeclRefExpr=t:88:39 Extent=[90:14 - 90:15] |
213 | // CHECK: load-stmts.cpp:90:17: DeclRefExpr=y:88:44 Extent=[90:17 - 90:18] |
214 | // CHECK: load-stmts.cpp:91:9: UnexposedExpr= Extent=[91:9 - 91:35] |
215 | // CHECK: load-stmts.cpp:91:30: TypeRef=type:89:13 Extent=[91:30 - 91:34] |
216 | // CHECK: load-stmts.cpp:103:10: CXXConstructor=Derived:103:10 (Definition) |
217 | // CHECK: load-stmts.cpp:103:1: TypeRef=struct Derived:98:8 Extent=[103:1 - 103: |
218 | // FIXME: Missing TypeRef for constructor name. |
219 | // CHECK: load-stmts.cpp:103:22: ParmDecl=x:103:22 (Definition) |
220 | // CHECK: load-stmts.cpp:104:5: MemberRef=member:100:7 Extent=[104:5 - 104:11] |
221 | // CHECK: load-stmts.cpp:104:12: DeclRefExpr=x:103:22 Extent=[104:12 - 104:13] |
222 | // CHECK: load-stmts.cpp:104:16: TypeRef=struct Base:94:8 Extent=[104:16 - 104:2 |
223 | // CHECK: load-stmts.cpp:104:16: CallExpr=Base:95:3 Extent=[104:16 - 104:23] |
224 | // CHECK: load-stmts.cpp:104:21: DeclRefExpr=x:103:22 Extent=[104:21 - 104:22] |
225 | // CHECK: load-stmts.cpp:107:6: FunctionDecl=considered_harmful:107:6 (Definition) |
226 | // CHECK: load-stmts.cpp:108:2: LabelStmt=start_over Extent=[108:2 - 109:28] |
227 | // CHECK: load-stmts.cpp:109:17: LabelRef=start_over:108:2 Extent=[109:17 - 109:27] |
228 | // CHECK: load-stmts.cpp:113:10: LabelRef=start_over:108:2 Extent=[113:10 - 113:20] |
229 | // CHECK: load-stmts.cpp:117:35: UnexposedExpr=ip:116:17 Extent=[117:35 - 117:37] |
230 | // CHECK: load-stmts.cpp:117:35: DeclRefExpr=ip:116:17 Extent=[117:35 - 117:37] |
231 | |
232 | |