summaryrefslogtreecommitdiff
path: root/gcc48-pr81395.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gcc48-pr81395.patch')
-rw-r--r--gcc48-pr81395.patch67
1 files changed, 67 insertions, 0 deletions
diff --git a/gcc48-pr81395.patch b/gcc48-pr81395.patch
new file mode 100644
index 0000000..b99fb74
--- /dev/null
+++ b/gcc48-pr81395.patch
@@ -0,0 +1,67 @@
+2017-07-18 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/81395
+ * include/bits/fstream.tcc (basic_filebuf::xsgetn): Don't set buffer
+ pointers for write mode after reading.
+ * testsuite/27_io/basic_filebuf/sgetn/char/81395.cc: New.
+
+--- libstdc++-v3/include/bits/fstream.tcc (revision 254017)
++++ libstdc++-v3/include/bits/fstream.tcc (revision 254018)
+@@ -699,7 +699,7 @@
+
+ if (__n == 0)
+ {
+- _M_set_buffer(0);
++ // Set _M_reading. Buffer is already in initial 'read' mode.
+ _M_reading = true;
+ }
+ else if (__len == 0)
+--- libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/81395.cc (nonexistent)
++++ libstdc++-v3/testsuite/27_io/basic_filebuf/sgetn/char/81395.cc (revision 254018)
+@@ -0,0 +1,46 @@
++// Copyright (C) 2017 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++// { dg-require-fileio "" }
++
++// PR libstdc++/81395
++
++#include <fstream>
++#include <cstring> // for std::memset
++#include <cstdio> // For BUFSIZ
++
++using std::memset;
++
++int main()
++{
++ {
++ std::filebuf fb;
++ fb.open("test.txt", std::ios::out);
++ char data[BUFSIZ];
++ memset(data, 'A', sizeof(data));
++ fb.sputn(data, sizeof(data));
++ }
++
++ std::filebuf fb;
++ fb.open("test.txt", std::ios::in|std::ios::out);
++ char buf[BUFSIZ];
++ memset(buf, 0, sizeof(buf));
++ fb.sgetn(buf, sizeof(buf));
++ // Switch from reading to writing without seeking first:
++ fb.sputn("B", 1);
++ fb.pubsync();
++}