summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit')
-rw-r--r--gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/Makefile3
-rw-r--r--gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/TestNestedClassWithParentInAnotherCU.py29
-rw-r--r--gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/main.cpp22
-rw-r--r--gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/other.cpp10
-rw-r--r--gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/shared.h17
5 files changed, 81 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/Makefile b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/Makefile
new file mode 100644
index 00000000000..020dce7c31d
--- /dev/null
+++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp other.cpp
+
+include Makefile.rules
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/TestNestedClassWithParentInAnotherCU.py b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/TestNestedClassWithParentInAnotherCU.py
new file mode 100644
index 00000000000..5b590d6363a
--- /dev/null
+++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/TestNestedClassWithParentInAnotherCU.py
@@ -0,0 +1,29 @@
+"""
+Test that the expression evaluator can access members of nested classes even if
+the parents of the nested classes were imported from another compilation unit.
+"""
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestNestedClassWithParentInAnotherCU(TestBase):
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_nested_class_with_parent_in_another_cu(self):
+ self.main_source_file = lldb.SBFileSpec("main.cpp")
+ self.build()
+ (_, _, thread, _) = lldbutil.run_to_source_breakpoint(self, "// break here", self.main_source_file)
+ frame = thread.GetSelectedFrame()
+ # Parse the DIEs of the parent classes and the nested classes from
+ # other.cpp's CU.
+ warmup_result = frame.EvaluateExpression("b")
+ self.assertTrue(warmup_result.IsValid())
+ # Inspect fields of the nested classes. This will reuse the types that
+ # were parsed during the evaluation above. By accessing a chain of
+ # fields, we try to verify that all the DIEs, reused types and
+ # declaration contexts were wired properly into lldb's parser's state.
+ expr_result = frame.EvaluateExpression("a.y.oY_inner.oX_inner")
+ self.assertTrue(expr_result.IsValid())
+ self.assertEqual(expr_result.GetValue(), "42")
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/main.cpp b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/main.cpp
new file mode 100644
index 00000000000..8a6e6ff81d2
--- /dev/null
+++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/main.cpp
@@ -0,0 +1,22 @@
+#include "shared.h"
+
+struct WrapperA {
+ OuterY::Inner<unsigned int> y;
+};
+
+int main() {
+ // WrapperA refers to the Inner and Outer class DIEs from this CU.
+ WrapperA a;
+ // WrapperB refers to the Inner and Outer DIEs from the other.cpp CU.
+ // It is important that WrapperB is only forward-declared in shared.h.
+ WrapperB* b = foo();
+
+ // Evaluating 'b' here will parse other.cpp's DIEs for all
+ // the Inner and Outer classes from shared.h.
+ //
+ // Evaluating 'a' here will find and reuse the already-parsed
+ // versions of the Inner and Outer classes. In the associated test
+ // we make sure that we can still resolve all the types properly
+ // by evaluating 'a.y.oY_inner.oX_inner'.
+ return 0; // break here
+}
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/other.cpp b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/other.cpp
new file mode 100644
index 00000000000..71a9579c4e8
--- /dev/null
+++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/other.cpp
@@ -0,0 +1,10 @@
+#include "shared.h"
+
+struct WrapperB {
+ OuterY y;
+ OuterX x;
+};
+
+WrapperB* foo() {
+ return new WrapperB();
+}
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/shared.h b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/shared.h
new file mode 100644
index 00000000000..627f49ab79c
--- /dev/null
+++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/nested-class-other-compilation-unit/shared.h
@@ -0,0 +1,17 @@
+struct OuterX {
+ template<typename T>
+ struct Inner {
+ int oX_inner = 42;
+ };
+};
+
+struct OuterY {
+ template<typename T>
+ struct Inner {
+ typename OuterX::Inner<T> oY_inner;
+ };
+};
+
+struct WrapperB;
+
+WrapperB* foo();