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
Block a user