From 6c882d0fdc2b2d4147419f12cad96bfa082622f0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fran=C3=A7ois=20Dumont?= Date: Wed, 9 May 2018 20:04:46 +0000 Subject: [PATCH] safe_iterator.h (_Safe_iterator<>::_M_constant()): Rename in... MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2018-05-09 François Dumont * 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 | 32 +++++ libstdc++-v3/include/debug/formatter.h | 110 ++++++++++++++++-- libstdc++-v3/include/debug/safe_iterator.h | 17 +-- .../include/debug/safe_local_iterator.h | 23 ++-- libstdc++-v3/src/c++11/debug.cc | 5 +- .../24_iterators/move_iterator/debug_neg.cc | 34 ++++++ .../24_iterators/normal_iterator/debug_neg.cc | 34 ++++++ .../reverse_iterator/debug_neg.cc | 34 ++++++ 8 files changed, 260 insertions(+), 29 deletions(-) create mode 100644 libstdc++-v3/testsuite/24_iterators/move_iterator/debug_neg.cc create mode 100644 libstdc++-v3/testsuite/24_iterators/normal_iterator/debug_neg.cc create mode 100644 libstdc++-v3/testsuite/24_iterators/reverse_iterator/debug_neg.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5d6d6ebe175..2416cdca9e5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,35 @@ +2018-05-09 François Dumont + + * 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 * include/bits/std_function.h (_Base_manager::_M_get_pointer): diff --git a/libstdc++-v3/include/debug/formatter.h b/libstdc++-v3/include/debug/formatter.h index c160bd8432c..383a3406d34 100644 --- a/libstdc++-v3/include/debug/formatter.h +++ b/libstdc++-v3/include/debug/formatter.h @@ -30,7 +30,6 @@ #define _GLIBCXX_DEBUG_FORMATTER_H 1 #include -#include #if __cpp_rtti # include @@ -43,6 +42,31 @@ namespace std # define _GLIBCXX_TYPEID(_Type) 0 #endif +#if __cplusplus >= 201103L +namespace __gnu_cxx +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + +template + class __normal_iterator; + +_GLIBCXX_END_NAMESPACE_VERSION +} + +namespace std +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + +template + class reverse_iterator; + +template + 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 + _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 + _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 + _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 + _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 + _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 _Parameter(const _Safe_sequence<_Sequence>& __seq, const char* __name, _Is_sequence) diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h index 169a64162e6..3a53ab723cd 100644 --- a/libstdc++-v3/include/debug/safe_iterator.h +++ b/libstdc++-v3/include/debug/safe_iterator.h @@ -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 diff --git a/libstdc++-v3/include/debug/safe_local_iterator.h b/libstdc++-v3/include/debug/safe_local_iterator.h index bb89aed6f5e..f9597a6da08 100644 --- a/libstdc++-v3/include/debug/safe_local_iterator.h +++ b/libstdc++-v3/include/debug/safe_local_iterator.h @@ -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 diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc index ede6b703aae..19137022b2a 100644 --- a/libstdc++-v3/src/c++11/debug.cc +++ b/libstdc++-v3/src/c++11/debug.cc @@ -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 index 00000000000..d64fe8fe751 --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/move_iterator/debug_neg.cc @@ -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 +// . + +#include +#include + +void test01() +{ + __gnu_debug::vector vals { 0, 1, 2, 3 }; + __gnu_debug::vector 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 index 00000000000..4c866c63ca9 --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/normal_iterator/debug_neg.cc @@ -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 +// . + +// 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 + +void test01() +{ + std::vector vals { 0, 1, 2, 3 }; + __gnu_debug::vector 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 index 00000000000..6c795c77591 --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/reverse_iterator/debug_neg.cc @@ -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 +// . + +// 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 + +void test01() +{ + __gnu_debug::vector vals { 0, 1, 2, 3 }; + __gnu_debug::vector vals2(vals.rend(), vals.rbegin()); +} + +int main() +{ + test01(); + return 0; +} -- 2.30.2