1""" 2Test that we correctly handle inline namespaces. 3""" 4 5import lldb 6 7from lldbsuite.test.decorators import * 8from lldbsuite.test.lldbtest import * 9from lldbsuite.test import lldbutil 10 11 12class TestInlineNamespace(TestBase): 13 14 def test(self): 15 self.build() 16 17 lldbutil.run_to_source_breakpoint(self, 18 "// Set break point at this line.", lldb.SBFileSpec("main.cpp")) 19 20 # The 'A::B::f' function must be found via 'A::f' as 'B' is an inline 21 # namespace. 22 self.expect_expr("A::f()", result_type="int", result_value="3") 23 # But we should still find the function when we pretend the inline 24 # namespace is not inline. 25 self.expect_expr("A::B::f()", result_type="int", result_value="3") 26 27 self.expect_expr("A::B::global_var", result_type="int", result_value="0") 28 # FIXME: should be ambiguous lookup but ClangExpressionDeclMap takes 29 # first global variable that the lookup found, which in this case 30 # is A::B::global_var 31 self.expect_expr("A::global_var", result_type="int", result_value="0") 32 33 self.expect_expr("A::B::C::global_var", result_type="int", result_value="1") 34 self.expect_expr("A::C::global_var", result_type="int", result_value="1") 35 36 self.expect_expr("A::B::D::nested_var", result_type="int", result_value="2") 37 self.expect_expr("A::D::nested_var", result_type="int", result_value="2") 38 self.expect_expr("A::B::nested_var", result_type="int", result_value="2") 39 self.expect_expr("A::nested_var", result_type="int", result_value="2") 40 41 self.expect_expr("A::E::F::other_var", result_type="int", result_value="3") 42 self.expect_expr("A::E::other_var", result_type="int", result_value="3") 43 44 self.expect("expr A::E::global_var", error=True, substrs=["no member named 'global_var' in namespace 'A::E'"]) 45 self.expect("expr A::E::F::global_var", error=True, substrs=["no member named 'global_var' in namespace 'A::E::F'"]) 46 47 self.expect("expr A::other_var", error=True, substrs=["no member named 'other_var' in namespace 'A'"]) 48 self.expect("expr A::B::other_var", error=True, substrs=["no member named 'other_var' in namespace 'A::B'"]) 49 self.expect("expr B::other_var", error=True, substrs=["no member named 'other_var' in namespace 'A::B'"]) 50 51 # 'frame variable' can correctly distinguish between A::B::global_var and A::global_var 52 gvars = self.target().FindGlobalVariables("A::global_var", 10) 53 self.assertEqual(len(gvars), 1) 54 self.assertEqual(gvars[0].GetValueAsSigned(), 4) 55 56 self.expect("frame variable A::global_var", substrs=["(int) A::global_var = 4"]) 57 self.expect("frame variable A::B::global_var", substrs=["(int) A::B::global_var = 0"]) 58