}
__str.append(__buf, __len);
- if (_Traits::eq_int_type(__c, __eof))
+ if (__extracted < __n && _Traits::eq_int_type(__c, __eof))
__err |= __ios_base::eofbit;
__in.width(0);
}
++__extracted;
__c = __sb->snextc();
}
- if (_Traits::eq_int_type(__c, __eof))
+
+ if (__extracted < __num - 1
+ && _Traits::eq_int_type(__c, __eof))
__err |= ios_base::eofbit;
// _GLIBCXX_RESOLVE_LIB_DEFECTS
}
}
- if (__traits_type::eq_int_type(__c, __eof))
+ if (__extracted < __n && __traits_type::eq_int_type(__c, __eof))
__err |= ios_base::eofbit;
__in.width(0);
}
}
}
- if (__traits_type::eq_int_type(__c, __eof))
+ if (__extracted < __num - 1
+ && __traits_type::eq_int_type(__c, __eof))
__err |= ios_base::eofbit;
// _GLIBCXX_RESOLVE_LIB_DEFECTS
--- /dev/null
+// Copyright (C) 2020 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-do run }
+
+#include <string>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ const std::string str = "1234";
+ std::istringstream in(str);
+ std::string buf;
+ in.width(4);
+ in >> buf;
+ VERIFY( !in.eof() ); // should stop after reading 4 chars
+ VERIFY( buf == str );
+}
+
+struct CT : std::char_traits<char> { };
+
+void
+test02()
+{
+ const std::basic_string<char, CT> str = "1234";
+ std::basic_istringstream<char, CT> in(str);
+ std::basic_string<char, CT> buf;
+ in.width(4);
+ in >> buf;
+ VERIFY( !in.eof() ); // should stop after reading 4 chars
+ VERIFY( buf == str );
+}
+
+int
+main()
+{
+ test01();
+ test02();
+}
--- /dev/null
+// Copyright (C) 2020 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-do run }
+
+#include <string>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ const std::wstring str = L"1234";
+ std::wistringstream in(str);
+ std::wstring buf;
+ in.width(4);
+ in >> buf;
+ VERIFY( !in.eof() ); // should stop after reading 4 chars
+ VERIFY( buf == str );
+}
+
+struct WT : std::char_traits<wchar_t> { };
+
+void
+test02()
+{
+ const std::basic_string<wchar_t, WT> str = L"1234";
+ std::basic_istringstream<wchar_t, WT> in(str);
+ std::basic_string<wchar_t, WT> buf;
+ in.width(4);
+ in >> buf;
+ VERIFY( !in.eof() ); // should stop after reading 4 chars
+ VERIFY( buf == str );
+}
+
+int
+main()
+{
+ test01();
+ test02();
+}
--- /dev/null
+// Copyright (C) 2020 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-do run }
+
+#include <sstream>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ const std::string str = "1234";
+ std::istringstream in(str);
+ char buf[6];
+ in.width(5);
+ in >> buf; // stops after reading 4 chars, doesn't reach EOF
+ VERIFY( !in.eof() );
+ VERIFY( buf == str );
+}
+
+struct CT : std::char_traits<char> { };
+
+void
+test02()
+{
+ const std::string str = "1234";
+ std::basic_istringstream<char, CT> in(str.c_str());
+ char buf[6];
+ in.width(5);
+ in >> buf; // stops after reading 4 chars, doesn't reach EOF
+ VERIFY( !in.eof() );
+ VERIFY( buf == str );
+}
+
+int
+main()
+{
+ test01();
+ test02();
+}
--- /dev/null
+// Copyright (C) 2020 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-do run }
+
+#include <sstream>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ const std::string str = "1234";
+ std::istringstream in(str);
+ char buf[6];
+ in.width(5);
+ in >> buf; // stops after reading 4 chars, doesn't reach EOF
+ VERIFY( !in.eof() );
+ VERIFY( buf == str );
+}
+
+struct WT : std::char_traits<wchar_t> { };
+
+void
+test02()
+{
+ const std::wstring str = L"1234";
+ std::basic_istringstream<wchar_t, WT> in(str.c_str());
+ wchar_t buf[6];
+ in.width(5);
+ in >> buf; // stops after reading 4 chars, doesn't reach EOF
+ VERIFY( !in.eof() );
+ VERIFY( buf == str );
+}
+
+int
+main()
+{
+ test01();
+ test02();
+}