On 22/05/15 16:29 +0200, Jakub Jelinek wrote:
On Fri, May 22, 2015 at 03:15:10PM +0100, Jonathan Wakely wrote:
--- a/libstdc++-v3/include/ext/aligned_buffer.h
+++ b/libstdc++-v3/include/ext/aligned_buffer.h
@@ -31,21 +31,23 @@

 #pragma GCC system_header

-#if __cplusplus >= 201103L
-# include <type_traits>
-#else
+#if __cplusplus < 201103L
 # include <bits/c++0x_warning.h>
 #endif

+#include <cstddef>
+
 namespace __gnu_cxx
 {
   template<typename _Tp>
     struct __aligned_buffer
-    : std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>
     {
-      typename
-       std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>::type
-       _M_storage;
+      // Target macro ADJUST_FIELD_ALIGN can produce different alignment for
+      // types when used as class members. __aligned_buffer is intended for
+      // use as a class member, so align the buffer as for a class member.
+      struct _Tp2 { _Tp _M_t; };
+
+      alignas(alignof(_Tp2)) unsigned char _M_storage[sizeof(_Tp)];

Is alignof(_Tp2) always the same as alignof(_Tp2::_M_t) on all targets
(I mean, won't some target align the structure more than its only field)?

Hmm, maybe. I don't know.

Wouldn't it be safer to use alignof(_Tp2::_M_t) here?

Yes.

Though, apparently that is a GNU extension, so you'd need to use __alignof__
instead.

Yes, that's what I did in an earlier version of the patch, so I'll go
back to that.

Reply via email to