https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91531

            Bug ID: 91531
           Summary: _Rb_tree's copy assignment should respect to POCCA
                    regardless of is_always_equal
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: frankhb1989 at gmail dot com
  Target Milestone: ---

In <bits/stl_tree.h>:

  template<typename _Key, typename _Val, typename _KeyOfValue,
           typename _Compare, typename _Alloc>
    _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&
    _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
    operator=(const _Rb_tree& __x)
    {
      if (this != &__x)
        {
          // Note that _Key may be a constant type.
#if __cplusplus >= 201103L
          if (_Alloc_traits::_S_propagate_on_copy_assign())
            {
              auto& __this_alloc = this->_M_get_Node_allocator();
              auto& __that_alloc = __x._M_get_Node_allocator();
              if (!_Alloc_traits::_S_always_equal()
                  && __this_alloc != __that_alloc)
                {
                  // Replacement allocator cannot free existing storage, we
need
                  // to erase nodes first.
                  clear();
                  std::__alloc_on_copy(__this_alloc, __that_alloc);
                }
            }
#endif

          _Reuse_or_alloc_node __roan(*this);
          _M_impl._M_reset();
          _M_impl._M_key_compare = __x._M_impl._M_key_compare;
          if (__x._M_root() != 0)
            _M_root() = _M_copy(__x, __roan);
        }

      return *this;
}

As `std::__alloc_on_copy` is called only when
`!_Alloc_traits::_S_always_equal() && __this_alloc != __that_alloc`, so a POCCA
allocator will not be propagated once it is always equal. This is also not
consistent with all sequence/unordered associative standard allocator-aware
containers implemented in libstdc++.

Reply via email to