+2020-01-10 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/92285
+ * include/bits/streambuf_iterator.h (istreambuf_iterator): Make type
+ of base class independent of __cplusplus value.
+ [__cplusplus < 201103L] (istreambuf_iterator::reference): Override the
+ type defined in the base class
+ * testsuite/24_iterators/istreambuf_iterator/92285.cc: New test.
+ * testsuite/24_iterators/istreambuf_iterator/requirements/
+ base_classes.cc: Adjust expected base class for C++98.
+
2020-01-09 Olivier Hainque <hainque@adacore.com>
* doc/xml/manual/appendix_contributing.xml: Document _C2
template<typename _CharT, typename _Traits>
class istreambuf_iterator
: public iterator<input_iterator_tag, _CharT, typename _Traits::off_type,
- _CharT*,
-#if __cplusplus >= 201103L
- // LWG 445.
- _CharT>
-#else
- _CharT&>
-#endif
+ _CharT*, _CharT>
{
public:
// Types:
//@{
/// Public typedefs
-#if __cplusplus > 201703L
+#if __cplusplus < 201103L
+ typedef _CharT& reference; // Changed to _CharT by LWG 445
+#elif __cplusplus > 201703L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 3188. istreambuf_iterator::pointer should not be unspecified
using pointer = void;
#endif
+
typedef _CharT char_type;
typedef _Traits traits_type;
typedef typename _Traits::int_type int_type;
--- /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/>.
+
+#include <iterator>
+#include <iostream>
+#include <testsuite_hooks.h>
+
+// PR libstdc++/92285
+// See https://gcc.gnu.org/ml/libstdc++/2019-10/msg00129.html
+
+typedef std::input_iterator_tag category;
+typedef std::char_traits<char>::off_type off_type;
+typedef std::iterator<category, char, off_type, char*, char> good;
+typedef std::iterator<category, char, off_type, char*, char&> bad;
+
+bool check(good&) { return true; }
+void check(bad&) { }
+
+void
+test01()
+{
+ typedef std::istreambuf_iterator<char> I;
+ I it;
+ VERIFY( check(it) );
+#if __cplusplus < 201103L
+ char c = 'c';
+ I::reference r = c;
+ VERIFY( &r == &c );
+#else
+ static_assert( std::is_same<I::reference, char>::value, "LWG 445" );
+#endif
+}
+
+int main()
+{
+ test01();
+}
typedef istreambuf_iterator<char> test_iterator;
typedef char_traits<char>::off_type off_type;
- typedef iterator<input_iterator_tag, char, off_type, char*,
-#if __cplusplus >= 201103L
- char>
-#else
- char&>
-#endif
+ // This is the base class required since LWG 445, which differs from C++03:
+ typedef iterator<input_iterator_tag, char, off_type, char*, char>
base_iterator;
istringstream isstream("this tag");