From 4019699fa5fd153586f02fd7f6b7cfc51a688bf2 Mon Sep 17 00:00:00 2001 From: Raphael Isemann Date: Wed, 13 Oct 2021 17:05:30 +0200 Subject: [PATCH] [lldb] Add a test for CRTP --- lldb/test/API/lang/cpp/crtp/Makefile | 3 ++ lldb/test/API/lang/cpp/crtp/TestCppCRTP.py | 36 ++++++++++++++++++++++ lldb/test/API/lang/cpp/crtp/main.cpp | 17 ++++++++++ 3 files changed, 56 insertions(+) create mode 100644 lldb/test/API/lang/cpp/crtp/Makefile create mode 100644 lldb/test/API/lang/cpp/crtp/TestCppCRTP.py create mode 100644 lldb/test/API/lang/cpp/crtp/main.cpp diff --git a/lldb/test/API/lang/cpp/crtp/Makefile b/lldb/test/API/lang/cpp/crtp/Makefile new file mode 100644 index 000000000000..99998b20bcb0 --- /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 000000000000..f511ad75455a --- /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"), + 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 000000000000..ed33115b88a9 --- /dev/null +++ b/lldb/test/API/lang/cpp/crtp/main.cpp @@ -0,0 +1,17 @@ +template struct Base { + Base(T &t) : ref(t), pointer(&t) {} + // Try referencing `Derived` via different 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() : Base(*this) {} + int member = 0; +}; + +Derived derived; + +int main() { return derived.member; }