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

Rainer Orth ro@CeBiTec.Uni-Bielefeld.DE
Fri Jun 22 12:51:00 GMT 2018


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:

+FAIL: libstdc++-abi/abi_check

# of added symbols:              3
# of missing symbols:            12
# of undesignated symbols:       0
# of incompatible symbols:       12

3 added symbols 
0
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EESt16initializer_listIcE
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> > >, std::initializer_list<char>)
version status: compatible
GLIBCXX_3.4.26
type: function
status: added

1
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPKwS4_EESt16initializer_listIwE
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> > >, std::initializer_list<wchar_t>)
version status: compatible
GLIBCXX_3.4.26
type: function
status: added

2
GLIBCXX_3.4.26
version status: compatible
type: object
type size: 0
status: added


12 missing symbols 
0
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjRKS4_jj
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, unsigned int, unsigned int)
version status: unversioned
type: function
status: subtracted

1
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjPKwj
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, wchar_t const*, unsigned int)
version status: unversioned
type: function
status: subtracted

2
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjPKw
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, wchar_t const*)
version status: unversioned
type: function
status: subtracted

3
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EEjc
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)
version status: unversioned
type: function
status: subtracted

4
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjjw
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, unsigned int, wchar_t)
version status: unversioned
type: function
status: subtracted

5
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjPKcj
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned int, char const*, unsigned int)
version status: unversioned
type: function
status: subtracted

6
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPKwS4_EEjw
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)
version status: unversioned
type: function
status: subtracted

7
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjRKS4_
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&)
version status: unversioned
type: function
status: subtracted

8
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjRKS4_
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&)
version status: unversioned
type: function
status: subtracted

9
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjPKc
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned int, char const*)
version status: unversioned
type: function
status: subtracted

10
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjRKS4_jj
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)
version status: unversioned
type: function
status: subtracted

11
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjjc
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned int, unsigned int, char)
version status: unversioned
type: function
status: subtracted


12 incompatible symbols 
0
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjRKS4_jj
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, unsigned int, unsigned int)
version status: unversioned
type: function
status: subtracted


1
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjPKwj
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, wchar_t const*, unsigned int)
version status: unversioned
type: function
status: subtracted


2
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjPKw
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, wchar_t const*)
version status: unversioned
type: function
status: subtracted


3
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EEjc
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)
version status: unversioned
type: function
status: subtracted


4
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjjw
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, unsigned int, wchar_t)
version status: unversioned
type: function
status: subtracted


5
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjPKcj
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned int, char const*, unsigned int)
version status: unversioned
type: function
status: subtracted


6
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPKwS4_EEjw
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)
version status: unversioned
type: function
status: subtracted


7
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjRKS4_
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::insert(unsigned int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&)
version status: unversioned
type: function
status: subtracted


8
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjRKS4_
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&)
version status: unversioned
type: function
status: subtracted


9
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjPKc
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned int, char const*)
version status: unversioned
type: function
status: subtracted


10
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjRKS4_jj
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)
version status: unversioned
type: function
status: subtracted


11
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjjc
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned int, unsigned int, char)
version status: unversioned
type: function
status: subtracted

and e.g.

+FAIL: ext/pb_ds/regression/tree_map_rand.cc (test for excess errors)
+UNRESOLVED: ext/pb_ds/regression/tree_map_rand.cc compilation failed to produce executable

Excess errors:
Undefined			first referenced
 symbol  			    in file
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned int, char const*) /var/tmp//cc7IwcEd.o

	Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University



More information about the Libstdc++ mailing list