summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/ext
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-11-29 12:32:57 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2018-11-29 12:32:57 +0000
commit8c9b385288609fa4af9df746464b26130c9034b1 (patch)
treea9708881adbc46a1ebb865004599bd1243140bb6 /libstdc++-v3/include/ext
parent479db22783ba162939d607c2a5da5332c09064e0 (diff)
downloadgcc-8c9b385288609fa4af9df746464b26130c9034b1.tar.gz
PR libstdc++/88119 use alignof in std::alignment_of, not __alignof__
Now that __alignof__ and alignof sometimes disagree it matters which one we use. The standard says that std::alignment_of<T>::value equals alignof(T), so we need to use that. Change the only uses of alignment_of to use __alignof__ to avoid a change in alignment. PR libstdc++/88119 * include/ext/aligned_buffer.h (__aligned_membuf): Add comment. (__aligned_buffer): Use __alignof__ instead of std::alignment_of. * include/std/type_traits (alignment_of): Use alignof instead of __alignof__. * testsuite/20_util/alignment_of/value.cc: Fix test to check values match alignof not __alignof__, as required by the standard. From-SVN: r266613
Diffstat (limited to 'libstdc++-v3/include/ext')
-rw-r--r--libstdc++-v3/include/ext/aligned_buffer.h7
1 files changed, 4 insertions, 3 deletions
diff --git a/libstdc++-v3/include/ext/aligned_buffer.h b/libstdc++-v3/include/ext/aligned_buffer.h
index 81fb797723c..2fc8f12e62d 100644
--- a/libstdc++-v3/include/ext/aligned_buffer.h
+++ b/libstdc++-v3/include/ext/aligned_buffer.h
@@ -49,6 +49,8 @@ namespace __gnu_cxx
// Target macro ADJUST_FIELD_ALIGN can produce different alignment for
// types when used as class members. __aligned_membuf is intended
// for use as a class member, so align the buffer as for a class member.
+ // Since GCC 8 we could just use alignof(_Tp) instead, but older
+ // versions of non-GNU compilers might still need this trick.
struct _Tp2 { _Tp _M_t; };
alignas(__alignof__(_Tp2::_M_t)) unsigned char _M_storage[sizeof(_Tp)];
@@ -86,11 +88,10 @@ namespace __gnu_cxx
// This type is still used to avoid an ABI change.
template<typename _Tp>
struct __aligned_buffer
- : std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>
+ : std::aligned_storage<sizeof(_Tp), __alignof__(_Tp)>
{
typename
- std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>::type
- _M_storage;
+ std::aligned_storage<sizeof(_Tp), __alignof__(_Tp)>::type _M_storage;
__aligned_buffer() = default;