Commit 6c882d0f by François Dumont

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
parent bb6cb6e3
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> 2018-05-09 Jonathan Wakely <jwakely@redhat.com>
* include/bits/std_function.h (_Base_manager::_M_get_pointer): * include/bits/std_function.h (_Base_manager::_M_get_pointer):
......
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
#define _GLIBCXX_DEBUG_FORMATTER_H 1 #define _GLIBCXX_DEBUG_FORMATTER_H 1
#include <bits/c++config.h> #include <bits/c++config.h>
#include <bits/cpp_type_traits.h>
#if __cpp_rtti #if __cpp_rtti
# include <typeinfo> # include <typeinfo>
...@@ -43,6 +42,31 @@ namespace std ...@@ -43,6 +42,31 @@ namespace std
# define _GLIBCXX_TYPEID(_Type) 0 # define _GLIBCXX_TYPEID(_Type) 0
#endif #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 namespace __gnu_debug
{ {
using std::type_info; using std::type_info;
...@@ -157,6 +181,9 @@ namespace __gnu_debug ...@@ -157,6 +181,9 @@ namespace __gnu_debug
__middle, // dereferenceable, not at the beginning __middle, // dereferenceable, not at the beginning
__end, // past-the-end, may be at beginning if sequence empty __end, // past-the-end, may be at beginning if sequence empty
__before_begin, // before begin __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 __last_state
}; };
...@@ -243,11 +270,9 @@ namespace __gnu_debug ...@@ -243,11 +270,9 @@ namespace __gnu_debug
{ {
_M_variant._M_iterator._M_name = __name; _M_variant._M_iterator._M_name = __name;
_M_variant._M_iterator._M_address = std::__addressof(__it); _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_iterator<_Iterator, _Sequence>, __it._S_constant() ? __const_iterator : __mutable_iterator;
typename _Sequence::iterator>::
__value ? __mutable_iterator : __const_iterator;
_M_variant._M_iterator._M_sequence = __it._M_get_sequence(); _M_variant._M_iterator._M_sequence = __it._M_get_sequence();
_M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence); _M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence);
...@@ -273,11 +298,10 @@ namespace __gnu_debug ...@@ -273,11 +298,10 @@ namespace __gnu_debug
{ {
_M_variant._M_iterator._M_name = __name; _M_variant._M_iterator._M_name = __name;
_M_variant._M_iterator._M_address = std::__addressof(__it); _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 = _M_variant._M_iterator._M_constness =
std::__are_same<_Safe_local_iterator<_Iterator, _Sequence>, __it._S_constant() ? __const_iterator : __mutable_iterator;
typename _Sequence::local_iterator>::
__value ? __mutable_iterator : __const_iterator;
_M_variant._M_iterator._M_sequence = __it._M_get_sequence(); _M_variant._M_iterator._M_sequence = __it._M_get_sequence();
_M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence); _M_variant._M_iterator._M_seq_type = _GLIBCXX_TYPEID(_Sequence);
...@@ -334,6 +358,74 @@ namespace __gnu_debug ...@@ -334,6 +358,74 @@ namespace __gnu_debug
_M_variant._M_iterator._M_seq_type = 0; _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> template<typename _Sequence>
_Parameter(const _Safe_sequence<_Sequence>& __seq, _Parameter(const _Safe_sequence<_Sequence>& __seq,
const char* __name, _Is_sequence) const char* __name, _Is_sequence)
......
...@@ -91,11 +91,6 @@ namespace __gnu_debug ...@@ -91,11 +91,6 @@ namespace __gnu_debug
typedef _Safe_iterator_base _Safe_base; typedef _Safe_iterator_base _Safe_base;
typedef typename _Sequence::const_iterator _Const_iterator; 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; typedef std::iterator_traits<_Iterator> _Traits;
struct _Attach_single struct _Attach_single
...@@ -127,7 +122,7 @@ namespace __gnu_debug ...@@ -127,7 +122,7 @@ namespace __gnu_debug
*/ */
_Safe_iterator(const _Iterator& __i, const _Safe_sequence_base* __seq) _Safe_iterator(const _Iterator& __i, const _Safe_sequence_base* __seq)
_GLIBCXX_NOEXCEPT _GLIBCXX_NOEXCEPT
: _Iter_base(__i), _Safe_base(__seq, _M_constant()) : _Iter_base(__i), _Safe_base(__seq, _S_constant())
{ {
_GLIBCXX_DEBUG_VERIFY(!this->_M_singular(), _GLIBCXX_DEBUG_VERIFY(!this->_M_singular(),
_M_message(__msg_init_singular) _M_message(__msg_init_singular)
...@@ -396,6 +391,12 @@ namespace __gnu_debug ...@@ -396,6 +391,12 @@ namespace __gnu_debug
} }
// ------ Utilities ------ // ------ 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 * @brief Return the underlying iterator
*/ */
...@@ -414,12 +415,12 @@ namespace __gnu_debug ...@@ -414,12 +415,12 @@ namespace __gnu_debug
/** Attach iterator to the given sequence. */ /** Attach iterator to the given sequence. */
void void
_M_attach(_Safe_sequence_base* __seq) _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. */ /** Likewise, but not thread-safe. */
void void
_M_attach_single(_Safe_sequence_base* __seq) _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? /// Is the iterator dereferenceable?
bool bool
......
...@@ -54,14 +54,6 @@ namespace __gnu_debug ...@@ -54,14 +54,6 @@ namespace __gnu_debug
typedef typename _Sequence::const_local_iterator _Const_local_iterator; typedef typename _Sequence::const_local_iterator _Const_local_iterator;
typedef typename _Sequence::size_type size_type; 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; typedef std::iterator_traits<_Iterator> _Traits;
struct _Attach_single struct _Attach_single
...@@ -92,7 +84,7 @@ namespace __gnu_debug ...@@ -92,7 +84,7 @@ namespace __gnu_debug
*/ */
_Safe_local_iterator(const _Iterator& __i, _Safe_local_iterator(const _Iterator& __i,
const _Safe_sequence_base* __cont) 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(), _GLIBCXX_DEBUG_VERIFY(!this->_M_singular(),
_M_message(__msg_init_singular) _M_message(__msg_init_singular)
...@@ -278,6 +270,15 @@ namespace __gnu_debug ...@@ -278,6 +270,15 @@ namespace __gnu_debug
} }
// ------ Utilities ------ // ------ 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 * @brief Return the underlying iterator
*/ */
...@@ -302,12 +303,12 @@ namespace __gnu_debug ...@@ -302,12 +303,12 @@ namespace __gnu_debug
/** Attach iterator to the given sequence. */ /** Attach iterator to the given sequence. */
void void
_M_attach(_Safe_sequence_base* __seq) _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. */ /** Likewise, but not thread-safe. */
void void
_M_attach_single(_Safe_sequence_base* __seq) _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? /// Is the iterator dereferenceable?
bool bool
......
...@@ -720,7 +720,10 @@ namespace ...@@ -720,7 +720,10 @@ namespace
"dereferenceable (start-of-sequence)", "dereferenceable (start-of-sequence)",
"dereferenceable", "dereferenceable",
"past-the-end", "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]); print_word(ctx, state_names[iterator._M_state]);
} }
......
// { 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;
}
// 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;
}
// 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment