macros.h (__glibcxx_check_can_increment_range): New.
authorFrançois Dumont <fdumont@gcc.gnu.org>
Tue, 12 Jun 2018 20:18:35 +0000 (20:18 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Tue, 12 Jun 2018 20:18:35 +0000 (20:18 +0000)
2018-06-12  François Dumont  <fdumont@gcc.gnu.org>

* include/debug/macros.h (__glibcxx_check_can_increment_range): New.
(__glibcxx_check_can_decrement_range): New.
* include/debug/debug.h (__glibcxx_requires_can_increment_range): New.
(__glibcxx_requires_can_decrement_range): New.
* include/bits/stl_algobase.h (std::copy(_II, _II, _OI)): Use
__glibcxx_requires_can_increment_range.
(std::move(_II, _II, _OI)): Likewise.
(std::copy_backward(_BI, _BI, _BI2)): Use
__glibcxx_requires_can_decrement_range.
(std::move_backward(_BI, _BI, _BI2)): Likewise.
* testsuite/25_algorithms/copy_backward/debug/1_neg.cc: New.
* testsuite/25_algorithms/copy_backward/debug/2_neg.cc: New.
* testsuite/25_algorithms/copy_backward/debug/3_neg.cc: New.
* testsuite/25_algorithms/equal/debug/1_neg.cc: New.
* testsuite/25_algorithms/equal/debug/2_neg.cc: New.
* testsuite/25_algorithms/equal/debug/3_neg.cc: New.

From-SVN: r261525

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_algobase.h
libstdc++-v3/include/debug/macros.h
libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/1_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/3_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/equal/debug/1_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/equal/debug/2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/equal/debug/3_neg.cc [new file with mode: 0644]

index 368a91ebf33591eb29dbe77938d05f51e06727fa..813e7d2f96637637858345fd4bde096f1bc5f1fc 100644 (file)
@@ -1,3 +1,22 @@
+2018-06-12  François Dumont  <fdumont@gcc.gnu.org>
+
+       * include/debug/macros.h (__glibcxx_check_can_increment_range): New.
+       (__glibcxx_check_can_decrement_range): New.
+       * include/debug/debug.h (__glibcxx_requires_can_increment_range): New.
+       (__glibcxx_requires_can_decrement_range): New.
+       * include/bits/stl_algobase.h (std::copy(_II, _II, _OI)): Use
+       __glibcxx_requires_can_increment_range.
+       (std::move(_II, _II, _OI)): Likewise.
+       (std::copy_backward(_BI, _BI, _BI2)): Use
+       __glibcxx_requires_can_decrement_range.
+       (std::move_backward(_BI, _BI, _BI2)): Likewise.
+       * testsuite/25_algorithms/copy_backward/debug/1_neg.cc: New.
+       * testsuite/25_algorithms/copy_backward/debug/2_neg.cc: New.
+       * testsuite/25_algorithms/copy_backward/debug/3_neg.cc: New.
+       * testsuite/25_algorithms/equal/debug/1_neg.cc: New.
+       * testsuite/25_algorithms/equal/debug/2_neg.cc: New.
+       * testsuite/25_algorithms/equal/debug/3_neg.cc: New.
+
 2018-06-12  Jonathan Wakely  <jwakely@redhat.com>
 
        P0935R0 Eradicating unnecessarily explicit default constructors
index 1fcd7dba34d5db59c660b2b9af9b7076e2ffe4ca..877f32b00531fd8db32bc34d2d67daea101f8fa6 100644 (file)
@@ -449,11 +449,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __glibcxx_function_requires(_InputIteratorConcept<_II>)
       __glibcxx_function_requires(_OutputIteratorConcept<_OI,
            typename iterator_traits<_II>::value_type>)
-      __glibcxx_requires_valid_range(__first, __last);
+      __glibcxx_requires_can_increment_range(__first, __last, __result);
 
-      return (std::__copy_move_a2<__is_move_iterator<_II>::__value>
-             (std::__miter_base(__first), std::__miter_base(__last),
-              __result));
+      return std::__copy_move_a2<__is_move_iterator<_II>::__value>
+            (std::__miter_base(__first), std::__miter_base(__last), __result);
     }
 
 #if __cplusplus >= 201103L
