80 lines · python
1"""2Test that we correctly handle inline namespaces.3"""4 5import lldb6 7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 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 inline21 # 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 inline24 # 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 takes29 # first global variable that the lookup found, which in this case30 # is A::B::global_var31 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_var72 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