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 { 36633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar struct {int a;} typeanon; 367411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis struct { 368411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis int bariton; 369411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis union { 370411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis int foo; 371411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis }; 372411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis }; 373411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis int bar; 374411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis};""" 37533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar tries=[(['-target','i386-linux-gnu'],(4,16,0,32,64,96)), 37633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar (['-target','nvptx64-unknown-unknown'],(8,24,0,32,64,96)), 37733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar (['-target','i386-pc-win32'],(8,16,0,32,64,96)), 37833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar (['-target','msp430-none-none'],(2,14,0,32,64,96))] 379411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis for flags, values in tries: 38033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar align,total,f1,bariton,foo,bar = values 381411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis tu = get_tu(source) 382411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis teststruct = get_cursor(tu, 'Test') 38333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar children = list(teststruct.get_children()) 38433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar fields = list(teststruct.type.get_fields()) 38533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar assert children[0].kind == CursorKind.STRUCT_DECL 38633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar assert children[0].spelling != "typeanon" 38733337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar assert children[1].spelling == "typeanon" 38833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar assert fields[0].kind == CursorKind.FIELD_DECL 38933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar assert fields[1].kind == CursorKind.FIELD_DECL 39033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar assert fields[1].is_anonymous() 39133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar assert teststruct.type.get_offset("typeanon") == f1 392411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis assert teststruct.type.get_offset("bariton") == bariton 393411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis assert teststruct.type.get_offset("foo") == foo 394411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis assert teststruct.type.get_offset("bar") == bar 395411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis 396411d33aa0b0d3bc9b2faec40cd821bdd836094abArgyrios Kyrtzidis 3977a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidisdef test_decay(): 3987a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis """Ensure decayed types are handled as the original type""" 3997a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis 4007a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis tu = get_tu("void foo(int a[]);") 4017a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis foo = get_cursor(tu, 'foo') 4027a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis a = foo.type.argument_types()[0] 4037a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis 4047a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis assert a.kind == TypeKind.INCOMPLETEARRAY 4057a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis assert a.element_type.kind == TypeKind.INT 4067a97f7bc619752d09998a9c31c7574b51f04ba1eArgyrios Kyrtzidis assert a.get_canonical().kind == TypeKind.INCOMPLETEARRAY 407