safe_iterator.h (_Safe_iterator<>::_M_constant()): Rename in...
authorFrançois Dumont <fdumont@gcc.gnu.org>
Wed, 9 May 2018 20:04:46 +0000 (20:04 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Wed, 9 May 2018 20:04:46 +0000 (20:04 +0000)
2018-05-09  François Dumont  <fdumont@gcc.gnu.org>

* include/debug/safe_iterator.h (_Safe_iterator<>::_M_constant()):
Rename in...
(_Safe_iterator<>::_S_constant()): ...that.
* include/debug/safe_local_iterator.h
(_Safe_local_iterator<>::_M_constant()): Rename in...
(_Safe_local_iterator<>::_S_constant()): ...that.
* include/debug/formatter.h: Remove bits/cpp_type_traits.h include.
(_Iterator_state::__rbegin): New.
(_Iterator_state::__rmiddle): New.
(_Iterator_state::__rend): New.
(_Parameter::_Parameter(const _Safe_iterator<>&, const char*,
_Is_iterator)): Use _Safe_iterator<>::_S_constant. Grab normal underlying
iterator type.
(_Parameter::_Parameter(const _Safe_local_iterator<>&, const char*,
_Is_iterator)): Likewise.
(_Parameter::_S_reverse_state(_Iterator_state)): New.
        (_Parameter(__gnu_cxx::__normal_iterator<> const&, const char*,
_Is_iterator)): New.
(_Parameter(std::reverse_iterator<> const&, const char*,
_Is_iterator)): New.
(_Parameter(std::reverse_iterator<_Safe_iterator<>> const&,
const char*, _Is_iterator)): New.
(_Parameter(std::move_iterator<> const&, const char*, _Is_iterator):
New.
(_Parameter(std::move_iterator<_Safe_iterator<>> const&, const char*,
_Is_iterator)): New.
* testsuite/24_iterators/move_iterator/debug_neg.cc: New.
* testsuite/24_iterators/normal_iterator/debug_neg.cc: New.
* testsuite/24_iterators/reverse_iterator/debug_neg.cc: New.

From-SVN: r260093

libstdc++-v3/ChangeLog
libstdc++-v3/include/debug/formatter.h
libstdc++-v3/include/debug/safe_iterator.h
libstdc++-v3/include/debug/safe_local_iterator.h
libstdc++-v3/src/c++11/debug.cc
libstdc++-v3/testsuite/24_iterators/move_iterator/debug_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/24_iterators/normal_iterator/debug_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/24_iterators/reverse_iterator/debug_neg.cc [new file with mode: 0644]

index 5d6d6ebe175d2a874c8f7c32c6ca0aa1223cbaab..2416cdca9e57c49738c7fe823339bdbb97ed256d 100644 (file)
@@ -1,3 +1,35 @@
+2018-05-09  François Dumont  <fdumont@gcc.gnu.org>
+
+       * include/debug/safe_iterator.h (_Safe_iterator<>::_M_constant()):
+       Rename in...
+       (_Safe_iterator<>::_S_constant()): ...that.
+       * include/debug/safe_local_iterator.h
+       (_Safe_local_iterator<>::_M_constant()): Rename in...
+       (_Safe_local_iterator<>::_S_constant()): ...that.
+       * include/debug/formatter.h: Remove bits/cpp_type_traits.h include.
+       (_Iterator_state::__rbegin): New.
+       (_Iterator_state::__rmiddle): New.
+       (_Iterator_state::__rend): New.
+       (_Parameter::_Parameter(const _Safe_iterator<>&, const char*,
+       _Is_iterator)): Use _Safe_iterator<>::_S_constant. Grab normal underlying
+       iterator type.
+       (_Parameter::_Parameter(const _Safe_local_iterator<>&, const char*,
+       _Is_iterator)): Likewise.
+       (_Parameter::_S_reverse_state(_Iterator_state)): New.
+        (_Parameter(__gnu_cxx::__normal_iterator<> const&, const char*,
+       _Is_iterator)): New.
+       (_Parameter(std::reverse_iterator<> const&, const char*,
+       _Is_iterator)): New.
+       (_Parameter(std::reverse_iterator<_Safe_iterator<>> const&,
+       const char*, _Is_iterator)): New.
+       (_Parameter(std::move_iterator<> const&, const char*, _Is_iterator):
+       New.
+       (_Parameter(std::move_iterator<_Safe_iterator<>> const&, const char*,
+       _Is_iterator)): New.
+       * testsuite/24_iterators/move_iterator/debug_neg.cc: New.
+       * testsuite/24_iterators/normal_iterator/debug_neg.cc: New.
+       * testsuite/24_iterators/reverse_iterator/debug_neg.cc: New.
+
 2018-05-09  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/bits/std_function.h (_Base_manager::_M_get_pointer):
index c160bd8432c7e5e6b5d4b0b88b04c512dc940043..383a3406d34ecb2affad63cbb73cca1f4a008cb3 100644 (file)
@@ -30,7 +30,6 @@
 #define _GLIBCXX_DEBUG_FORMATTER_H 1
 
 #include <bits/c++config.h>
-#include <bits/cpp_type_traits.h>
 
 #if __cpp_rtti
 # include <typeinfo>
@@ -43,6 +42,31 @@ namespace std
 # define _GLIBCXX_TYPEID(_Type) 0
 #endif
 
+#if __cplusplus >= 201103L
+namespace __gnu_cxx
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+template<typename _Iterator, typename _Container>
+  class __normal_iterator;
+
+_GLIBCXX_END_NAMESPACE_VERSION
+}
+
+namespace std
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+template<typename _Iterator>
+  class reverse_iterator;
+
+template<typename _Iterator>
+  class move_iterator;
+
+_GLIBCXX_END_NAMESPACE_VERSION
+}
+#endif
+
 namespace __gnu_debug
 {
   using std::type_info;
@@ -157,6 +181,9 @@ namespace __gnu_debug
       __middle,                // dereferenceable, not at the beginning
       __end,           // past-the-end, may be at beginning if sequence empty
       __before_begin,  // before begin
+      __rbegin,                // dereferenceable, and at the reverse-beginning
+      __rmiddle,       // reverse-dereferenceable, not at the reverse-beginning
+      __rend,          // reverse-past-the-end
       __last_state
     };
 
@@ -243,11 +270,9 @@ namespace __gnu_debug
        {
          _M_variant._M_iterator._M_name = __name;
          _M_variant._M_iterator._M_address = std::__addressof(__it);
-         _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
+         _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(_Iterator);
          _M_variant._M_iterator._M_constness =
-           std::__are_same<_Safe_iterator<_Iterator, _Sequence>,
-                           typename _Sequence::iterator>::
-             __value ? __mutable_iterator : __const_iterator;
+           __it._S_constant() ? __const_iterator : __mutable_iterator;
          _M_variant._M_iterator._M_sequence = __it._M_get_sequence();
          _M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence);
 
@@ -273,11 +298,10 @@ namespace __gnu_debug
        {
          _M_variant._M_iterator._M_name = __name;
          _M_variant._M_iterator._M_address = std::__addressof(__it);
-         _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
+         _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(_Iterator);
+         _M_variant._M_iterator._M_constness =
          _M_variant._M_iterator._M_constness =
-           std::__are_same<_Safe_local_iterator<_Iterator, _Sequence>,
-                           typename _Sequence::local_iterator>::
-             __value ? __mutable_iterator : __const_iterator;
+           __it._S_constant() ? __const_iterator : __mutable_iterator;
          _M_variant._M_iterator._M_sequence = __it._M_get_sequence();
          _M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence);
 
@@ -334,6 +358,74 @@ namespace __gnu_debug
          _M_variant._M_iterator._M_seq_type = 0;
        }
 
+#if __cplusplus >= 201103L
+      // The following constructors are only defined in C++11 to take
+      // advantage of the constructor delegation feature.
+      template<typename _Iterator, typename _Container>
+        _Parameter(
+         __gnu_cxx::__normal_iterator<_Iterator, _Container> const& __it,
+       const char* __name, _Is_iterator)
+       : _Parameter(__it.base(), __name, _Is_iterator{})
+       { _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it); }
+
+      template<typename _Iterator>
+       _Parameter(std::reverse_iterator<_Iterator> const& __it,
+                  const char* __name, _Is_iterator)
+       : _Parameter(__it.base(), __name, _Is_iterator{})
+       {
+         _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
+         _M_variant._M_iterator._M_state
+           = _S_reverse_state(_M_variant._M_iterator._M_state);
+       }
+
+      template<typename _Iterator, typename _Sequence>
+       _Parameter(std::reverse_iterator<_Safe_iterator<_Iterator,
+                                                       _Sequence>> const& __it,
+                  const char* __name, _Is_iterator)
+       : _Parameter(__it.base(), __name, _Is_iterator{})
+       {
+         _M_variant._M_iterator._M_type
+           = _GLIBCXX_TYPEID(std::reverse_iterator<_Iterator>);
+         _M_variant._M_iterator._M_state
+           = _S_reverse_state(_M_variant._M_iterator._M_state);
+       }
+
+      template<typename _Iterator>
+       _Parameter(std::move_iterator<_Iterator> const& __it,
+                  const char* __name, _Is_iterator)
+       : _Parameter(__it.base(), __name, _Is_iterator{})
+       { _M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it); }
+
+      template<typename _Iterator, typename _Sequence>
+       _Parameter(std::move_iterator<_Safe_iterator<_Iterator,
+                                                    _Sequence>> const& __it,
+                  const char* __name, _Is_iterator)
+       : _Parameter(__it.base(), __name, _Is_iterator{})
+      {
+       _M_variant._M_iterator._M_type
+         = _GLIBCXX_TYPEID(std::move_iterator<_Iterator>);
+      }
+
+    private:
+      _Iterator_state
+      _S_reverse_state(_Iterator_state __state)
+      {
+         switch (__state)
+           {
+           case __begin:
+             return __rend;
+           case __middle:
+             return __rmiddle;
+           case __end:
+             return __rbegin;
+           default:
+             return __state;
+           }
+      }
+
+    public:
+#endif
+
       template<typename _Sequence>
        _Parameter(const _Safe_sequence<_Sequence>& __seq,
                   const char* __name, _Is_sequence)
index 169a64162e60a76b25325d0abfc84aa619a9aa41..3a53ab723cdac0742dd1a457f7d25f5042940fb9 100644 (file)
@@ -91,11 +91,6 @@ namespace __gnu_debug
       typedef _Safe_iterator_base _Safe_base;
       typedef typename _Sequence::const_iterator _Const_iterator;
 
-      /// Determine if this is a constant iterator.
-      bool
-      _M_constant() const
-      { return std::__are_same<_Const_iterator, _Safe_iterator>::__value; }
-
       typedef std::iterator_traits<_Iterator> _Traits;
 
       struct _Attach_single
@@ -127,7 +122,7 @@ namespace __gnu_debug
        */
       _Safe_iterator(const _Iterator& __i, const _Safe_sequence_base* __seq)
       _GLIBCXX_NOEXCEPT
-      : _Iter_base(__i), _Safe_base(__seq, _M_constant())
+      : _Iter_base(__i), _Safe_base(__seq, _S_constant())
       {
        _GLIBCXX_DEBUG_VERIFY(!this->_M_singular(),
                              _M_message(__msg_init_singular)
@@ -396,6 +391,12 @@ namespace __gnu_debug
       }
 
       // ------ Utilities ------
+
+      /// Determine if this is a constant iterator.
+      static bool
+      _S_constant()
+      { return std::__are_same<_Const_iterator, _Safe_iterator>::__value; }
+
       /**
        * @brief Return the underlying iterator
        */
@@ -414,12 +415,12 @@ namespace __gnu_debug
       /** Attach iterator to the given sequence. */
       void
       _M_attach(_Safe_sequence_base* __seq)
-      { _Safe_base::_M_attach(__seq, _M_constant()); }
+      { _Safe_base::_M_attach(__seq, _S_constant()); }
 
       /** Likewise, but not thread-safe. */
       void
       _M_attach_single(_Safe_sequence_base* __seq)
-      { _Safe_base::_M_attach_single(__seq, _M_constant()); }
+      { _Safe_base::_M_attach_single(__seq, _S_constant()); }
 
       /// Is the iterator dereferenceable?
       bool
index bb89aed6f5e3adca297708cf940fd645f2b64626..f9597a6da083429b1ea6d3f060e4548f33ec9f39 100644 (file)
@@ -54,14 +54,6 @@ namespace __gnu_debug
       typedef typename _Sequence::const_local_iterator _Const_local_iterator;
       typedef typename _Sequence::size_type size_type;
 
-      /// Determine if this is a constant iterator.
-      bool
-      _M_constant() const
-      {
-       return std::__are_same<_Const_local_iterator,
-                              _Safe_local_iterator>::__value;
-      }
-
       typedef std::iterator_traits<_Iterator> _Traits;
 
       struct _Attach_single
@@ -92,7 +84,7 @@ namespace __gnu_debug
        */
       _Safe_local_iterator(const _Iterator& __i,
                           const _Safe_sequence_base* __cont)
-      : _Iter_base(__i), _Safe_base(__cont, _M_constant())
+      : _Iter_base(__i), _Safe_base(__cont, _S_constant())
       {
        _GLIBCXX_DEBUG_VERIFY(!this->_M_singular(),
                              _M_message(__msg_init_singular)
@@ -278,6 +270,15 @@ namespace __gnu_debug
       }
 
       // ------ Utilities ------
+
+      /// Determine if this is a constant iterator.
+      static bool
+      _S_constant()
+      {
+       return std::__are_same<_Const_local_iterator,
+                              _Safe_local_iterator>::__value;
+      }
+
       /**
        * @brief Return the underlying iterator
        */
@@ -302,12 +303,12 @@ namespace __gnu_debug
       /** Attach iterator to the given sequence. */
       void
       _M_attach(_Safe_sequence_base* __seq)
-      { _Safe_base::_M_attach(__seq, _M_constant()); }
+      { _Safe_base::_M_attach(__seq, _S_constant()); }
 
       /** Likewise, but not thread-safe. */
       void
       _M_attach_single(_Safe_sequence_base* __seq)
-      { _Safe_base::_M_attach_single(__seq, _M_constant()); }
+      { _Safe_base::_M_attach_single(__seq, _S_constant()); }
 
       /// Is the iterator dereferenceable?
       bool
index ede6b703aae4bf93821b625fe6ad1281f5a4a4e4..19137022b2a426b4ed9c549cee06cbab2b2a68cb 100644 (file)
@@ -720,7 +720,10 @@ namespace
                "dereferenceable (start-of-sequence)",
                "dereferenceable",
                "past-the-end",
-               "before-begin"
+               "before-begin",
+               "dereferenceable (start-of-reverse-sequence)",
+               "dereferenceable (reverse)",
+               "past-the-reverse-end"
              };
            print_word(ctx, state_names[iterator._M_state]);
          }
