forked from OSchip/llvm-project
[lldb] Add a test for CRTP
This commit is contained in:
parent
7fd6f40dbd
commit
4019699fa5
|
@ -0,0 +1,3 @@
|
|||
CXX_SOURCES := main.cpp
|
||||
|
||||
include Makefile.rules
|
|
@ -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")
|
|
@ -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; }
|
Loading…
Reference in New Issue