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

Jonathan Wakely jwakely@redhat.com
Fri May 22 17:48:00 GMT 2015


On 22/05/15 16:21 +0100, Jonathan Wakely wrote:
>On 22/05/15 17:13 +0200, Jakub Jelinek wrote:
>>On Fri, May 22, 2015 at 03:59:47PM +0100, Jonathan Wakely wrote:
>>>>>+      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.
>>
>>Just grepped around, and e.g. on powerpc64le-linux -std=c++11 -malign-power -O2
>>typedef double _Tp;
>>struct _Tp2 { _Tp _M_t; };
>>extern _Tp2 tp2e;
>>int a = alignof(_Tp2);
>>int b = __alignof__(_Tp2::_M_t);
>>int c = alignof(_Tp);
>>int d = __alignof__(tp2e._M_t);
>>int e = alignof(_Tp2::_M_t);
>>
>>we have a = 8, b = 4, c = 8, d = 4, e = 4.
>
>OK, thanks.
>
>>Note clang++ with -pedantic-errors errors out on alignof(_Tp2::_M_t) though.
>
>It allows __alignof__ though.

Revised patches attached, as two separate commits because the first
should be backported but the second doesn't need to be.

This includes the necessary changes for the Python printers.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 18232 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20150522/38add005/attachment.bin>


More information about the Libstdc++ mailing list