2018-06-13 François Dumont <fdumont@gcc.gnu.org>
authorFrançois Dumont <fdumont@gcc.gnu.org>
Wed, 13 Jun 2018 20:27:26 +0000 (20:27 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Wed, 13 Jun 2018 20:27:26 +0000 (20:27 +0000)
* include/debug/helper_functions.h
(__gnu_debug::_Safe_iterator<>): Add declaration.
(__can_advance(_Ite, _Size)): New.
(__can_advance(const _Safe_iterator<>&, _Size)): Overload declaration.
* include/debug/functions.h
(__gnu_debug::_Safe_iterator<>): Remove declaration.
* include/debug/stl_iterator.h
(__can_advance(const _Safe_iterator<>&)): New definition.
* include/debug/stl_iterator.h
(__can_advance(const std::reverse_iterator<>&, _Size)): New.
(__can_advance(const std::move_iterator<>&, _Size)): New.
* include/debug/macros.h (__glibcxx_check_can_increment): New.
* include/debug/debug.h (__glibcxx_requires_can_increment): New.
* include/bits/stl_algobase.h (fill_n): Use latter.
* testsuite/25_algorithms/fill_n/2.cc: New.
* testsuite/25_algorithms/fill_n/debug/1_neg.cc: New.
* testsuite/25_algorithms/fill_n/debug/2_neg.cc: New.
* testsuite/25_algorithms/fill_n/debug/3_neg.cc: New.
* testsuite/25_algorithms/fill_n/debug/4_neg.cc: New.

From-SVN: r261566

13 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_algobase.h
libstdc++-v3/include/debug/debug.h
libstdc++-v3/include/debug/functions.h
libstdc++-v3/include/debug/helper_functions.h
libstdc++-v3/include/debug/macros.h
libstdc++-v3/include/debug/safe_iterator.h
libstdc++-v3/include/debug/stl_iterator.h
libstdc++-v3/testsuite/25_algorithms/fill_n/2.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/fill_n/debug/1_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/fill_n/debug/2_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/fill_n/debug/3_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/25_algorithms/fill_n/debug/4_neg.cc [new file with mode: 0644]

index 9f33999563bcd1239075e21595951eb909242290..223b32732ddaf3e65520b7f846c276d5421608e1 100644 (file)
 
 2018-06-13  François Dumont  <fdumont@gcc.gnu.org>
 
+       * include/debug/helper_functions.h
+       (__gnu_debug::_Safe_iterator<>): Add declaration.
+       (__can_advance(_Ite, _Size)): New.
+       (__can_advance(const _Safe_iterator<>&, _Size)): Overload declaration.
+       * include/debug/functions.h
+       (__gnu_debug::_Safe_iterator<>): Remove declaration.
+       * include/debug/stl_iterator.h
+       (__can_advance(const _Safe_iterator<>&)): New definition.
+       * include/debug/stl_iterator.h
+       (__can_advance(const std::reverse_iterator<>&, _Size)): New.
+       (__can_advance(const std::move_iterator<>&, _Size)): New.
+       * include/debug/macros.h (__glibcxx_check_can_increment): New.
+       * include/debug/debug.h (__glibcxx_requires_can_increment): New.
+       * include/bits/stl_algobase.h (fill_n): Use latter.
+       * testsuite/25_algorithms/fill_n/2.cc: New.
+       * testsuite/25_algorithms/fill_n/debug/1_neg.cc: New.
+       * testsuite/25_algorithms/fill_n/debug/2_neg.cc: New.
+       * testsuite/25_algorithms/fill_n/debug/3_neg.cc: New.
+       * testsuite/25_algorithms/fill_n/debug/4_neg.cc: New.
+
        * include/debug/debug.h (__glibcxx_requires_can_increment_range): New.
        (__glibcxx_requires_can_decrement_range): New.
 
index 877f32b00531fd8db32bc34d2d67daea101f8fa6..022a3f1598be4d941090480afbf19413c2845338 100644 (file)
@@ -783,6 +783,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
       // concept requirements
       __glibcxx_function_requires(_OutputIteratorConcept<_OI, _Tp>)
+      __glibcxx_requires_can_increment(__first, __n);
 
       return _OI(std::__fill_n_a(std::__niter_base(__first), __n, __value));
     }
