• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""
2Test that the expression evaluator can access members of nested classes even if
3the parents of the nested classes were imported from another compilation unit.
4"""
5import lldb
6from lldbsuite.test.decorators import *
7from lldbsuite.test.lldbtest import *
8from lldbsuite.test import lldbutil
9
10
11class TestNestedClassWithParentInAnotherCU(TestBase):
12    mydir = TestBase.compute_mydir(__file__)
13
14    def test_nested_class_with_parent_in_another_cu(self):
15        self.main_source_file = lldb.SBFileSpec("main.cpp")
16        self.build()
17        (_, _, thread, _) = lldbutil.run_to_source_breakpoint(self, "// break here", self.main_source_file)
18        frame = thread.GetSelectedFrame()
19        # Parse the DIEs of the parent classes and the nested classes from
20        # other.cpp's CU.
21        warmup_result = frame.EvaluateExpression("b")
22        self.assertTrue(warmup_result.IsValid())
23        # Inspect fields of the nested classes. This will reuse the types that
24        # were parsed during the evaluation above. By accessing a chain of
25        # fields, we try to verify that all the DIEs, reused types and
26        # declaration contexts were wired properly into lldb's parser's state.
27        expr_result = frame.EvaluateExpression("a.y.oY_inner.oX_inner")
28        self.assertTrue(expr_result.IsValid())
29        self.assertEqual(expr_result.GetValue(), "42")
30