]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++/71771 constrain reverse_iterator difference op
authorJonathan Wakely <jwakely@redhat.com>
Tue, 23 Aug 2016 12:23:11 +0000 (13:23 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 23 Aug 2016 12:23:11 +0000 (13:23 +0100)
* include/bits/stl_iterator.h
(operator-(reverse_iterator<Iter>, reverse_iterator<Iter>): Constrain
for C++11 and later.
* testsuite/24_iterators/reverse_iterator/71771.cc: New test.

From-SVN: r239696

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_iterator.h
libstdc++-v3/testsuite/24_iterators/reverse_iterator/71771.cc [new file with mode: 0644]

index ca0398abf38ca2d61ad1e28de01e7cac613d7e65..f5c3659d9f1f868f4f25ba48253b8a45caaeae07 100644 (file)
@@ -1,3 +1,10 @@
+2016-08-23  Jonathan Wakely  <jwakely@redhat.com>
+
+       * include/bits/stl_iterator.h
+       (operator-(reverse_iterator<Iter>, reverse_iterator<Iter>): Constrain
+       for C++11 and later.
+       * testsuite/24_iterators/reverse_iterator/71771.cc: New test.
+
 2016-08-06  Jonathan Wakely  <jwakely@redhat.com>
 
        Backport from mainline
index 7b5872ee0e0ee4c6b5617a7d0f498860e27d9c9b..55e67a7d8bde176c82f70d6498aa00d5d20e43b5 100644 (file)
@@ -324,9 +324,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     { return !(__x < __y); }
 
   template<typename _Iterator>
+#if __cplusplus < 201103L
     inline typename reverse_iterator<_Iterator>::difference_type
     operator-(const reverse_iterator<_Iterator>& __x,
              const reverse_iterator<_Iterator>& __y)
+#else
+    inline auto
+    operator-(const reverse_iterator<_Iterator>& __x,
+             const reverse_iterator<_Iterator>& __y)
+    -> decltype(__x.base() - __y.base())
+#endif
     { return __y.base() - __x.base(); }
 
   template<typename _Iterator>
diff --git a/libstdc++-v3/testsuite/24_iterators/reverse_iterator/71771.cc b/libstdc++-v3/testsuite/24_iterators/reverse_iterator/71771.cc
new file mode 100644 (file)
index 0000000..1a7c963
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright (C) 2016 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 compile { target c++11 } }
+
+#include <iterator>
+#include <testsuite_iterators.h>
+
+// PR libstdc++/71771
+
+template<typename Iter>
+auto
+diff2(std::reverse_iterator<Iter> it1, std::reverse_iterator<Iter> it2)
+-> decltype(it1 - it2)
+{ return it1 - it2; }
+
+template<typename Iter>
+void
+diff2(Iter, Iter)
+{ }
+
+void
+test01()
+{
+  int i[2];
+  __gnu_test::test_container<int, __gnu_test::bidirectional_iterator_wrapper>
+    c(i);
+  diff2(std::rbegin(c), std::rend(c));
+}