------- Comment #9 from rguenther at suse dot de 2009-09-09 11:30 -------
Subject: Re: forward_list::sort violates strict aliasing
rules
On Wed, 9 Sep 2009, paolo dot carlini at oracle dot com wrote:
> ------- Comment #8 from paolo dot carlini at oracle dot com 2009-09-09 11:23
> -------
> if I understand correctly what we would change, I'm not sure to like this
> casting from _Fwd_list_node_base* to _Fwd_list_node* inside
> _Fwd_list_node_base...
No, it would be
Index: forward_list.h
===================================================================
--- forward_list.h (revision 151557)
+++ forward_list.h (working copy)
@@ -84,6 +84,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
template<typename _Tp, typename _Alloc>
struct _Fwd_list_node : public _Fwd_list_node_base<_Alloc>
{
+ typedef _Fwd_list_node_base<_Alloc> _Base;
typedef typename _Alloc::template rebind<_Fwd_list_node<_Tp,
_Alloc> >
::other::pointer _Pointer;
Index: forward_list.tcc
===================================================================
--- forward_list.tcc (revision 151557)
+++ forward_list.tcc (working copy)
@@ -87,7 +87,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
_M_sort_after(_Comp __comp)
{
// If `next' is 0, return immediately.
- _Pointer __list = __static_pointer_cast<_Pointer>(this->_M_next);
+ _Pointer __list =
__static_pointer_cast<_Pointer>(reinterpret_cast <_Base
*>(this)->_M_next);
if (!__list)
return;
@@ -171,7 +171,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
// Allow for nmerges == 0, the empty list case.
if (__nmerges <= 1)
{
- this->_M_next = __list;
+ reinterpret_cast<_Base *>(this)->_M_next = __list;
return;
}
but appearantly we are able to mess this up during folding again...
Richard.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41316