diff --git a/src/test/miniscript_tests.cpp b/src/test/miniscript_tests.cpp index 0cd5b62f7de..757f89b63bc 100644 --- a/src/test/miniscript_tests.cpp +++ b/src/test/miniscript_tests.cpp @@ -727,4 +727,25 @@ BOOST_AUTO_TEST_CASE(fixed_tests) g_testdata.reset(); } +// Confirm that ~Node(), Node::Clone() and operator=(Node&&) are stack-safe. +BOOST_AUTO_TEST_CASE(node_deep_destruct) +{ + using miniscript::internal::NoDupCheck; + using miniscript::Fragment; + using NodeU32 = miniscript::Node; + + constexpr auto ctx{miniscript::MiniscriptContext::P2WSH}; + + NodeU32 root{NoDupCheck{}, ctx, Fragment::JUST_1}; + for (uint32_t i{0}; i < 200'000; ++i) { + root = NodeU32{NoDupCheck{}, ctx, Fragment::WRAP_S, Vector(std::move(root))}; + } + BOOST_CHECK_EQUAL(root.ScriptSize(), 200'001); + + auto clone{root.Clone()}; + BOOST_CHECK_EQUAL(clone.ScriptSize(), root.ScriptSize()); + + clone = std::move(root); +} + BOOST_AUTO_TEST_SUITE_END()