mirror of
https://github.com/boostorg/intrusive.git
synced 2025-07-30 04:27:34 +02:00
Use launder to make sure compilers assume that a parent type exists and it's alive
This commit is contained in:
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <boost/intrusive/detail/config_begin.hpp>
|
#include <boost/intrusive/detail/config_begin.hpp>
|
||||||
#include <boost/intrusive/detail/workaround.hpp>
|
#include <boost/intrusive/detail/workaround.hpp>
|
||||||
|
#include <boost/move/detail/launder.hpp>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
@ -90,15 +91,15 @@ BOOST_INTRUSIVE_FORCEINLINE std::ptrdiff_t offset_from_pointer_to_member(const M
|
|||||||
template<class Parent, class Member>
|
template<class Parent, class Member>
|
||||||
BOOST_INTRUSIVE_FORCEINLINE Parent *parent_from_member(Member *member, const Member Parent::* ptr_to_member)
|
BOOST_INTRUSIVE_FORCEINLINE Parent *parent_from_member(Member *member, const Member Parent::* ptr_to_member)
|
||||||
{
|
{
|
||||||
return reinterpret_cast<Parent*>
|
return boost::move_detail::launder(reinterpret_cast<Parent*>
|
||||||
(reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)));
|
(reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member))));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Parent, class Member>
|
template<class Parent, class Member>
|
||||||
BOOST_INTRUSIVE_FORCEINLINE const Parent *parent_from_member(const Member *member, const Member Parent::* ptr_to_member)
|
BOOST_INTRUSIVE_FORCEINLINE const Parent *parent_from_member(const Member *member, const Member Parent::* ptr_to_member)
|
||||||
{
|
{
|
||||||
return reinterpret_cast<const Parent*>
|
return boost::move_detail::launder(reinterpret_cast<const Parent*>
|
||||||
( reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)) );
|
( reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)) ));
|
||||||
}
|
}
|
||||||
|
|
||||||
} //namespace detail {
|
} //namespace detail {
|
||||||
|
Reference in New Issue
Block a user