diff --git a/src/kernel/bitcoinkernel_wrapper.h b/src/kernel/bitcoinkernel_wrapper.h index 38dd709f948..12299dfa130 100644 --- a/src/kernel/bitcoinkernel_wrapper.h +++ b/src/kernel/bitcoinkernel_wrapper.h @@ -341,8 +341,10 @@ public: Handle(Handle&& other) noexcept : m_ptr(other.m_ptr) { other.m_ptr = nullptr; } Handle& operator=(Handle&& other) noexcept { - DestroyFunc(m_ptr); - m_ptr = std::exchange(other.m_ptr, nullptr); + if (this != &other) { + DestroyFunc(m_ptr); + m_ptr = std::exchange(other.m_ptr, nullptr); + } return *this; } diff --git a/src/test/kernel/test_kernel.cpp b/src/test/kernel/test_kernel.cpp index b22a5edede9..76b8398a7d7 100644 --- a/src/test/kernel/test_kernel.cpp +++ b/src/test/kernel/test_kernel.cpp @@ -315,6 +315,16 @@ void CheckHandle(T object, T distinct_object) if constexpr (HasToBytes) { check_equal(object2.ToBytes(), object3.ToBytes()); } + + // Self move-assignment must not destroy the held resource. + // Use a reference to avoid -Wself-move warnings. + original_ptr = object2.get(); + auto& object2_ref = object2; + object2 = std::move(object2_ref); + BOOST_CHECK_EQUAL(object2.get(), original_ptr); + if constexpr (HasToBytes) { + check_equal(object2.ToBytes(), object3.ToBytes()); + } } template