This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR libstdc++/83328 add correct basic_string::insert for initializer_list


Hi,

On Fri, 22 Jun 2018 at 14:54, Jonathan Wakely <jwakely@redhat.com> wrote:
>
> On 22/06/18 14:51 +0200, Rainer Orth wrote:
> >Hi Jonathan,
> >
> >> The SSO basic_string has a non-standard insert(iterator, initializer_list)
> >> overload, from a C++0x draft. This adds the correct overload, while also
> >> preserving the old one so that the old symbol is still exported from the
> >> library.
> >>
> >> The COW basic_string doesn't have any of the C++11 changes to the insert
> >> overloads (they all still have non-const iterator parameters and the
> >> ones that should return an iterator still return void). This doesn't
> >> make any change to the COW string.
> >>
> >>      PR libstdc++/83328
> >>      * acinclude.m4 (libtool_VERSION): Bump to 6:26:0.
> >>      * config/abi/pre/gnu.ver: Add GLIBCXX_3.4.26 and export new symbol.
> >>      * configure: Regenerate.
> >>      * include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI]
> >>      (basic_string::insert(const_iterator, initializer_list<C>)): Add.
> >>      [_GLIBCXX_USE_CXX11_ABI && !_GLIBCXX_DEFINING_STRING_INSTANTIATIONS]
> >>      (basic_string::insert(iterator, initializer_list<C>)): Suppress
> >>      definition.
> >>      * include/debug/string (basic_string::insert(iterator, C)): Change
> >>      first parameter to const_iterator.
> >>      (basic_string::insert(iterator, size_type, C)): Likewise. Change
> >>      return type to iterator.
> >>      (basic_string::insert(iterator, InputIterator, InputIterator)):
> >>      Likewise.
> >>      (basic_string::insert(iterator, initializer_list<C>)): Change first
> >>      parameter to const_iterator and return type to iterator.
> >>      * src/c++11/string-inst.cc: Extend comment.
> >>      * testsuite/21_strings/basic_string/modifiers/insert/char/83328.cc:
> >>      New.
> >>      * testsuite/21_strings/basic_string/modifiers/insert/wchar_t/83328.cc:
> >>      New.
> >>      * testsuite/util/testsuite_abi.cc: Add new symbol version.
> >>
> >> Tested x86_64-linux, committed to trunk.
> >
> >it seems a couple of pattners are a bit too tight now in gnu.ver: this
> >caused a couple of failures on 32-bit Solaris and subsequent tests
> >failing to link due to symbols now hidden:
>
> Oops, it's the usual mangling difference for size_t, I'll fix it
> today.
>

I've also noticed a few regressions after this patch on arm:
FAIL:    g++.dg/torture/pr60750.C   -O0  (test for excess errors)
FAIL:    g++.dg/torture/pr60750.C   -Os  (test for excess errors)
Excess errors:
pr60750.C:(.text._ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EERKS8_OS8_[_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EERKS8_OS8_]+0x24):
undefined reference to `std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >::insert(unsigned int,
std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&)'

FAIL: 21_strings/basic_string/modifiers/64422.cc (test for excess errors)
Excess errors:
/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/64422.cc:29:
undefined reference to `std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char>
>::insert(__gnu_cxx::__normal_iterator<char const*,
std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > >, unsigned int, char)'
/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/64422.cc:39:
undefined reference to `std::__cxx11::basic_string<wchar_t,
std::char_traits<wchar_t>, std::allocator<wchar_t>
>::insert(__gnu_cxx::__normal_iterator<wchar_t const*,
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> > >, unsigned int, wchar_t)'
collect2: error: ld returned 1 exit status


FAIL: 21_strings/basic_string/modifiers/insert/char/1.cc (test for
excess errors)
Excess errors:
/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc:67:
undefined reference to `std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >::insert(unsigned int,
std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&, unsigned int, unsigned int)'
/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc:83:
undefined reference to `std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >::insert(unsigned int,
std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&, unsigned int, unsigned int)'
/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc:103:
undefined reference to `std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >::insert(unsigned int,
std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&, unsigned int, unsigned int)'
/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc:109:
undefined reference to `std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >::insert(unsigned int,
std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&, unsigned int, unsigned int)'
/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc:115:
undefined reference to `std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >::insert(unsigned int,
std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&, unsigned int, unsigned int)'
/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc:142:
undefined reference to `std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >::insert(unsigned int,
char const*)'
/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/insert/char/1.cc:149:
undefined reference to `std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >::insert(unsigned int,
unsigned int, char)'
collect2: error: ld returned 1 exit status


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]