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

Jonathan Wakely jwakely@redhat.com
Fri Jun 22 14:19:00 GMT 2018


On 22/06/18 14:13 +0100, Jonathan Wakely wrote:
>On 22/06/18 13:54 +0100, Jonathan Wakely 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'm testing this ...

Tested multilib x86_64-linux, committed to trunk.

Sorry for the silly mistake. I think I'll add a local git hook so that
when I commit changes to the linker script it checks that I've used
'[jmy]' not 'm' in any symbols that use size_t.


>commit 3c22cca756b18420d042d19fbcc8892c2aa81ea5
>Author: Jonathan Wakely <jwakely@redhat.com>
>Date:   Fri Jun 22 14:11:08 2018 +0100
>
>    Fix unexported basic_string symbols for 32-bit targets
>    
>            * config/abi/pre/gnu.ver: Fix __cxx11::basic_string patterns for
>            different size_t mangling on 32-bit targets.
>
>diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver
>index b59b9a0ff1f..782b1238742 100644
>--- a/libstdc++-v3/config/abi/pre/gnu.ver
>+++ b/libstdc++-v3/config/abi/pre/gnu.ver
>@@ -1716,14 +1716,14 @@ GLIBCXX_3.4.21 {
>     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6append*;
>     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6assign*;
>     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertI*;
>-    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertEmPK[cw];
>-    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertEmPK[cw]m;
>-    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertEmRKS4_;
>-    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertEmRKS4_mm;
>-    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertEmm[cw];
>+    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertE[jmy]PK[cw];
>+    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertE[jmy]PK[cw][jmy];
>+    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertE[jmy]RKS4_;
>+    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertE[jmy]RKS4_[jmy][jmy];
>+    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertE[jmy][jmy][cw];
>     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertEN9__gnu_cxx17__normal_iteratorIP[cw]*;
>     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertEN9__gnu_cxx17__normal_iteratorIPK[cw]S4_EE[cw];
>-    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertEN9__gnu_cxx17__normal_iteratorIPK[cw]S4_EEm[cw];
>+    _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6insertEN9__gnu_cxx17__normal_iteratorIPK[cw]S4_EE[jmy][cw];
>     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6rbegin*;
>     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE6resize*;
>     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE7replace*;



More information about the Libstdc++ mailing list