index d055dcb1d9a1e33051771293aef3e77a476fbad3..f157a6df9b43a7580323ca13e73f9489ad506fbd 100644 (file)
@@ -62,6 +62,7 @@ namespace __gnu_debug
 
 # define __glibcxx_requires_cond(_Cond,_Msg)
 # define __glibcxx_requires_valid_range(_First,_Last)
+# define __glibcxx_requires_can_increment(_First,_Size)
 # define __glibcxx_requires_can_increment_range(_First1,_Last1,_First2)
 # define __glibcxx_requires_can_decrement_range(_First1,_Last1,_First2)
 # define __glibcxx_requires_sorted(_First,_Last)
@@ -88,6 +89,8 @@ namespace __gnu_debug
 # define __glibcxx_requires_cond(_Cond,_Msg) _GLIBCXX_DEBUG_VERIFY(_Cond,_Msg)
 # define __glibcxx_requires_valid_range(_First,_Last)  \
   __glibcxx_check_valid_range(_First,_Last)
+# define __glibcxx_requires_can_increment(_First,_Size)        \
+  __glibcxx_check_can_increment(_First,_Size)
 # define __glibcxx_requires_can_increment_range(_First1,_Last1,_First2)        \
   __glibcxx_check_can_increment_range(_First1,_Last1,_First2)
 # define __glibcxx_requires_can_decrement_range(_First1,_Last1,_First2)        \
