[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