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

            Bug ID: 87044
           Summary: stl_construct.h not interoperable with allocators with
                    custom reference types
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: barmie.brace at outlook dot com
  Target Milestone: ---

Created attachment 44568
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44568&action=edit
Custom allocator with custom reference object type.

STL containers don't seem to be interoperable with allocators with custom
reference types due to stl_construct.h's use of std::__addressof() instead of
the allocator's address() member.

Attached is a simple example using an allocator with a custom reference type.

[xiii@ea1c9ec7dba3 custom_allocator_test]$ make
g++ test.cpp -o test -std=gnu++14 -O3
In file included from /usr/include/c++/8.2.0/vector:62,
                 from test.cpp:1:
/usr/include/c++/8.2.0/bits/stl_construct.h: In instantiation of 'void
std::_Destroy(_ForwardIterator, _ForwardIterator, _Allocator&) [with
_ForwardIterator = custom_ptr<int>; _Allocator = custom_allocator<int>]':
/usr/include/c++/8.2.0/bits/stl_vector.h:567:15:   required from
'std::vector<_Tp, _Alloc>::~vector() [with _Tp = int; _Alloc =
custom_allocator<int>]'
test.cpp:12:43:   required from here
/usr/include/c++/8.2.0/bits/stl_construct.h:198:46: error: cannot bind
non-const lvalue reference of type 'custom_ref<int>&' to an rvalue of type
'custom_ptr<int>::reference' {aka 'custom_ref<int>'}
  __traits::destroy(__alloc, std::__addressof(*__first));
                                              ^~~~~~~~
In file included from /usr/include/c++/8.2.0/bits/stl_pair.h:59,
                 from /usr/include/c++/8.2.0/bits/stl_algobase.h:64,
                 from /usr/include/c++/8.2.0/vector:60,
                 from test.cpp:1:
/usr/include/c++/8.2.0/bits/move.h:47:5: note:   initializing argument 1 of
'constexpr _Tp* std::__addressof(_Tp&) [with _Tp = custom_ref<int>]'
     __addressof(_Tp& __r) _GLIBCXX_NOEXCEPT
     ^~~~~~~~~~~
make: *** [Makefile:2: test] Error 1

Reply via email to