[patch] libstdc++/66017 Avoid bad casts and fix alignment of _Rb_tree_node<long long>::_M_storage

Jakub Jelinek jakub@redhat.com
Fri May 22 14:29:00 GMT 2015


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



More information about the Libstdc++ mailing list