[PATCH] Export explicit instantiations for C++17 members of std::string

Jonathan Wakely jwakely@redhat.com
Sun Jan 6 17:18:00 GMT 2019


On 06/01/19 17:59 +0100, Rainer Orth wrote:
>Hi Jonathan,
>
>> The C++17 standard added some new members to std::basic_string, which
>> were not previously instantiated in the library. This meant that the
>> extern template declarations had to be disabled for C++17 mode. With
>> this patch the new members are instantiated in the library and so the
>> explicit instantiation declarations can be used for C++17.
>>
>> The new members added by C++2a are still not exported, and so the
>> explicit instantiation declarations are still disabled for C++2a.
>>
>> 	* config/abi/pre/gnu.ver (GLIBCXX_3.4.21): Make patterns less greedy
>> 	for const member functions of std::basic_string.
>> 	(GLIBCXX_3.4.26): Export member functions of std::basic_string added
>> 	in C++17.
>> 	* include/bits/basic_string.h (basic_string(__sv_wrapper, const A&)):
>> 	Make non-standard constructor private.
>> 	[!_GLIBCXX_USE_CXX11_ABI] (basic_string(__sv_wrapper, const A&)):
>> 	Likewise.
>> 	* include/bits/basic_string.tcc (std::string, std::wstring): Declare
>> 	explicit instantiations for C++17 as well as earlier dialects.
>> 	* src/c++17/Makefile.am: Add new source files.
>> 	* src/c++17/Makefile.in: Regenerate.
>> 	* src/c++17/cow-string-inst.cc: New file defining explicit
>> 	instantiations for basic_string member functions added in C++17.
>> 	* src/c++17/string-inst.cc: Likewise.
>>
>> Tested powerpc64le-linux, committed to trunk.
>
>this patch broke Solaris bootstrap:
>
>ld: fatal: libstdc++-symbols.ver-sun: 6705: symbol 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator std::basic_string_view<char, std::char_traits<char> >() const': symbol version conflict
>ld: fatal: libstdc++-symbols.ver-sun: 6707: symbol 'std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::operator std::basic_string_view<wchar_t, std::char_traits<wchar_t> >() const': symbol version conflict
>ld: fatal: libstdc++-symbols.ver-sun: 6712: symbol 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::data()': symbol version conflict
>ld: fatal: libstdc++-symbols.ver-sun: 6714: symbol 'std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::data()': symbol version conflict
>ld: fatal: libstdc++-symbols.ver-sun: 6723: symbol 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_to_string_view(std::basic_string_view<char, std::char_traits<char> >)': symbol version conflict
>ld: fatal: libstdc++-symbols.ver-sun: 6724: symbol 'std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_S_to_string_view(std::basic_string_view<wchar_t, std::char_traits<wchar_t> >)': symbol version conflict
>collect2: error: ld returned 1 exit status
>make[6]: *** [Makefile:696: libstdc++.la] Error 1

Sorry :-(

[...]

>The following patch allowed the build to finish.

OK for trunk, thanks.

I'll make sure to run my script to check for such conflicts before
adding any more symbols.



More information about the Libstdc++ mailing list