1860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorcfrom clang.cindex import CursorKind
2860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorcfrom clang.cindex import TypeKind
3860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorcfrom nose.tools import raises
41f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom .util import get_cursor
51f1988fe75f27548459cabee2ea6162cbfd9add2Gregory Szorcfrom .util import get_tu
62312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
72312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios KyrtzidiskInput = """\
82312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
92312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidistypedef int I;
102312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
112312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidisstruct teststruct {
122312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  int a;
132312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  I b;
142312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  long c;
152312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  unsigned long d;
162312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  signed long e;
172312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  const int f;
182312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  int *g;
192312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis  int ***h;
202312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis};
212312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
222312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis"""
232312f5f4df83f8f624765d9cb86fc8f0dc9c2659Argyrios Kyrtzidis
24826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_a_struct():
25826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu(kInput)
2638d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor
27826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    teststruct = get_cursor(tu, 'teststruct')
28826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert teststruct is not None, "Could not find teststruct."
29826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    fields = list(teststruct.get_children())
30826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert all(x.kind == CursorKind.FIELD_DECL for x in fields)
31826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
32826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].spelling == 'a'
33826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[0].type.is_const_qualified()
34826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.kind == TypeKind.INT
35826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.get_canonical().kind == TypeKind.INT
36826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
37826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[1].spelling == 'b'
38826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[1].type.is_const_qualified()
39826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[1].type.kind == TypeKind.TYPEDEF
40826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[1].type.get_canonical().kind == TypeKind.INT
41826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[1].type.get_declaration().spelling == 'I'
42826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
43826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[2].spelling == 'c'
44826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[2].type.is_const_qualified()
45826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[2].type.kind == TypeKind.LONG
46826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[2].type.get_canonical().kind == TypeKind.LONG
47826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
48826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[3].spelling == 'd'
49826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[3].type.is_const_qualified()
50826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[3].type.kind == TypeKind.ULONG
51826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[3].type.get_canonical().kind == TypeKind.ULONG
52826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
53826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[4].spelling == 'e'
54826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[4].type.is_const_qualified()
55826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[4].type.kind == TypeKind.LONG
56826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[4].type.get_canonical().kind == TypeKind.LONG
57826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
58826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[5].spelling == 'f'
59826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[5].type.is_const_qualified()
60826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[5].type.kind == TypeKind.INT
61826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[5].type.get_canonical().kind == TypeKind.INT
62826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
63826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[6].spelling == 'g'
64826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[6].type.is_const_qualified()
65826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[6].type.kind == TypeKind.POINTER
66826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[6].type.get_pointee().kind == TypeKind.INT
67826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
68826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].spelling == 'h'
69826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert not fields[7].type.is_const_qualified()
70826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].type.kind == TypeKind.POINTER
71826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].type.get_pointee().kind == TypeKind.POINTER
72826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].type.get_pointee().get_pointee().kind == TypeKind.POINTER
73826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[7].type.get_pointee().get_pointee().get_pointee().kind == TypeKind.INT
7438d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor
7538d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas GregorconstarrayInput="""
7638d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregorstruct teststruct {
7738d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor  void *A[2];
7838d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor};
7938d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor"""
8038d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregordef testConstantArray():
8131cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu(constarrayInput)
8238d2d5539e72ce3d92c4746b632f3a7c2e48b4a2Douglas Gregor
83826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    teststruct = get_cursor(tu, 'teststruct')
84826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert teststruct is not None, "Didn't find teststruct??"
85826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    fields = list(teststruct.get_children())
86826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].spelling == 'A'
87826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.kind == TypeKind.CONSTANTARRAY
88826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.get_array_element_type() is not None
89826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.get_array_element_type().kind == TypeKind.POINTER
90826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert fields[0].type.get_array_size() == 2
9196ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc
927eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorcdef test_equal():
937eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    """Ensure equivalence operators work on Type."""
947eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    source = 'int a; int b; void *v;'
957eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    tu = get_tu(source)
967eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
97826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    a = get_cursor(tu, 'a')
98826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    b = get_cursor(tu, 'b')
99826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    v = get_cursor(tu, 'v')
1007eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
1017eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a is not None
1027eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert b is not None
1037eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert v is not None
1047eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
1057eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a.type == b.type
1067eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a.type != v.type
1077eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
1087eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a.type != None
1097eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc    assert a.type != 'foo'
1107eb691a7b61ba895695bbbf92e944d98ef49390dGregory Szorc
1116e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorcdef test_typekind_spelling():
1126e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    """Ensure TypeKind.spelling works."""
1136e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    tu = get_tu('int a;')
1146e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    a = get_cursor(tu, 'a')
1156e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc
1166e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    assert a is not None
1176e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc    assert a.type.kind.spelling == 'Int'
1186e67eed3276f16edac4ab4ef5a36d2b896e18288Gregory Szorc
119826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_function_argument_types():
120826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that Type.argument_types() works as expected."""
121826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('void f(int, int);')
122826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
123826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert f is not None
124826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
125826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args = f.type.argument_types()
126826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert args is not None
127826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert len(args) == 2
128826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
129826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    t0 = args[0]
130826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t0 is not None
131826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t0.kind == TypeKind.INT
132826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
133826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    t1 = args[1]
134826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t1 is not None
135826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t1.kind == TypeKind.INT
136826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
137826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args2 = list(args)
138826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert len(args2) == 2
139826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t0 == args2[0]
140826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert t1 == args2[1]
141826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
142826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc@raises(TypeError)
143826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_argument_types_string_key():
144826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that non-int keys raise a TypeError."""
145826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('void f(int, int);')
146826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
147826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert f is not None
148826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
149826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args = f.type.argument_types()
150826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert len(args) == 2
151826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
152826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args['foo']
153826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
154826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc@raises(IndexError)
155826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_argument_types_negative_index():
156826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that negative indexes on argument_types Raises an IndexError."""
157826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('void f(int, int);')
158826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
159826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args = f.type.argument_types()
160826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
161826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args[-1]
162826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
163826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc@raises(IndexError)
164826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_argument_types_overflow_index():
165826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that indexes beyond the length of Type.argument_types() raise."""
166826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('void f(int, int);')
167826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
168826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args = f.type.argument_types()
169826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
170826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    args[2]
171826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
172826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc@raises(Exception)
173826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorcdef test_argument_types_invalid_type():
174826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    """Ensure that obtaining argument_types on a Type without them raises."""
175826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    tu = get_tu('int i;')
176826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
177826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    assert i is not None
178826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
179826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i.type.argument_types()
180826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc
18196ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorcdef test_is_pod():
1828261345a32e58dfb5f4269ed92e1608a4ec3379aGregory Szorc    """Ensure Type.is_pod() works."""
18331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu('int i; void f();')
184826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
185826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    f = get_cursor(tu, 'f')
18696ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc
18796ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc    assert i is not None
18896ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc    assert f is not None
18996ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc
19096ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc    assert i.type.is_pod()
19196ad633771182c54b5b62fa4be23f866ed0beb15Gregory Szorc    assert not f.type.is_pod()
192860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc
19331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorcdef test_function_variadic():
19431cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    """Ensure Type.is_function_variadic works."""
19531cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
19631cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    source ="""
19731cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc#include <stdarg.h>
19831cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
19931cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorcvoid foo(int a, ...);
20031cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorcvoid bar(int a, int b);
20131cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc"""
20231cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
20331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu(source)
204826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    foo = get_cursor(tu, 'foo')
205826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    bar = get_cursor(tu, 'bar')
20631cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
20731cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert foo is not None
20831cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert bar is not None
209860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc
21031cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert isinstance(foo.type.is_function_variadic(), bool)
21131cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert foo.type.is_function_variadic()
21231cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert not bar.type.is_function_variadic()
21331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
21431cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorcdef test_element_type():
2158261345a32e58dfb5f4269ed92e1608a4ec3379aGregory Szorc    """Ensure Type.element_type works."""
21631cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu('int i[5];')
217826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
21831cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert i is not None
21931cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc
220860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc    assert i.type.kind == TypeKind.CONSTANTARRAY
221860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc    assert i.type.element_type.kind == TypeKind.INT
222860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc
223860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc@raises(Exception)
224860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorcdef test_invalid_element_type():
225860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc    """Ensure Type.element_type raises if type doesn't have elements."""
22631cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu('int i;')
227826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
22831cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    assert i is not None
229860576050b4d163a2f182cfdd67d8c5a48e32c08Gregory Szorc    i.element_type
230bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc
231bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorcdef test_element_count():
2328261345a32e58dfb5f4269ed92e1608a4ec3379aGregory Szorc    """Ensure Type.element_count works."""
23331cc38cb76317bfe50aadbc625d6ff67f727607aGregory Szorc    tu = get_tu('int i[5]; int j;')
234826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    i = get_cursor(tu, 'i')
235826fce53d64e0ca8fdcfdd11f4e9aab6c8be224fGregory Szorc    j = get_cursor(tu, 'j')
236bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc
237bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    assert i is not None
238bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    assert j is not None
239bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc
240bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    assert i.type.element_count == 5
241bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc
242bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    try:
243bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc        j.type.element_count
244bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc        assert False
245bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc    except:
246bf8ca0049ea4faa7b089001e837e0ebbaec2ac6dGregory Szorc        assert True
2470e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2480e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorcdef test_is_volatile_qualified():
2490e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    """Ensure Type.is_volatile_qualified works."""
2500e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2510e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    tu = get_tu('volatile int i = 4; int j = 2;')
2520e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2530e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    i = get_cursor(tu, 'i')
2540e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    j = get_cursor(tu, 'j')
2550e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2560e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert i is not None
2570e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert j is not None
2580e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2590e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert isinstance(i.type.is_volatile_qualified(), bool)
2600e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert i.type.is_volatile_qualified()
2610e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert not j.type.is_volatile_qualified()
2620e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2630e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorcdef test_is_restrict_qualified():
2640e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    """Ensure Type.is_restrict_qualified works."""
2650e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2660e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    tu = get_tu('struct s { void * restrict i; void * j };')
2670e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2680e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    i = get_cursor(tu, 'i')
2690e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    j = get_cursor(tu, 'j')
2700e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2710e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert i is not None
2720e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert j is not None
2730e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc
2740e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert isinstance(i.type.is_restrict_qualified(), bool)
2750e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert i.type.is_restrict_qualified()
2760e1f4f8de57b4462f8d41c64de1427c5c1cf7e8fGregory Szorc    assert not j.type.is_restrict_qualified()
277