From 91b7d325e08cf6ecee1d423f5099187bb6c0cd40 Mon Sep 17 00:00:00 2001 From: Andrey Semashev Date: Sun, 1 Mar 2020 16:48:08 +0300 Subject: [PATCH] Added a workaround for older gcc and clang with broken std::alignment_of. gcc older than 8.1 and clang older than 8.0 produce incorrect results of std::alignment_of for 64-bit types on 32-bit x86. Use boost::alignment_of, which contains workarounds for these compilers. --- .../atomic/detail/type_traits/alignment_of.hpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/include/boost/atomic/detail/type_traits/alignment_of.hpp b/include/boost/atomic/detail/type_traits/alignment_of.hpp index 8b0ecda..faef7d1 100644 --- a/include/boost/atomic/detail/type_traits/alignment_of.hpp +++ b/include/boost/atomic/detail/type_traits/alignment_of.hpp @@ -15,7 +15,16 @@ #define BOOST_ATOMIC_DETAIL_TYPE_TRAITS_ALIGNMENT_OF_HPP_INCLUDED_ #include -#if !defined(BOOST_ATOMIC_DETAIL_NO_CXX11_BASIC_HDR_TYPE_TRAITS) + +#if defined(BOOST_ATOMIC_DETAIL_NO_CXX11_BASIC_HDR_TYPE_TRAITS) ||\ + (defined(BOOST_GCC) && (BOOST_GCC+0) < 80100) ||\ + (defined(BOOST_CLANG) && !defined(__apple_build_version__) && (__clang_major__+0) < 8) ||\ + (defined(BOOST_CLANG) && defined(__apple_build_version__) && (__clang_major__+0) < 9) +// For some compilers std::alignment_of gives the wrong result for 64-bit types on 32-bit targets +#define BOOST_ATOMIC_DETAIL_NO_CXX11_STD_ALIGNMENT_OF +#endif + +#if !defined(BOOST_ATOMIC_DETAIL_NO_CXX11_STD_ALIGNMENT_OF) #include #else #include @@ -29,7 +38,7 @@ namespace boost { namespace atomics { namespace detail { -#if !defined(BOOST_ATOMIC_DETAIL_NO_CXX11_BASIC_HDR_TYPE_TRAITS) +#if !defined(BOOST_ATOMIC_DETAIL_NO_CXX11_STD_ALIGNMENT_OF) using std::alignment_of; #else using boost::alignment_of;