diff --git a/libstdc++-v3/testsuite/24_iterators/move_iterator/debug_neg.cc b/libstdc++-v3/testsuite/24_iterators/move_iterator/debug_neg.cc
new file mode 100644 (file)
index 0000000..d64fe8f
--- /dev/null
@@ -0,0 +1,34 @@
+// { dg-do run { target c++11 xfail *-*-* } }
+
+// 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/>.
+
+#include <debug/vector>
+#include <iterator>
+
+void test01()
+{
+  __gnu_debug::vector<int> vals { 0, 1, 2, 3 };
+  __gnu_debug::vector<int> mval(std::make_move_iterator(vals.begin() + 1),
+                               std::make_move_iterator(vals.begin()));
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/24_iterators/normal_iterator/debug_neg.cc b/libstdc++-v3/testsuite/24_iterators/normal_iterator/debug_neg.cc
new file mode 100644 (file)
index 0000000..4c866c6
--- /dev/null
@@ -0,0 +1,34 @@
+// 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/>.
+
+// Requires C++11 because we check for correct output of
+// __gnu_cxx::__normal_iterator which is improved in this mode.
+// { dg-do run { target c++11 xfail *-*-* } }
+
+#include <debug/vector>
+
+void test01()
+{
+  std::vector<int> vals { 0, 1, 2, 3 };
+  __gnu_debug::vector<int> vals2(vals.begin() + 1, vals.begin());
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/24_iterators/reverse_iterator/debug_neg.cc b/libstdc++-v3/testsuite/24_iterators/reverse_iterator/debug_neg.cc
new file mode 100644 (file)
index 0000000..6c795c7
--- /dev/null
@@ -0,0 +1,34 @@
+// 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/>.
+
+// Requires C++11 because we check for correct output of
+// std::reverse_iterator which is improved only in this mode.
+// { dg-do run { target c++11 xfail *-*-* } }
+
+#include <debug/vector>
+
+void test01()
+{
+  __gnu_debug::vector<int> vals { 0, 1, 2, 3 };
+  __gnu_debug::vector<int> vals2(vals.rend(), vals.rbegin());
+}
+
+int main()
+{
+  test01();
+  return 0;
+}