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:
François Dumont 2018-05-09 20:04:46 +00:00
parent bb6cb6e3e2
commit 6c882d0fdc
8 changed files with 260 additions and 29 deletions

View 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):

View 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 =
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)

View 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

View 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

View 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]);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}