Implement LWG 2353
authorVille Voutilainen <ville.voutilainen@gmail.com>
Mon, 20 Nov 2017 14:21:42 +0000 (16:21 +0200)
committerVille Voutilainen <ville@gcc.gnu.org>
Mon, 20 Nov 2017 14:21:42 +0000 (16:21 +0200)
* include/bits/stl_iterator_base_funcs.h (next):
Use InputIterator instead of ForwardIterator.
* testsuite/24_iterators/operations/lwg2353.cc: New.
* testsuite/24_iterators/operations/next_neg.cc: Remove.

From-SVN: r254957

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_iterator_base_funcs.h
libstdc++-v3/testsuite/24_iterators/operations/lwg2353.cc [new file with mode: 0644]
libstdc++-v3/testsuite/24_iterators/operations/next_neg.cc [deleted file]

index 15936ac1d8623f5103391f63d61ddfac6556d7c7..bdb7de2fe8ea2ca66bc359fe6a79941789a6008a 100644 (file)
@@ -1,3 +1,11 @@
+2017-11-20  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       Implement LWG 2353
+       * include/bits/stl_iterator_base_funcs.h (next):
+       Use InputIterator instead of ForwardIterator.
+       * testsuite/24_iterators/operations/lwg2353.cc: New.
+       * testsuite/24_iterators/operations/next_neg.cc: Remove.
+
 2017-11-18  Edward Smith-Rowland  <3dw4rd@verizon.net>
 
        PR libstdc++/pr66689 - comp_ellint_3 and ellint_3 return garbage values
index 86a93d34fa14a34103bb348fb09497e82c9fdcfa..ad84b398c84f277e152eee577f93061187426174 100644 (file)
@@ -208,14 +208,13 @@ _GLIBCXX_END_NAMESPACE_CONTAINER
 
 #if __cplusplus >= 201103L
 
-  template<typename _ForwardIterator>
-    inline _GLIBCXX17_CONSTEXPR _ForwardIterator
-    next(_ForwardIterator __x, typename
-        iterator_traits<_ForwardIterator>::difference_type __n = 1)
+  template<typename _InputIterator>
+    inline _GLIBCXX17_CONSTEXPR _InputIterator
+    next(_InputIterator __x, typename
+        iterator_traits<_InputIterator>::difference_type __n = 1)
     {
       // concept requirements
-      __glibcxx_function_requires(_ForwardIteratorConcept<
-                                 _ForwardIterator>)
+      __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
       std::advance(__x, __n);
       return __x;
     }
diff --git a/libstdc++-v3/testsuite/24_iterators/operations/lwg2353.cc b/libstdc++-v3/testsuite/24_iterators/operations/lwg2353.cc
new file mode 100644 (file)
index 0000000..13b058b
--- /dev/null
@@ -0,0 +1,26 @@
+// { dg-options "-D_GLIBCXX_CONCEPT_CHECKS" }
+// { dg-do run { target c++11 } }
+
+#include <iterator>
+#include <utility>
+#include <sstream>
+#include <string>
+#include <testsuite_hooks.h>
+
+template<typename Distance, typename InputRange>
+std::pair<std::istream_iterator<char>, std::istream_iterator<char>>
+drop(Distance n, InputRange& rng)
+{
+  return std::make_pair(std::next(std::istream_iterator<char>(rng), n),
+                       std::istream_iterator<char>()
+                       );
+}
+
+int main()
+{
+    std::stringstream x("let let there be rock");
+    x << std::noskipws;
+    auto y = drop(4, x);
+    std::string z(y.first, y.second);
+    VERIFY(z == "let there be rock");
+}
diff --git a/libstdc++-v3/testsuite/24_iterators/operations/next_neg.cc b/libstdc++-v3/testsuite/24_iterators/operations/next_neg.cc
deleted file mode 100644 (file)
index f3c20a1..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2015-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-options "-D_GLIBCXX_CONCEPT_CHECKS" }
-// { dg-do compile { target c++11 } }
-
-#include <iterator>
-
-struct X {};
-
-namespace std
-{
-  template<>
-    struct iterator_traits<const X*> : iterator_traits<X*>
-    {
-      using iterator_category = input_iterator_tag;
-      using reference = const X&;
-      using pointer = const X*;
-    };
-}
-
-void
-test01()
-{
-  const X array[1] = { };
-  std::next(array);
-  // { dg-error "input_iterator" "" { target *-*-* } 220 }
-}