1 import os 2 from clang.cindex import Config 3 if 'CLANG_LIBRARY_PATH' in os.environ: 4 Config.set_library_path(os.environ['CLANG_LIBRARY_PATH']) 5 6 from clang.cindex import TLSKind 7 from clang.cindex import Cursor 8 from clang.cindex import TranslationUnit 9 10 from .util import get_cursor 11 from .util import get_tu 12 13 import unittest 14 15 16 class TestTLSKind(unittest.TestCase): 17 def test_tls_kind(self): 18 """Ensure that thread-local storage kinds are available on cursors.""" 19 20 tu = get_tu(""" 21 int tls_none; 22 thread_local int tls_dynamic; 23 _Thread_local int tls_static; 24 """, lang = 'cpp') 25 26 tls_none = get_cursor(tu.cursor, 'tls_none') 27 self.assertEqual(tls_none.tls_kind, TLSKind.NONE) 28 29 tls_dynamic = get_cursor(tu.cursor, 'tls_dynamic') 30 self.assertEqual(tls_dynamic.tls_kind, TLSKind.DYNAMIC) 31 32 tls_static = get_cursor(tu.cursor, 'tls_static') 33 self.assertEqual(tls_static.tls_kind, TLSKind.STATIC) 34 35 # The following case tests '__declspec(thread)'. Since it is a Microsoft 36 # specific extension, specific flags are required for the parser to pick 37 # these up. 38 flags = ['-fms-extensions', '-target', 'x86_64-unknown-windows-win32', 39 '-fms-compatibility-version=18'] 40 tu = get_tu(""" 41 __declspec(thread) int tls_declspec_msvc18; 42 """, lang = 'cpp', flags=flags) 43 44 tls_declspec_msvc18 = get_cursor(tu.cursor, 'tls_declspec_msvc18') 45 self.assertEqual(tls_declspec_msvc18.tls_kind, TLSKind.STATIC) 46 47 flags = ['-fms-extensions', '-target', 'x86_64-unknown-windows-win32', 48 '-fms-compatibility-version=19'] 49 tu = get_tu(""" 50 __declspec(thread) int tls_declspec_msvc19; 51 """, lang = 'cpp', flags=flags) 52 53 tls_declspec_msvc19 = get_cursor(tu.cursor, 'tls_declspec_msvc19') 54 self.assertEqual(tls_declspec_msvc19.tls_kind, TLSKind.DYNAMIC) 55