Re: GCC 7.3.0 -std=gnu++17 failed to getline() from std::ifstream
- Date: Wed, 13 Jun 2018 08:32:17 +1200
- From: Ross Smith <ross.smith@xxxxxxxx>
- Subject: Re: GCC 7.3.0 -std=gnu++17 failed to getline() from std::ifstream
On 2018-06-13 05:11, Christian Franke wrote:
Ivan Shynkarenka wrote:
I use x64 bit Cygwin and it failed in my home, work and Appveyor. I add
cygcheck.out with my environment.
I'm sorry about misspell prefix space in my prev example. Please try the
int main(int argc, char** argv)
while (getline(stream, line))
std::cout << line << std::endl;
g++ -std=gnu++17 test.cpp
Could reproduce this with 32 and 64 bit Cygwin g++ 7.3.0
A comparison of preprocessor (-E) outputs shows that the "extern
template" declarations for getline() are only visible for C++ <= 14.
These are guarded by "__cplusplus <= 1402" in basic_string.tcc. This
should tell the compiler to generate new code for getline() if C++17 is
enabled instead of calling the (now incompatible) function in
A comparison of assembly (-S) outputs shows that this does not work: If
C++17 is enabled, the compiler correctly generates local code for
getline(istream &, string &) but this code calls an external
getline(istream &, string &, char). Then the linker generates a call to
this getline() in cygstdc++-6.dll.
This is because there is a bogus prototype specialization for
getline(istream &, string &, char) in basic_string.h but no
corresponding implementation in basic_string.tcc. This has apparently an
equivalent effect as 'extern template'.
The attached patch for
Thank you! I can confirm that the patch fixes this.
Problem reports: http://cygwin.com/problems.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple