[PATCH] Export explicit instantiations for C++17 members of std::string
Jonathan Wakely
jwakely@redhat.com
Sun Jan 6 17:25:00 GMT 2019
On 06/01/19 17:18 +0000, Jonathan Wakely wrote:
>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.
The good news is that even with my soon-to-be-committed changes, I
only see the same problems you already found:
Symbol matches more than one version:
_ZNKSbIwSt11char_traitsIwESaIwEEcvSt17basic_string_viewIwS0_EEv
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
GLIBCXX_3.4 _ZNKSbIwSt11char_traitsIwESaIwEE[a-z]* (line 327)
GLIBCXX_3.4.26 _ZNKSbIwSt11char_traitsIwESaIwEEcvSt17basic_string_viewIwS0_EEv (line 2098)
Symbol matches more than one version:
_ZNKSscvSt17basic_string_viewIcSt11char_traitsIcEEEv
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator std::basic_string_view<char, std::char_traits<char> >() const
GLIBCXX_3.4 _ZNKSs[a-z]* (line 261)
GLIBCXX_3.4.26 _ZNKSscvSt17basic_string_viewIcSt11char_traitsIcEEEv (line 2097)
Symbol matches more than one version:
_ZNSbIwSt11char_traitsIwESaIwEE4dataEv
std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::data()
GLIBCXX_3.4 _ZNSbIwSt11char_traitsIwESaIwEE[0-58-9][c-e]* (line 287)
GLIBCXX_3.4.26 _ZNSbIwSt11char_traitsIwESaIwEE4dataEv (line 2102)
Symbol matches more than one version:
_ZNSs4dataEv
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::data()
GLIBCXX_3.4 _ZNSs[0-58-9][c-e]* (line 220)
GLIBCXX_3.4.26 _ZNSs4dataEv (line 2101)
Symbol matches more than one version:
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17_S_to_string_viewESt17basic_string_viewIcS2_E
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> >)
GLIBCXX_3.4.21 _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE1[5-9]* (line 1720)
GLIBCXX_3.4.26 _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE17_S_to_string_viewESt17basic_string_viewI[cw]S2_E (line 2107)
Symbol matches more than one version:
_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE17_S_to_string_viewESt17basic_string_viewIwS2_E
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> >)
GLIBCXX_3.4.21 _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE1[5-9]* (line 1720)
GLIBCXX_3.4.26 _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE17_S_to_string_viewESt17basic_string_viewI[cw]S2_E (line 2107)
More information about the Libstdc++
mailing list