From 9118518516ef858def22318bc7e5360783ad76ee Mon Sep 17 00:00:00 2001 From: Andrzej Krzemienski Date: Sat, 20 Feb 2016 16:36:48 +0100 Subject: [PATCH] more extensive speculative fix --- .../optional/detail/optional_aligned_storage.hpp | 15 +++++++++------ include/boost/optional/optional.hpp | 6 +++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/include/boost/optional/detail/optional_aligned_storage.hpp b/include/boost/optional/detail/optional_aligned_storage.hpp index 35b3d12..6c7d581 100644 --- a/include/boost/optional/detail/optional_aligned_storage.hpp +++ b/include/boost/optional/detail/optional_aligned_storage.hpp @@ -49,21 +49,24 @@ class aligned_storage #if defined(BOOST_OPTIONAL_DETAIL_USE_ATTRIBUTE_MAY_ALIAS) // This workaround is supposed to silence GCC warnings about broken strict aliasing rules - T const& ref() const + T const* ptr_ref() const { union { void const* ap_pvoid; T const* as_ptype; } caster = { address() }; - return *caster.as_ptype; + return caster.as_ptype; } - T & ref() + T * ptr_ref() { union { void* ap_pvoid; T* as_ptype; } caster = { address() }; - return *caster.as_ptype; + return caster.as_ptype; } #else - T const& ref() const { return *static_cast(address()); } - T & ref() { return *static_cast (address()); } + T const* ptr_ref() const { return static_cast(address()); } + T * ptr_ref() { return static_cast (address()); } #endif + T const& ref() const { return *ptr_ref(); } + T & ref() { return *ptr_ref(); } + } ; } // namespace optional_detail diff --git a/include/boost/optional/optional.hpp b/include/boost/optional/optional.hpp index 5ead15f..46717fe 100644 --- a/include/boost/optional/optional.hpp +++ b/include/boost/optional/optional.hpp @@ -555,13 +555,13 @@ class optional_base : public optional_tag reference_const_type get_impl() const { return m_storage.ref() ; } reference_type get_impl() { return m_storage.ref() ; } - pointer_const_type get_ptr_impl() const { return boost::addressof(m_storage.ref()); } - pointer_type get_ptr_impl() { return boost::addressof(m_storage.ref()); } + pointer_const_type get_ptr_impl() const { return m_storage.ptr_ref(); } + pointer_type get_ptr_impl() { return m_storage.ptr_ref(); } private : #if BOOST_WORKAROUND(BOOST_MSVC, <= 1600) - void destroy_impl ( ) { boost::addressof(m_storage.ref())->~T() ; m_initialized = false ; } + void destroy_impl ( ) { m_storage.ptr_ref()->~T() ; m_initialized = false ; } #else void destroy_impl ( ) { m_storage.ref().T::~T() ; m_initialized = false ; } #endif