[lldb] Add a test for CRTP

This commit is contained in:
Raphael Isemann 2021-10-13 17:05:30 +02:00
parent 7fd6f40dbd
commit 4019699fa5
3 changed files with 56 additions and 0 deletions

View File

@ -0,0 +1,3 @@
CXX_SOURCES := main.cpp
include Makefile.rules

View File

@ -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")

View File

@ -0,0 +1,17 @@
template <typename T> 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> {
Derived() : Base<Derived>(*this) {}
int member = 0;
};
Derived derived;
int main() { return derived.member; }