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)?
Wouldn't it be safer to use alignof(_Tp2::_M_t) here?
Though, apparently that is a GNU extension, so you'd need to use __alignof__
instead.

        Jakub

Reply via email to