mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			safe_iterator.h (_Safe_iterator<>::_M_constant()): Rename in...
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
			
			
This commit is contained in:
		
							parent
							
								
									bb6cb6e3e2
								
							
						
					
					
						commit
						6c882d0fdc
					
				|  | @ -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): | ||||
|  |  | |||
|  | @ -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 = | ||||
| 	    std::__are_same<_Safe_local_iterator<_Iterator, _Sequence>, | ||||
| 			    typename _Sequence::local_iterator>:: | ||||
| 	      __value ? __mutable_iterator : __const_iterator; | ||||
| 	  _M_variant._M_iterator._M_constness = | ||||
| 	    __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) | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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]); | ||||
| 	  } | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
|  | @ -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; | ||||
| } | ||||
|  | @ -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; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 François Dumont
						François Dumont