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

            Bug ID: 64913
           Summary: basic_string fails to use custom allocator
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: antoshkka at gmail dot com

Consider the following example:

template<class CharT>
struct my_allocator
  : std::allocator<CharT>
{};

typedef std::basic_string< char
  , std::char_traits<char>
  , my_allocator<char>
> my_string;


my_string s1;
my_string s2(static_cast<my_string&&>(s1)); // Oops

Attempt to move construct my_string produces the following error:

/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h: In
instantiation of ???std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&)
[with _CharT = char; _Traits = std::char_traits<char>; _Alloc =
my_allocator<char>]???:
../boost/lexical_cast.hpp:45:16:   required from ???Target
boost::lexical_cast(const Source&) [with Target =
std::__cxx11::basic_string<char, std::char_traits<char>, my_allocator<char> >;
Source = std::__cxx11::basic_string<char, std::char_traits<char>,
my_allocator<char> >]???
../libs/lexical_cast/test/lexical_cast_test.cpp:510:5:   required from here
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:475:73:
error: no matching function for call to ???std::__cxx11::basic_string<char,
std::char_traits<char>, my_allocator<char>
>::_Alloc_hider::_Alloc_hider(std::__cxx11::basic_string<char,
std::char_traits<char>, my_allocator<char> >::pointer,
std::remove_reference<std::allocator<char>&>::type)???
       : _M_dataplus(_M_local_data(), std::move(__str._M_get_allocator()))
                                                                         ^
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:108:2:
note: candidate: std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::_Alloc_hider::_Alloc_hider(std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::pointer, const _Alloc&) [with _CharT = char; _Traits =
std::char_traits<char>; _Alloc = my_allocator<char>;
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::pointer = char*]
  _Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc())
  ^
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:108:2:
note:   no known conversion for argument 2 from
???std::remove_reference<std::allocator<char>&>::type {aka
std::allocator<char>}??? to ???const my_allocator<char>&???
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:106:14:
note: candidate: std::__cxx11::basic_string<char, std::char_traits<char>,
my_allocator<char> >::_Alloc_hider::_Alloc_hider(const
std::__cxx11::basic_string<char, std::char_traits<char>, my_allocator<char>
>::_Alloc_hider&)
       struct _Alloc_hider : allocator_type // TODO check __is_final
              ^
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:106:14:
note:   candidate expects 1 argument, 2 provided
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:106:14:
note: candidate: std::__cxx11::basic_string<char, std::char_traits<char>,
my_allocator<char>
>::_Alloc_hider::_Alloc_hider(std::__cxx11::basic_string<char,
std::char_traits<char>, my_allocator<char> >::_Alloc_hider&&)
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:106:14:
note:   candidate expects 1 argument, 2 provided
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h: In
instantiation of ???std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&)
[with _CharT = wchar_t; _Traits = std::char_traits<wchar_t>; _Alloc =
my_allocator<wchar_t>]???:
../boost/lexical_cast.hpp:45:16:   required from ???Target
boost::lexical_cast(const Source&) [with Target =
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,
my_allocator<wchar_t> >; Source = std::__cxx11::basic_string<wchar_t,
std::char_traits<wchar_t>, my_allocator<wchar_t> >]???
../libs/lexical_cast/test/lexical_cast_test.cpp:532:5:   required from here
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:475:73:
error: no matching function for call to ???std::__cxx11::basic_string<wchar_t,
std::char_traits<wchar_t>, my_allocator<wchar_t>
>::_Alloc_hider::_Alloc_hider(std::__cxx11::basic_string<wchar_t,
std::char_traits<wchar_t>, my_allocator<wchar_t> >::pointer,
std::remove_reference<std::allocator<wchar_t>&>::type)???
       : _M_dataplus(_M_local_data(), std::move(__str._M_get_allocator()))
                                                                         ^
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:108:2:
note: candidate: std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::_Alloc_hider::_Alloc_hider(std::__cxx11::basic_string<_CharT, _Traits,
_Alloc>::pointer, const _Alloc&) [with _CharT = wchar_t; _Traits =
std::char_traits<wchar_t>; _Alloc = my_allocator<wchar_t>;
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::pointer = wchar_t*]
  _Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc())
  ^
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:108:2:
note:   no known conversion for argument 2 from
???std::remove_reference<std::allocator<wchar_t>&>::type {aka
std::allocator<wchar_t>}??? to ???const my_allocator<wchar_t>&???
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:106:14:
note: candidate: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,
my_allocator<wchar_t> >::_Alloc_hider::_Alloc_hider(const
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,
my_allocator<wchar_t> >::_Alloc_hider&)
       struct _Alloc_hider : allocator_type // TODO check __is_final
              ^
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:106:14:
note:   candidate expects 1 argument, 2 provided
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:106:14:
note: candidate: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,
my_allocator<wchar_t>
>::_Alloc_hider::_Alloc_hider(std::__cxx11::basic_string<wchar_t,
std::char_traits<wchar_t>, my_allocator<wchar_t> >::_Alloc_hider&&)
/home/trippels/gcc_test/usr/local/include/c++/5.0.0/bits/basic_string.h:106:14:
note:   candidate expects 1 argument, 2 provided

Reply via email to