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