diff --git a/include/boost/container/small_vector.hpp b/include/boost/container/small_vector.hpp index bb8293f..2ad0410 100644 --- a/include/boost/container/small_vector.hpp +++ b/include/boost/container/small_vector.hpp @@ -449,19 +449,21 @@ BOOST_CONTAINER_FORCEINLINE typename small_vector_allocator strawman_t; typedef typename strawman_t::sm_storage_t sm_storage_t; + //These warnings are false positives, as we know the alignment is correct + //and aligned storage is allowed to hold any type #if defined(BOOST_GCC) && (BOOST_GCC >= 40600) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" + #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif const vector_type& v = reinterpret_cast(*this); BOOST_ASSERT((std::size_t(this) % dtl::alignment_of::value) == 0); + const strawman_t &straw = static_cast(v); + const sm_storage_t& stor = static_cast(straw); + return boost::intrusive::pointer_traits::pointer_to(*((const T*)stor.m_storage.data)); #if defined(BOOST_GCC) && (BOOST_GCC >= 40600) #pragma GCC diagnostic pop #endif - - const strawman_t &straw = static_cast(v); - const sm_storage_t& stor = static_cast(straw); - return boost::intrusive::pointer_traits::pointer_to(*((T*)&stor.m_storage)); } template @@ -474,16 +476,16 @@ BOOST_CONTAINER_FORCEINLINE typename small_vector_allocator= 40600) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" + #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif vector_type& v = reinterpret_cast(*this); BOOST_ASSERT((std::size_t(this) % dtl::alignment_of::value) == 0); + strawman_t &straw = static_cast(v); + sm_storage_t& stor = static_cast(straw); + return boost::intrusive::pointer_traits::pointer_to(*((T*)stor.m_storage.data)); #if defined(BOOST_GCC) && (BOOST_GCC >= 40600) #pragma GCC diagnostic pop #endif - - strawman_t &straw = static_cast(v); - sm_storage_t& stor = static_cast(straw); - return boost::intrusive::pointer_traits::pointer_to(*((T*)&stor.m_storage)); }