3 from clang.cindex import CursorKind
4 from clang.cindex import TranslationUnit
5 from clang.cindex import TypeKind
6 from nose.tools import raises
7 from .util import get_cursor
8 from .util import get_tu
30 teststruct = get_cursor(tu, 'teststruct')
31 assert teststruct is not None, "Could not find teststruct."
32 fields = list(teststruct.get_children())
33 assert all(x.kind == CursorKind.FIELD_DECL for x in fields)
34 assert all(x.translation_unit is not None for x in fields)
36 assert fields[0].spelling == 'a'
37 assert not fields[0].type.is_const_qualified()
38 assert fields[0].type.kind == TypeKind.INT
39 assert fields[0].type.get_canonical().kind == TypeKind.INT
41 assert fields[1].spelling == 'b'
42 assert not fields[1].type.is_const_qualified()
43 assert fields[1].type.kind == TypeKind.TYPEDEF
44 assert fields[1].type.get_canonical().kind == TypeKind.INT
45 assert fields[1].type.get_declaration().spelling == 'I'
47 assert fields[2].spelling == 'c'
48 assert not fields[2].type.is_const_qualified()
49 assert fields[2].type.kind == TypeKind.LONG
50 assert fields[2].type.get_canonical().kind == TypeKind.LONG
52 assert fields[3].spelling == 'd'
53 assert not fields[3].type.is_const_qualified()
54 assert fields[3].type.kind == TypeKind.ULONG
55 assert fields[3].type.get_canonical().kind == TypeKind.ULONG
57 assert fields[4].spelling == 'e'
58 assert not fields[4].type.is_const_qualified()
59 assert fields[4].type.kind == TypeKind.LONG
60 assert fields[4].type.get_canonical().kind == TypeKind.LONG
62 assert fields[5].spelling == 'f'
63 assert fields[5].type.is_const_qualified()
64 assert fields[5].type.kind == TypeKind.INT
65 assert fields[5].type.get_canonical().kind == TypeKind.INT
67 assert fields[6].spelling == 'g'
68 assert not fields[6].type.is_const_qualified()
69 assert fields[6].type.kind == TypeKind.POINTER
70 assert fields[6].type.get_pointee().kind == TypeKind.INT
72 assert fields[7].spelling == 'h'
73 assert not fields[7].type.is_const_qualified()
74 assert fields[7].type.kind == TypeKind.POINTER
75 assert fields[7].type.get_pointee().kind == TypeKind.POINTER
76 assert fields[7].type.get_pointee().get_pointee().kind == TypeKind.POINTER
77 assert fields[7].type.get_pointee().get_pointee().get_pointee().kind == TypeKind.INT
79 def test_references():
80 """Ensure that a Type maintains a reference to a TranslationUnit."""
83 children = list(tu.cursor.get_children())
84 assert len(children) > 0
89 assert isinstance(t.translation_unit, TranslationUnit)
91 # Delete main TranslationUnit reference and force a GC.
94 assert isinstance(t.translation_unit, TranslationUnit)
96 # If the TU was destroyed, this should cause a segfault.
97 decl = t.get_declaration()
104 def testConstantArray():
105 tu = get_tu(constarrayInput)
107 teststruct = get_cursor(tu, 'teststruct')
108 assert teststruct is not None, "Didn't find teststruct??"
109 fields = list(teststruct.get_children())
110 assert fields[0].spelling == 'A'
111 assert fields[0].type.kind == TypeKind.CONSTANTARRAY
112 assert fields[0].type.get_array_element_type() is not None
113 assert fields[0].type.get_array_element_type().kind == TypeKind.POINTER
114 assert fields[0].type.get_array_size() == 2
117 """Ensure equivalence operators work on Type."""
118 source = 'int a; int b; void *v;'
121 a = get_cursor(tu, 'a')
122 b = get_cursor(tu, 'b')
123 v = get_cursor(tu, 'v')
129 assert a.type == b.type
130 assert a.type != v.type
132 assert a.type != None
133 assert a.type != 'foo'
135 def test_typekind_spelling():
136 """Ensure TypeKind.spelling works."""
137 tu = get_tu('int a;')
138 a = get_cursor(tu, 'a')
141 assert a.type.kind.spelling == 'Int'
143 def test_function_argument_types():
144 """Ensure that Type.argument_types() works as expected."""
145 tu = get_tu('void f(int, int);')
146 f = get_cursor(tu, 'f')
149 args = f.type.argument_types()
150 assert args is not None
151 assert len(args) == 2
154 assert t0 is not None
155 assert t0.kind == TypeKind.INT
158 assert t1 is not None
159 assert t1.kind == TypeKind.INT
162 assert len(args2) == 2
163 assert t0 == args2[0]
164 assert t1 == args2[1]
167 def test_argument_types_string_key():
168 """Ensure that non-int keys raise a TypeError."""
169 tu = get_tu('void f(int, int);')
170 f = get_cursor(tu, 'f')
173 args = f.type.argument_types()
174 assert len(args) == 2
179 def test_argument_types_negative_index():
180 """Ensure that negative indexes on argument_types Raises an IndexError."""
181 tu = get_tu('void f(int, int);')
182 f = get_cursor(tu, 'f')
183 args = f.type.argument_types()
188 def test_argument_types_overflow_index():
189 """Ensure that indexes beyond the length of Type.argument_types() raise."""
190 tu = get_tu('void f(int, int);')
191 f = get_cursor(tu, 'f')
192 args = f.type.argument_types()
197 def test_argument_types_invalid_type():
198 """Ensure that obtaining argument_types on a Type without them raises."""
199 tu = get_tu('int i;')
200 i = get_cursor(tu, 'i')
203 i.type.argument_types()
206 """Ensure Type.is_pod() works."""
207 tu = get_tu('int i; void f();')
208 i = get_cursor(tu, 'i')
209 f = get_cursor(tu, 'f')
214 assert i.type.is_pod()
215 assert not f.type.is_pod()
217 def test_function_variadic():
218 """Ensure Type.is_function_variadic works."""
223 void foo(int a, ...);
224 void bar(int a, int b);
228 foo = get_cursor(tu, 'foo')
229 bar = get_cursor(tu, 'bar')
231 assert foo is not None
232 assert bar is not None
234 assert isinstance(foo.type.is_function_variadic(), bool)
235 assert foo.type.is_function_variadic()
236 assert not bar.type.is_function_variadic()
238 def test_element_type():
239 """Ensure Type.element_type works."""
240 tu = get_tu('int i[5];')
241 i = get_cursor(tu, 'i')
244 assert i.type.kind == TypeKind.CONSTANTARRAY
245 assert i.type.element_type.kind == TypeKind.INT
248 def test_invalid_element_type():
249 """Ensure Type.element_type raises if type doesn't have elements."""
250 tu = get_tu('int i;')
251 i = get_cursor(tu, 'i')
255 def test_element_count():
256 """Ensure Type.element_count works."""
257 tu = get_tu('int i[5]; int j;')
258 i = get_cursor(tu, 'i')
259 j = get_cursor(tu, 'j')
264 assert i.type.element_count == 5
272 def test_is_volatile_qualified():
273 """Ensure Type.is_volatile_qualified works."""
275 tu = get_tu('volatile int i = 4; int j = 2;')
277 i = get_cursor(tu, 'i')
278 j = get_cursor(tu, 'j')
283 assert isinstance(i.type.is_volatile_qualified(), bool)
284 assert i.type.is_volatile_qualified()
285 assert not j.type.is_volatile_qualified()
287 def test_is_restrict_qualified():
288 """Ensure Type.is_restrict_qualified works."""
290 tu = get_tu('struct s { void * restrict i; void * j; };')
292 i = get_cursor(tu, 'i')
293 j = get_cursor(tu, 'j')
298 assert isinstance(i.type.is_restrict_qualified(), bool)
299 assert i.type.is_restrict_qualified()
300 assert not j.type.is_restrict_qualified()
302 def test_record_layout():
303 """Ensure Cursor.type.get_size, Cursor.type.get_align and
304 Cursor.type.get_offset works."""
314 tries=[(['-target','i386-linux-gnu'],(4,16,0,32,35,64)),
315 (['-target','nvptx64-unknown-unknown'],(8,24,0,64,67,128)),
316 (['-target','i386-pc-win32'],(8,16,0,32,35,64)),
317 (['-target','msp430-none-none'],(2,14,0,32,35,48))]
318 for flags, values in tries:
319 align,total,a1,a2,a3,a4 = values
321 tu = get_tu(source, flags=flags)
322 teststruct = get_cursor(tu, 'a')
323 fields = list(teststruct.get_children())
325 assert teststruct.type.get_align() == align
326 assert teststruct.type.get_size() == total
327 assert teststruct.type.get_offset(fields[0].spelling) == a1
328 assert teststruct.type.get_offset(fields[1].spelling) == a2
329 assert teststruct.type.get_offset(fields[2].spelling) == a3
330 assert teststruct.type.get_offset(fields[3].spelling) == a4
331 assert fields[0].is_bitfield() == False
332 assert fields[1].is_bitfield() == True
333 assert fields[1].get_bitfield_width() == 3
334 assert fields[2].is_bitfield() == True
335 assert fields[2].get_bitfield_width() == 4
336 assert fields[3].is_bitfield() == False
339 """Ensure Cursor.get_record_field_offset works in anonymous records"""
350 tries=[(['-target','i386-linux-gnu'],(4,16,0,32,64)),
351 (['-target','nvptx64-unknown-unknown'],(8,24,0,32,64)),
352 (['-target','i386-pc-win32'],(8,16,0,32,64)),
353 (['-target','msp430-none-none'],(2,14,0,32,64))]
354 for flags, values in tries:
355 align,total,bariton,foo,bar = values
357 teststruct = get_cursor(tu, 'Test')
358 fields = list(teststruct.get_children())
359 assert teststruct.type.get_offset("bariton") == bariton
360 assert teststruct.type.get_offset("foo") == foo
361 assert teststruct.type.get_offset("bar") == bar