index 3a2ba74fbbeb2ece38213c53e1b90fa4a921a834..41519b26a60d6955a6868448a73e60fb8254aef5 100644 (file)
@@ -40,9 +40,6 @@
 
 namespace __gnu_debug
 {
-  template<typename _Iterator, typename _Sequence>
-    class _Safe_iterator;
-
   template<typename _Sequence>
     struct _Insert_range_from_self_is_safe
     { enum { __value = 0 }; };
index 94d50163a2e6fa72eb330fa2f9e77e066ab1f083..2073df9519101179fb356cf4726137ea03c0f7de 100644 (file)
@@ -37,6 +37,9 @@
 
 namespace __gnu_debug
 {
+  template<typename _Iterator, typename _Sequence>
+    class _Safe_iterator;
+
   /** The precision to which we can calculate the distance between
    *  two iterators.
    */
@@ -164,6 +167,16 @@ namespace __gnu_debug
       return __valid_range(__first, __last, __dist);
     }
 
+  // Fallback method, always ok.
+  template<typename _InputIterator, typename _Size>
+    inline bool
+    __can_advance(_InputIterator, _Size)
+    { return true; }
+
+  template<typename _Iterator, typename _Sequence, typename _Size>
+    bool
+    __can_advance(const _Safe_iterator<_Iterator, _Sequence>&, _Size);
+
 #if __cplusplus < 201103L
   // Helper struct to detect random access safe iterators.
   template<typename _Iterator>
index a88faf96e659ae34b7d9cbfbfd8bb9aeb4037dc7..44f48b04b181b35709f3e57a94e96ee8cd69128e 100644 (file)
@@ -87,6 +87,13 @@ _GLIBCXX_DEBUG_VERIFY(_First != _Last,                                       \
                      ._M_iterator(_First, #_First)                     \
                      ._M_iterator(_Last, #_Last))
 
+// Verify that [_First, _First + _Size) forms a valid range.
+#define __glibcxx_check_can_increment(_First,_Size)                    \
+_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__can_advance(_First, _Size),       \
+                     _M_message(__gnu_debug::__msg_iter_subscript_oob) \
+                     ._M_iterator(_First, #_First)                     \
+                     ._M_integer(_Size, #_Size))
+
 #define __glibcxx_check_can_increment_range(_First1,_Last1,_First2)    \
   do                                                                   \
   {                                                                    \
index 3a53ab723cdac0742dd1a457f7d25f5042940fb9..7ed2b93b407337ce9cd1eebd4b54e8de8a73e255 100644 (file)
@@ -862,6 +862,11 @@ namespace __gnu_debug
       return __res;
     }
 
+  template<typename _Iterator, typename _Sequence, typename _Size>
+    inline bool
+    __can_advance(const _Safe_iterator<_Iterator, _Sequence>& __it, _Size __n)
+    { return __it._M_can_advance(__n); }
+
 #if __cplusplus < 201103L
   template<typename _Iterator, typename _Sequence>
     struct __is_safe_random_iterator<_Safe_iterator<_Iterator, _Sequence> >
index 21eac76d60a762e61832a56fee2c9a4d6e9a8ba8..a6a2a76276611fdcf4fcecf49aeb401c0fa1c205 100644 (file)
@@ -47,6 +47,11 @@ namespace __gnu_debug
                   const std::reverse_iterator<_Iterator>& __last)
     { return __get_distance(__last.base(), __first.base()); }
 
+  template<typename _Iterator, typename _Size>
+    inline bool
+    __can_advance(const std::reverse_iterator<_Iterator>& __it, _Size __n)
+    { return __can_advance(__it.base(), -__n); }
+
 #if __cplusplus < 201103L
   template<typename _Iterator>
     struct __is_safe_random_iterator<std::reverse_iterator<_Iterator> >
@@ -96,6 +101,11 @@ namespace __gnu_debug
                   const std::move_iterator<_Iterator>& __last)
     { return __get_distance(__first.base(), __last.base()); }
 
+  template<typename _Iterator, typename _Size>
+    inline bool
+    __can_advance(const std::move_iterator<_Iterator>& __it, _Size __n)
+    { return __can_advance(__it.base(), __n); }
+
   template<typename _Iterator>
     inline auto
     __unsafe(const std::move_iterator<_Iterator>& __it)
diff --git a/libstdc++-v3/testsuite/25_algorithms/fill_n/2.cc b/libstdc++-v3/testsuite/25_algorithms/fill_n/2.cc
new file mode 100644 (file)
index 0000000..6e18032
--- /dev/null
@@ -0,0 +1,46 @@
+// 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/>.
+
+// 25.2.5 [lib.alg.fill] Fill_n.
+
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::vector<int> ref;
+  ref.push_back(1);
+  ref.push_back(2);
+
+  std::vector<std::vector<int>> vvect;
+  vvect.push_back(std::vector<int>());
+  vvect.push_back(std::vector<int>());
+
+  VERIFY( std::fill_n(vvect.begin(), 2, ref) == vvect.end() );
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/fill_n/debug/1_neg.cc b/libstdc++-v3/testsuite/25_algorithms/fill_n/debug/1_neg.cc
new file mode 100644 (file)
index 0000000..45a88fe
--- /dev/null
@@ -0,0 +1,39 @@
+// 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/>.
+
+// 25.2.5 [lib.alg.fill] Fill_n.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+  std::vector<int> vect;
+  vect.push_back(1);
+  std::fill_n(vect.begin(), 2, 0);
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/fill_n/debug/2_neg.cc b/libstdc++-v3/testsuite/25_algorithms/fill_n/debug/2_neg.cc
new file mode 100644 (file)
index 0000000..3738ae6
--- /dev/null
@@ -0,0 +1,39 @@
+// 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/>.
+
+// 25.2.5 [lib.alg.fill] Fill_n.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <vector>
+
+void
+test01()
+{
+  std::vector<int> vect;
+  vect.push_back(1);
+  std::fill_n(vect.rbegin(), 2, 0);
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/fill_n/debug/3_neg.cc b/libstdc++-v3/testsuite/25_algorithms/fill_n/debug/3_neg.cc
new file mode 100644 (file)
index 0000000..1497dbb
--- /dev/null
@@ -0,0 +1,39 @@
+// 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/>.
+
+// 25.2.5 [lib.alg.fill] Fill_n.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <list>
+
+void
+test01()
+{
+  std::list<int> l;
+  l.push_back(1);
+  std::fill_n(l.begin(), 2, 0);
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/fill_n/debug/4_neg.cc b/libstdc++-v3/testsuite/25_algorithms/fill_n/debug/4_neg.cc
new file mode 100644 (file)
index 0000000..70c4a29
--- /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/>.
+
+// 25.2.5 [lib.alg.fill] Fill_n.
+
+// { dg-do run { xfail *-*-* } }
+// { dg-require-debug-mode "" }
+
+#include <algorithm>
+#include <list>
+
+void
+test01()
+{
+  std::list<int> l;
+  l.push_back(1);
+  l.push_back(2);
+
+  std::list<int>::iterator it = l.begin();
+  ++it;
+  std::fill_n(it, 2, 0);
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}