This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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)



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]