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 def test(self): 14 self.build() 15 16 lldbutil.run_to_source_breakpoint( 17 self, "// Set break point at this line.", lldb.SBFileSpec("main.cpp") 18 ) 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( 45 "expr A::E::global_var", 46 error=True, 47 substrs=["no member named 'global_var' in namespace 'A::E'"], 48 ) 49 self.expect( 50 "expr A::E::F::global_var", 51 error=True, 52 substrs=["no member named 'global_var' in namespace 'A::E::F'"], 53 ) 54 55 self.expect( 56 "expr A::other_var", 57 error=True, 58 substrs=["no member named 'other_var' in namespace 'A'"], 59 ) 60 self.expect( 61 "expr A::B::other_var", 62 error=True, 63 substrs=["no member named 'other_var' in namespace 'A::B'"], 64 ) 65 self.expect( 66 "expr B::other_var", 67 error=True, 68 substrs=["no member named 'other_var' in namespace 'A::B'"], 69 ) 70 71 # 'frame variable' can correctly distinguish between A::B::global_var and A::global_var 72 gvars = self.target().FindGlobalVariables("A::global_var", 10) 73 self.assertEqual(len(gvars), 1) 74 self.assertEqual(gvars[0].GetValueAsSigned(), 4) 75 76 self.expect("frame variable A::global_var", substrs=["(int) A::global_var = 4"]) 77 self.expect( 78 "frame variable A::B::global_var", substrs=["(int) A::B::global_var = 0"] 79 ) 80