+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):
#define _GLIBCXX_DEBUG_FORMATTER_H 1
#include <bits/c++config.h>
-#include <bits/cpp_type_traits.h>
#if __cpp_rtti
# include <typeinfo>
# 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;
__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
};
{
_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);
{
_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);
_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)
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
*/
_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)
}
// ------ 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
*/
/** 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
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
*/
_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)
}
// ------ 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
*/
/** 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
"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]);
}
--- /dev/null
+// { 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;
+}
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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;
+}