1a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorcimport gc
2a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
3860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorcfrom clang.cindex import CursorKind
4a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorcfrom clang.cindex import TranslationUnit
5860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorcfrom clang.cindex import TypeKind
6860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorcfrom nose.tools import raises
71f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom .util import get_cursor
81f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom .util import get_tu
92312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
102312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios KyrtzidiskInput = """\
112312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
122312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidistypedef int I;
132312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
142312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidisstruct teststruct {
152312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  int a;
162312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  I b;
172312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  long c;
182312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  unsigned long d;
192312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  signed long e;
202312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  const int f;
212312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  int *g;
222312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  int ***h;
232312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis};
242312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
252312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis"""
262312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
27826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_a_struct():
28826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu(kInput)
2938d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor
30826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    teststruct = get_cursor(tu, 'teststruct')
31826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert teststruct is not None, "Could not find teststruct."
32826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    fields = list(teststruct.get_children())
33826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert all(x.kind == CursorKind.FIELD_DECL for x in fields)
34a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    assert all(x.translation_unit is not None for x in fields)
35826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
36826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].spelling == 'a'
37826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[0].type.is_const_qualified()
38826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.kind == TypeKind.INT
39826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.get_canonical().kind == TypeKind.INT
40826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
41826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[1].spelling == 'b'
42826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[1].type.is_const_qualified()
43826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[1].type.kind == TypeKind.TYPEDEF
44826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[1].type.get_canonical().kind == TypeKind.INT
45826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[1].type.get_declaration().spelling == 'I'
46826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
47826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[2].spelling == 'c'
48826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[2].type.is_const_qualified()
49826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[2].type.kind == TypeKind.LONG
50826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[2].type.get_canonical().kind == TypeKind.LONG
51826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
52826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[3].spelling == 'd'
53826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[3].type.is_const_qualified()
54826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[3].type.kind == TypeKind.ULONG
55826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[3].type.get_canonical().kind == TypeKind.ULONG
56826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
57826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[4].spelling == 'e'
58826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[4].type.is_const_qualified()
59826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[4].type.kind == TypeKind.LONG
60826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[4].type.get_canonical().kind == TypeKind.LONG
61826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
62826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[5].spelling == 'f'
63826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[5].type.is_const_qualified()
64826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[5].type.kind == TypeKind.INT
65826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[5].type.get_canonical().kind == TypeKind.INT
66826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
67826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[6].spelling == 'g'
68826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[6].type.is_const_qualified()
69826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[6].type.kind == TypeKind.POINTER
70826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[6].type.get_pointee().kind == TypeKind.INT
71826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
72826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].spelling == 'h'
73826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[7].type.is_const_qualified()
74826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].type.kind == TypeKind.POINTER
75826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].type.get_pointee().kind == TypeKind.POINTER
76826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].type.get_pointee().get_pointee().kind == TypeKind.POINTER
77826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].type.get_pointee().get_pointee().get_pointee().kind == TypeKind.INT
7838d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor
79a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorcdef test_references():
80a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    """Ensure that a Type maintains a reference to a TranslationUnit."""
81a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
82a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    tu = get_tu('int x;')
83a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    children = list(tu.cursor.get_children())
84a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    assert len(children) > 0
85a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
86a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    cursor = children[0]
87a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    t = cursor.type
88a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
89a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    assert isinstance(t.translation_unit, TranslationUnit)
90a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
91a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    # Delete main TranslationUnit reference and force a GC.
92a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    del tu
93a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    gc.collect()
94a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    assert isinstance(t.translation_unit, TranslationUnit)
95a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
96a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    # If the TU was destroyed, this should cause a segfault.
97a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc    decl = t.get_declaration()
98a63ef1f63f9c2ae847fac25534c9e1a214efabbcGregory Szorc
9938d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas GregorconstarrayInput="""
10038d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregorstruct teststruct {
10138d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor  void *A[2];
10238d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor};
10338d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor"""
10438d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregordef testConstantArray():
10531cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu(constarrayInput)
10638d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor
107826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    teststruct = get_cursor(tu, 'teststruct')
108826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert teststruct is not None, "Didn't find teststruct??"
109826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    fields = list(teststruct.get_children())
110826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].spelling == 'A'
111826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.kind == TypeKind.CONSTANTARRAY
112826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.get_array_element_type() is not None
113826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.get_array_element_type().kind == TypeKind.POINTER
114826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.get_array_size() == 2
11596ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc
1167eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorcdef test_equal():
1177eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    """Ensure equivalence operators work on Type."""
1187eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    source = 'int a; int b; void *v;'
1197eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    tu = get_tu(source)
1207eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
121826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    a = get_cursor(tu, 'a')
122826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    b = get_cursor(tu, 'b')
123826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    v = get_cursor(tu, 'v')
1247eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
1257eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a is not None
1267eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert b is not None
1277eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert v is not None
1287eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
1297eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a.type == b.type
1307eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a.type != v.type
1317eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
1327eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a.type != None
1337eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a.type != 'foo'
1347eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
135c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidisdef test_type_spelling():
136c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    """Ensure Type.spelling works."""
137c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    tu = get_tu('int c[5]; int i[]; int x; int v[x];')
138c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    c = get_cursor(tu, 'c')
139c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    i = get_cursor(tu, 'i')
140c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    x = get_cursor(tu, 'x')
141c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    v = get_cursor(tu, 'v')
142c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    assert c is not None
143c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    assert i is not None
144c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    assert x is not None
145c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    assert v is not None
146c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    assert c.type.spelling == "int [5]"
147c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    assert i.type.spelling == "int []"
148c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    assert x.type.spelling == "int"
149c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis    assert v.type.spelling == "int [x]"
150c23cb2d3e8af8354d43517283d3efb2cb0681f49Argyrios Kyrtzidis
1516e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorcdef test_typekind_spelling():
1526e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    """Ensure TypeKind.spelling works."""
1536e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    tu = get_tu('int a;')
1546e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    a = get_cursor(tu, 'a')
1556e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc
1566e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    assert a is not None
1576e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    assert a.type.kind.spelling == 'Int'
1586e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc
159826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_function_argument_types():
160826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that Type.argument_types() works as expected."""
161826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('void f(int, int);')
162826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
163826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert f is not None
164826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
165826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args = f.type.argument_types()
166826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert args is not None
167826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert len(args) == 2
168826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
169826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    t0 = args[0]
170826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t0 is not None
171826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t0.kind == TypeKind.INT
172826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
173826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    t1 = args[1]
174826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t1 is not None
175826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t1.kind == TypeKind.INT
176826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
177826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args2 = list(args)
178826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert len(args2) == 2
179826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t0 == args2[0]
180826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t1 == args2[1]
181826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
182826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc@raises(TypeError)
183826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_argument_types_string_key():
184826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that non-int keys raise a TypeError."""
185826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('void f(int, int);')
186826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
187826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert f is not None
188826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
189826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args = f.type.argument_types()
190826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert len(args) == 2
191826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
192826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args['foo']
193826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
194826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc@raises(IndexError)
195826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_argument_types_negative_index():
196826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that negative indexes on argument_types Raises an IndexError."""
197826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('void f(int, int);')
198826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
199826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args = f.type.argument_types()
200826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
201826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args[-1]
202826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
203826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc@raises(IndexError)
204826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_argument_types_overflow_index():
205826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that indexes beyond the length of Type.argument_types() raise."""
206826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('void f(int, int);')
207826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
208826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args = f.type.argument_types()
209826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
210826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args[2]
211826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
212826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc@raises(Exception)
213826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_argument_types_invalid_type():
214826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that obtaining argument_types on a Type without them raises."""
215826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('int i;')
216826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
217826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert i is not None
218826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
219826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i.type.argument_types()
220826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
22196ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorcdef test_is_pod():
2228261345a32e58dfb5f4269ed92e1608a4ec3379aGregory Szorc    """Ensure Type.is_pod() works."""
22331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu('int i; void f();')
224826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
225826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
22696ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc
22796ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc    assert i is not None
22896ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc    assert f is not None
22996ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc
23096ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc    assert i.type.is_pod()
23196ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc    assert not f.type.is_pod()
232860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc
23331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorcdef test_function_variadic():
23431cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    """Ensure Type.is_function_variadic works."""
23531cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
23631cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    source ="""
23731cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc#include <stdarg.h>
23831cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
23931cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorcvoid foo(int a, ...);
24031cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorcvoid bar(int a, int b);
24131cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc"""
24231cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
24331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu(source)
244826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    foo = get_cursor(tu, 'foo')
245826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    bar = get_cursor(tu, 'bar')
24631cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
24731cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert foo is not None
24831cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert bar is not None
249860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc
25031cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert isinstance(foo.type.is_function_variadic(), bool)
25131cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert foo.type.is_function_variadic()
25231cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert not bar.type.is_function_variadic()
25331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
25431cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorcdef test_element_type():
2558261345a32e58dfb5f4269ed92e1608a4ec3379aGregory Szorc    """Ensure Type.element_type works."""
2564c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    tu = get_tu('int c[5]; int i[]; int x; int v[x];')
2574c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    c = get_cursor(tu, 'c')
258826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
2594c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    v = get_cursor(tu, 'v')
2604c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    assert c is not None
26131cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert i is not None
2624c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    assert v is not None
26331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
2644c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    assert c.type.kind == TypeKind.CONSTANTARRAY
2654c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    assert c.type.element_type.kind == TypeKind.INT
2664c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    assert i.type.kind == TypeKind.INCOMPLETEARRAY
267860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc    assert i.type.element_type.kind == TypeKind.INT
2684c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    assert v.type.kind == TypeKind.VARIABLEARRAY
2694c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7Argyrios Kyrtzidis    assert v.type.element_type.kind == TypeKind.INT
270860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc
271860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc@raises(Exception)
272860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorcdef test_invalid_element_type():
273860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc    """Ensure Type.element_type raises if type doesn't have elements."""
27431cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu('int i;')
275826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
27631cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert i is not None
277860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc    i.element_type
278bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc
279bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorcdef test_element_count():
2808261345a32e58dfb5f4269ed92e1608a4ec3379aGregory Szorc    """Ensure Type.element_count works."""
28131cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu('int i[5]; int j;')
282826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
283826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    j = get_cursor(tu, 'j')
284bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc
285bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    assert i is not None
286bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    assert j is not None
287bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc
288bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    assert i.type.element_count == 5
289bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc
290bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    try:
291bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc        j.type.element_count
292bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc        assert False
293bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    except:
294bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc        assert True
2950e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2960e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorcdef test_is_volatile_qualified():
2970e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    """Ensure Type.is_volatile_qualified works."""
2980e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2990e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    tu = get_tu('volatile int i = 4; int j = 2;')
3000e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
3010e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    i = get_cursor(tu, 'i')
3020e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    j = get_cursor(tu, 'j')
3030e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
3040e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert i is not None
3050e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert j is not None
3060e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
3070e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert isinstance(i.type.is_volatile_qualified(), bool)
3080e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert i.type.is_volatile_qualified()
3090e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert not j.type.is_volatile_qualified()
3100e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
3110e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorcdef test_is_restrict_qualified():
3120e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    """Ensure Type.is_restrict_qualified works."""
3130e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
314e1f61c02bfa4dbff00a338e8ea814e014427dba6Anders Waldenborg    tu = get_tu('struct s { void * restrict i; void * j; };')
3150e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
3160e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    i = get_cursor(tu, 'i')
3170e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    j = get_cursor(tu, 'j')
3180e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
3190e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert i is not None
3200e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert j is not None
3210e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
3220e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert isinstance(i.type.is_restrict_qualified(), bool)
3230e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert i.type.is_restrict_qualified()
3240e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert not j.type.is_restrict_qualified()
325411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
326411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisdef test_record_layout():
327411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    """Ensure Cursor.type.get_size, Cursor.type.get_align and
328411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    Cursor.type.get_offset works."""
329411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
330411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    source ="""
331411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct a {
332411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    long a1;
333411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    long a2:3;
334411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    long a3:4;
335411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    long long a4;
336411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};
337411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis"""
338411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    tries=[(['-target','i386-linux-gnu'],(4,16,0,32,35,64)),
339411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis           (['-target','nvptx64-unknown-unknown'],(8,24,0,64,67,128)),
340411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis           (['-target','i386-pc-win32'],(8,16,0,32,35,64)),
341411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis           (['-target','msp430-none-none'],(2,14,0,32,35,48))]
342411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    for flags, values in tries:
343411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        align,total,a1,a2,a3,a4 = values
344411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
345411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        tu = get_tu(source, flags=flags)
346411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        teststruct = get_cursor(tu, 'a')
347411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        fields = list(teststruct.get_children())
348411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
349411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert teststruct.type.get_align() == align
350411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert teststruct.type.get_size() == total
351411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert teststruct.type.get_offset(fields[0].spelling) == a1
352411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert teststruct.type.get_offset(fields[1].spelling) == a2
353411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert teststruct.type.get_offset(fields[2].spelling) == a3
354411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert teststruct.type.get_offset(fields[3].spelling) == a4
355411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert fields[0].is_bitfield() == False
356411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert fields[1].is_bitfield() == True
357411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert fields[1].get_bitfield_width() == 3
358411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert fields[2].is_bitfield() == True
359411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert fields[2].get_bitfield_width() == 4
360411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert fields[3].is_bitfield() == False
361411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
362411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisdef test_offset():
363411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    """Ensure Cursor.get_record_field_offset works in anonymous records"""
364411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    source="""
365411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidisstruct Test {
366411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  struct {
367411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    int bariton;
368411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    union {
369411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis      int foo;
370411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    };
371411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  };
372411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis  int bar;
373411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};"""
374411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    tries=[(['-target','i386-linux-gnu'],(4,16,0,32,64)),
375411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis           (['-target','nvptx64-unknown-unknown'],(8,24,0,32,64)),
376411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis           (['-target','i386-pc-win32'],(8,16,0,32,64)),
377411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis           (['-target','msp430-none-none'],(2,14,0,32,64))]
378411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis    for flags, values in tries:
379411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        align,total,bariton,foo,bar = values
380411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        tu = get_tu(source)
381411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        teststruct = get_cursor(tu, 'Test')
382411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        fields = list(teststruct.get_children())
383411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert teststruct.type.get_offset("bariton") == bariton
384411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert teststruct.type.get_offset("foo") == foo
385411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis        assert teststruct.type.get_offset("bar") == bar
386411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
387411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis
3887a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidisdef test_decay():
3897a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis    """Ensure decayed types are handled as the original type"""
3907a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis
3917a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis    tu = get_tu("void foo(int a[]);")
3927a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis    foo = get_cursor(tu, 'foo')
3937a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis    a = foo.type.argument_types()[0]
3947a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis
3957a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis    assert a.kind == TypeKind.INCOMPLETEARRAY
3967a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis    assert a.element_type.kind == TypeKind.INT
3977a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis    assert a.get_canonical().kind == TypeKind.INCOMPLETEARRAY
398