@@ -482,7 +481,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __glibcxx_function_requires(_InputIteratorConcept<_II>)
       __glibcxx_function_requires(_OutputIteratorConcept<_OI,
            typename iterator_traits<_II>::value_type>)
-      __glibcxx_requires_valid_range(__first, __last);
+      __glibcxx_requires_can_increment_range(__first, __last, __result);
 
       return std::__copy_move_a2<true>(std::__miter_base(__first),
                                       std::__miter_base(__last), __result);
@@ -627,11 +626,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __glibcxx_function_requires(_ConvertibleConcept<
            typename iterator_traits<_BI1>::value_type,
            typename iterator_traits<_BI2>::value_type>)
-      __glibcxx_requires_valid_range(__first, __last);
+      __glibcxx_requires_can_decrement_range(__first, __last, __result);
 
-      return (std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
-             (std::__miter_base(__first), std::__miter_base(__last),
-              __result));
+      return std::__copy_move_backward_a2<__is_move_iterator<_BI1>::__value>
+            (std::__miter_base(__first), std::__miter_base(__last), __result);
     }
 
 #if __cplusplus >= 201103L
@@ -663,7 +661,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __glibcxx_function_requires(_ConvertibleConcept<
            typename iterator_traits<_BI1>::value_type,
            typename iterator_traits<_BI2>::value_type>)
