https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86138

--- Comment #3 from Christian Franke <franke at computer dot org> ---
(In reply to Jonathan Wakely from comment #1)
> Why is the one in the DLL not compatible?
I don't know.

> The extern templates are disabled because std::basic_string has additional
> member functions in C++17 mode, and they're not instantiated in the library.
> By disabling the explicit instantiation declarations the compiler will emit
> definitions for the C++17-only member functions.
This has no effect due to the bogus specialization in basic_string.h (see patch
below).

> As requested at https://gcc.gnu.org/bugs testcases need to be provided here,
> not as URLs.
Sorry. New testcase below:

$ uname -srvmo
CYGWIN_NT-10.0 2.10.0(0.325/5/3) 2018-02-02 15:16 x86_64 Cygwin

$ g++ --version
g++ (GCC) 7.3.0

$ cygcheck -f /bin/cygstdc++-6.dll
libstdc++6-7.3.0-2

$ cat getlinetest.cpp
#include <sstream>

int main()
{
    std::string line;
    std::istringstream stream("*");
    std::getline(stream, line, '\n');
    return (int)line.c_str()[0];
}

$ g++ -o getlinetest getlinetest.cpp && ./getlinetest; echo $?
42

$ g++ -std=c++17 -o getlinetest getlinetest.cpp && ./getlinetest; echo $?
Aborted (core dumped)
134

$ g++ -std=c++17 -static -o getlinetest getlinetest.cpp && ./getlinetest;\
  echo $?
42

Interestingly the statically linked version works. Is there possibly some
template function called by getline() which is not C++17 compatible? In the
static case the new version of this function from getline.o is used instead of
the old one in the lib*.a file.


Possible fix (char only, should also be done for wchar_t):

$ cat basic_string.h.patch
--- basic_string.h.orig 2018-05-03 06:22:46.000000000 +0200
+++ basic_string.h      2018-06-19 07:49:50.190322000 +0200
@@ -6329,11 +6329,6 @@
     { return std::getline(__is, __str); }
 #endif

-  template<>
-    basic_istream<char>&
-    getline(basic_istream<char>& __in, basic_string<char>& __str,
-           char __delim);
-
 #ifdef _GLIBCXX_USE_WCHAR_T
   template<>
     basic_istream<wchar_t>&

$ (cd /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits && patch) \
  < basic_string.h.patch
patching file basic_string.h

$ g++ -std=c++17 -o getlinetest getlinetest.cpp && ./getlinetest; echo $?
42

Reply via email to