diff options
Diffstat (limited to 'bindings/python/tests')
-rw-r--r-- | bindings/python/tests/cindex/test_type.py | 63 | ||||
-rw-r--r-- | bindings/python/tests/cindex/util.py | 4 |
2 files changed, 65 insertions, 2 deletions
diff --git a/bindings/python/tests/cindex/test_type.py b/bindings/python/tests/cindex/test_type.py index 28e4411..9bbed5a 100644 --- a/bindings/python/tests/cindex/test_type.py +++ b/bindings/python/tests/cindex/test_type.py @@ -298,3 +298,66 @@ def test_is_restrict_qualified(): assert isinstance(i.type.is_restrict_qualified(), bool) assert i.type.is_restrict_qualified() assert not j.type.is_restrict_qualified() + +def test_record_layout(): + """Ensure Cursor.type.get_size, Cursor.type.get_align and + Cursor.type.get_offset works.""" + + source =""" +struct a { + long a1; + long a2:3; + long a3:4; + long long a4; +}; +""" + tries=[(['-target','i386-linux-gnu'],(4,16,0,32,35,64)), + (['-target','nvptx64-unknown-unknown'],(8,24,0,64,67,128)), + (['-target','i386-pc-win32'],(8,16,0,32,35,64)), + (['-target','msp430-none-none'],(2,14,0,32,35,48))] + for flags, values in tries: + align,total,a1,a2,a3,a4 = values + + tu = get_tu(source, flags=flags) + teststruct = get_cursor(tu, 'a') + fields = list(teststruct.get_children()) + + assert teststruct.type.get_align() == align + assert teststruct.type.get_size() == total + assert teststruct.type.get_offset(fields[0].spelling) == a1 + assert teststruct.type.get_offset(fields[1].spelling) == a2 + assert teststruct.type.get_offset(fields[2].spelling) == a3 + assert teststruct.type.get_offset(fields[3].spelling) == a4 + assert fields[0].is_bitfield() == False + assert fields[1].is_bitfield() == True + assert fields[1].get_bitfield_width() == 3 + assert fields[2].is_bitfield() == True + assert fields[2].get_bitfield_width() == 4 + assert fields[3].is_bitfield() == False + +def test_offset(): + """Ensure Cursor.get_record_field_offset works in anonymous records""" + source=""" +struct Test { + struct { + int bariton; + union { + int foo; + }; + }; + int bar; +};""" + tries=[(['-target','i386-linux-gnu'],(4,16,0,32,64)), + (['-target','nvptx64-unknown-unknown'],(8,24,0,32,64)), + (['-target','i386-pc-win32'],(8,16,0,32,64)), + (['-target','msp430-none-none'],(2,14,0,32,64))] + for flags, values in tries: + align,total,bariton,foo,bar = values + tu = get_tu(source) + teststruct = get_cursor(tu, 'Test') + fields = list(teststruct.get_children()) + assert teststruct.type.get_offset("bariton") == bariton + assert teststruct.type.get_offset("foo") == foo + assert teststruct.type.get_offset("bar") == bar + + diff --git a/bindings/python/tests/cindex/util.py b/bindings/python/tests/cindex/util.py index 2323839..8614b02 100644 --- a/bindings/python/tests/cindex/util.py +++ b/bindings/python/tests/cindex/util.py @@ -3,7 +3,7 @@ from clang.cindex import Cursor from clang.cindex import TranslationUnit -def get_tu(source, lang='c', all_warnings=False): +def get_tu(source, lang='c', all_warnings=False, flags=[]): """Obtain a translation unit from source and language. By default, the translation unit is created from source file "t.<ext>" @@ -14,8 +14,8 @@ def get_tu(source, lang='c', all_warnings=False): all_warnings is a convenience argument to enable all compiler warnings. """ + args = list(flags) name = 't.c' - args = [] if lang == 'cpp': name = 't.cpp' args.append('-std=c++11') |