-      __glibcxx_requires_valid_range(__first, __last);
+      __glibcxx_requires_can_decrement_range(__first, __last, __result);
 
       return std::__copy_move_backward_a2<true>(std::__miter_base(__first),
                                                std::__miter_base(__last),
index 824d399941c100460736e811ac65fdf7bf90c443..a88faf96e659ae34b7d9cbfbfd8bb9aeb4037dc7 100644 (file)
  * the user error and where the error is reported.
  *
  */
+#define _GLIBCXX_DEBUG_VERIFY_COND_AT(_Cond,_ErrMsg,_File,_Line,_Func) \
+  if (! (_Cond))                                                       \
+    __gnu_debug::_Error_formatter::_S_at(_File, _Line, _Func)          \
+      ._ErrMsg._M_error()
+
 #define _GLIBCXX_DEBUG_VERIFY_AT_F(_Cond,_ErrMsg,_File,_Line,_Func)    \
   do                                                                   \
   {                                                                    \
-    if (! (_Cond))                                                     \
-      __gnu_debug::_Error_formatter::_S_at(_File, _Line, _Func)                \
-       ._ErrMsg._M_error();                                            \
+    _GLIBCXX_DEBUG_VERIFY_COND_AT(_Cond,_ErrMsg,_File,_Line,_Func);    \
   } while (false)
 
 #define _GLIBCXX_DEBUG_VERIFY_AT(_Cond,_ErrMsg,_File,_Line)            \
@@ -84,6 +87,42 @@ _GLIBCXX_DEBUG_VERIFY(_First != _Last,                                       \
                      ._M_iterator(_First, #_First)                     \
                      ._M_iterator(_Last, #_Last))
 
+#define __glibcxx_check_can_increment_range(_First1,_Last1,_First2)    \
+  do                                                                   \
+  {                                                                    \
+    typename __gnu_debug::_Distance_traits<__decltype(_First1)>::__type __dist;\
+    _GLIBCXX_DEBUG_VERIFY_COND_AT(                                     \
+                       __gnu_debug::__valid_range(_First1, _Last1, __dist),\
+                       _M_message(__gnu_debug::__msg_valid_range)      \
+                       ._M_iterator(_First1, #_First1)                 \
+                       ._M_iterator(_Last1, #_Last1),                  \
+                       __FILE__,__LINE__,__PRETTY_FUNCTION__);         \
+    _GLIBCXX_DEBUG_VERIFY_COND_AT(                                     \
+                       __gnu_debug::__can_advance(_First2, __dist.first),\
+                       _M_message(__gnu_debug::__msg_iter_subscript_oob)\
+                       ._M_iterator(_First2, #_First2)                 \
+                       ._M_integer(__dist.first),                      \
+                       __FILE__,__LINE__,__PRETTY_FUNCTION__);         \
+  } while(false)
+
+#define __glibcxx_check_can_decrement_range(_First1,_Last1,_First2)    \
+  do                                                                   \
+  {                                                                    \
+    typename __gnu_debug::_Distance_traits<__decltype(_First1)>::__type __dist;\
+    _GLIBCXX_DEBUG_VERIFY_COND_AT(                                     \
+                       __gnu_debug::__valid_range(_First1, _Last1, __dist),\
+                       _M_message(__gnu_debug::__msg_valid_range)      \
+                       ._M_iterator(_First1, #_First1)                 \
+                       ._M_iterator(_Last1, #_Last1),                  \
+                       __FILE__,__LINE__,__PRETTY_FUNCTION__);         \
+    _GLIBCXX_DEBUG_VERIFY_COND_AT(                                     \
+                       __gnu_debug::__can_advance(_First2, -__dist.first),\
+                       _M_message(__gnu_debug::__msg_iter_subscript_oob)\
+                       ._M_iterator(_First2, #_First2)                 \
+                       ._M_integer(-__dist.first),                     \
+                       __FILE__,__LINE__,__PRETTY_FUNCTION__);         \
+  } while(false)
+
 /** Verify that we can insert into *this with the iterator _Position.
  *  Insertion into a container at a specific position requires that
  *  the iterator be nonsingular, either dereferenceable or past-the-end,
@@ -145,7 +184,7 @@ _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__foreign_iterator(_Position,_First,_Last),\
  *  _Safe_sequence and the _Position iterator is a _Safe_iterator.
 */
 #define __glibcxx_check_insert_range_after(_Position,_First,_Last,_Dist)\
-  __glibcxx_check_valid_range2(_First,_Last,_Dist);                    \
+__glibcxx_check_valid_range2(_First,_Last,_Dist);                      \
 __glibcxx_check_insert_after(_Position);                               \
 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__foreign_iterator(_Position,_First,_Last),\
                      _M_message(__gnu_debug::__msg_insert_range_from_self)\
diff --git a/libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/1_neg.cc b/libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/1_neg.cc
new file mode 100644 (file)
index 0000000..10375b7
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright (C) 2018 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 { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+  std::vector<int> vect;
+  vect.push_back(1);
+  std::copy_backward(vect.end(), vect.begin(), vect.end());
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/2_neg.cc b/libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/2_neg.cc
new file mode 100644 (file)
index 0000000..7f6bcd1
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright (C) 2018 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 { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+  std::vector<int> vect;
+  vect.push_back(1);
+  std::copy_backward(vect.begin(), vect.end(), vect.begin());
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/3_neg.cc b/libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/3_neg.cc
new file mode 100644 (file)
index 0000000..89d5d0a
--- /dev/null
@@ -0,0 +1,41 @@
+// Copyright (C) 2018 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 { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <list>
+
+void
+test01()
+{
+  std::list<int> l1, l2;
+  l1.push_back(1);
+  l1.push_back(2);
+  l1.push_back(3);
+
+  l2.push_back(1);
+  std::copy_backward(++l1.begin(), l1.end(), l2.end());
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/equal/debug/1_neg.cc b/libstdc++-v3/testsuite/25_algorithms/equal/debug/1_neg.cc
new file mode 100644 (file)
index 0000000..096c785
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright (C) 2018 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 { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+  std::vector<int> vect;
+  vect.push_back(1);
+  std::equal(vect.end(), vect.begin(), vect.begin());
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/equal/debug/2_neg.cc b/libstdc++-v3/testsuite/25_algorithms/equal/debug/2_neg.cc
new file mode 100644 (file)
index 0000000..97b1e1f
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright (C) 2018 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 { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+  std::vector<int> v1, v2;
+  v1.push_back(1);
+  std::equal(v1.begin(), v1.end(), v2.begin());
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/equal/debug/3_neg.cc b/libstdc++-v3/testsuite/25_algorithms/equal/debug/3_neg.cc
new file mode 100644 (file)
index 0000000..48bcea7
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright (C) 2018 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 { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <list>
+
+void
+test01()
+{
+  std::list<int> l1, l2;
+  l1.push_back(1);
+  l1.push_back(2);
+  l1.push_back(3);
+
+  l2.push_back(1);
+  l2.push_back(2);
+
+  std::equal(++l1.begin(), l1.end(), ++l2.begin());
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}