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; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits