[Lldb-commits] [lldb] 4019699 - [lldb] Add a test for CRTP
Raphael Isemann via lldb-commits
lldb-commits at lists.llvm.org
Wed Oct 13 08:15:25 PDT 2021
Author: Raphael Isemann
Date: 2021-10-13T17:15:02+02:00
New Revision: 4019699fa5fd153586f02fd7f6b7cfc51a688bf2
URL: https://github.com/llvm/llvm-project/commit/4019699fa5fd153586f02fd7f6b7cfc51a688bf2
DIFF: https://github.com/llvm/llvm-project/commit/4019699fa5fd153586f02fd7f6b7cfc51a688bf2.diff
LOG: [lldb] Add a test for CRTP
Added:
lldb/test/API/lang/cpp/crtp/Makefile
lldb/test/API/lang/cpp/crtp/TestCppCRTP.py
lldb/test/API/lang/cpp/crtp/main.cpp
Modified:
Removed:
################################################################################
diff --git a/lldb/test/API/lang/cpp/crtp/Makefile b/lldb/test/API/lang/cpp/crtp/Makefile
new file mode 100644
index 0000000000000..99998b20bcb05
--- /dev/null
+++ b/lldb/test/API/lang/cpp/crtp/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
diff --git a/lldb/test/API/lang/cpp/crtp/TestCppCRTP.py b/lldb/test/API/lang/cpp/crtp/TestCppCRTP.py
new file mode 100644
index 0000000000000..f511ad75455a4
--- /dev/null
+++ b/lldb/test/API/lang/cpp/crtp/TestCppCRTP.py
@@ -0,0 +1,36 @@
+"""
+A test for the curiously recurring template pattern (or CRTP).
+
+Note that the derived class is referenced directly from the parent class in the
+test. If this fails then there is a good chance that LLDB tried to eagerly
+resolve the definition of the derived class while constructing the base class.
+"""
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @no_debug_info_test
+ def test(self):
+ self.build()
+ self.createTestTarget()
+
+ # Try using the class in the expression evaluator.
+ self.expect_expr(
+ "derived",
+ result_type="Derived",
+ result_children=[
+ ValueCheck(name="Base<Derived>"),
+ ValueCheck(name="member", value="0"),
+ ],
+ )
+
+ # Try accessing the members of the class and base class.
+ self.expect_expr("derived.pointer", result_type="Derived *")
+ self.expect_expr("derived.member", result_type="int", result_value="0")
diff --git a/lldb/test/API/lang/cpp/crtp/main.cpp b/lldb/test/API/lang/cpp/crtp/main.cpp
new file mode 100644
index 0000000000000..ed33115b88a93
--- /dev/null
+++ b/lldb/test/API/lang/cpp/crtp/main.cpp
@@ -0,0 +1,17 @@
+template <typename T> struct Base {
+ Base(T &t) : ref(t), pointer(&t) {}
+ // Try referencing `Derived` via
diff erent ways to potentially make LLDB
+ // pull in the definition (which would recurse back to this base class).
+ T &ref;
+ T *pointer;
+ T func() { return ref; }
+};
+
+struct Derived : Base<Derived> {
+ Derived() : Base<Derived>(*this) {}
+ int member = 0;
+};
+
+Derived derived;
+
+int main() { return derived.member; }
More information about the lldb-commits
mailing list