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.

Reply via email to