On 30/03/15 18:59 +0100, Jonathan Wakely wrote:
In the library we instantiate these functions:

template S operator+(const C*, const S&);
template S operator+(C, const S&);
template S operator+(const S&, const S&);

Hmm, that's a bit cryptic, sorry :-)

It would have been useful to explain that we then compile that chunk
four times with the following definitions:

 #define C char
 #define S std::basic_string<C>

 #define C wchar_t
 #define S std::basic_string<C>

 #define C char
 #define S std::__cxx11::basic_string<C>

 #define C wchar_t
 #define S std::__cxx11::basic_string<C>

The problem was that the instantiations generated by the third and
fourth cases were not exported from the shared library.

I've attached the patch I'm planning for stage 1.

commit db0a4913bf5831f49e81e06b1229409fcee0a067
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Mon Mar 30 19:02:09 2015 +0100

    	* include/bits/basic_string.tcc: Add explicit instantiation
    	declarations for exported operator+ overloads.

diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc
index b9da93b..4fe9135 100644
--- a/libstdc++-v3/include/bits/basic_string.tcc
+++ b/libstdc++-v3/include/bits/basic_string.tcc
@@ -1575,6 +1575,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   // which are defined via explicit instantiations elsewhere.
 #if _GLIBCXX_EXTERN_TEMPLATE > 0
   extern template class basic_string<char>;
+  template basic_string<char>
+    operator+(const char*, const basic_string<char>&);
+  template basic_string<char>
+    operator+(char, const basic_string<char>&);
+  template basic_string<char>
+    operator+(const basic_string<char>&, const basic_string<char>&);
+
   extern template
     basic_istream<char>&
     operator>>(basic_istream<char>&, string&);
@@ -1590,6 +1597,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 #ifdef _GLIBCXX_USE_WCHAR_T
   extern template class basic_string<wchar_t>;
+  template basic_string<wchar_t>
+    operator+(const wchar_t*, const basic_string<wchar_t>&);
+  template basic_string<wchar_t>
+    operator+(wchar_t, const basic_string<wchar_t>&);
+  template basic_string<wchar_t>
+    operator+(const basic_string<wchar_t>&, const basic_string<wchar_t>&);
+
   extern template
     basic_istream<wchar_t>&
     operator>>(basic_istream<wchar_t>&, wstring&);

Reply via email to