summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/debug
diff options
context:
space:
mode:
authorfdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4>2015-05-29 21:29:07 +0000
committerfdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4>2015-05-29 21:29:07 +0000
commite009b1d8fa5f8b86520fabcd499113f75b08f24e (patch)
tree4ecd5b0b0c4b5cb8aeeff48b582990fbbcb62202 /libstdc++-v3/include/debug
parent48e66daa2b556ffd411faeaeb4f38baf31726927 (diff)
downloadgcc-e009b1d8fa5f8b86520fabcd499113f75b08f24e.tar.gz
2015-05-29 François Dumont fdumont@gcc.gnu.org>
* include/debug/debug.h (_GLIBCXX_DEBUG_ASSERT, _GLIBCXX_DEBUG_PEDASSERT, _GLIBCXX_DEBUG_ONLY): Move definition... * include/debug/assertions.h: ...here, new. * include/debug/formatter.h (_Error_formatter::_Is_iterator_value_type): New. (_Error_formatter::_Is_instance): New. (_Error_formatter::_Parameter): Make public and not friend anymore. (_Error_formatter::_Parameter::__instance): New _M_kind enum entry. (_Error_formatter::_Parameter::__iterator_value_type): New _M_kind enum entry. (_Error_formatter::_Parameter::_Type): New. (_Error_formatter::_Parameter::_Instance): New, inherit from latter. (union _Error_formatter::_Parameter::_M_variant): Reorganize. (_Parameter(_Iterator const&, const char*, _Is_iterator)): Make all overloads take iterator through a const reference. (_Parameter(const _Iterator&, const char*, _Is_iterator_value_type)): New. (_Parameter(const _Type&, const char*, _Is_instance)): New. (_Error_formatter::_M_print_type): Delete. (_Error_formatter::_M_iterator_value_type): New. (_Error_formatter::_M_instance): New. * include/Makefile.am: Add new above debug file. * include/Makefile.in: Regenerate. * include/debug/functions.h (__check_dereferenceable(const _Safe_iterator<>&), __valid_range(const _Safe_iterator<>&), __is_safe_random_iterator<_Safe_iterator<>>): Move... * include/debug/safe_iterator.h: ... here. Replace debug.h include with assertions.h. (__check_singular_aux): Move... * include/debug/safe_base.h: ... here. * include/debug/functions.h (__check_dereferenceable(const _Safe_local_iterator<>&), __valid_range(const _Safe_local_iterator<>&): Move... * include/debug/safe_local_iterator.h: ...here. * include/debug/safe_sequence.h: Replace debug.h with assertions.h. Remove _Safe_iterator declaration. * include/debug/safe_unordered_container.h: Replace debug.h with assertions.h. * include/debug/array: Replace safe_sequence.h include with formatter.h and macros.h. * include/debug/deque: Include functions.tcc. * include/debug/forward_list: Likewise. * include/debug/list: Likewise. * include/debug/string: Likewise. * include/debug/vector: Likewise. * include/bits/unique_ptr.h: Replace debug.h include with new assertions.h. * include/bits/stl_iterator_base_funcs.h: Likewise. * testsuite/23_containers/array/tuple_interface/get_debug_neg.cc: Adjust dg-error line number. * testsuite/23_containers/array/tuple_interface/ tuple_element_debug_neg.cc: Likewise. * src/c++11/debug.cc: Adapt. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@223877 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/debug')
-rw-r--r--libstdc++-v3/include/debug/array3
-rw-r--r--libstdc++-v3/include/debug/assertions.h52
-rw-r--r--libstdc++-v3/include/debug/debug.h15
-rw-r--r--libstdc++-v3/include/debug/formatter.h113
-rw-r--r--libstdc++-v3/include/debug/functions.h52
-rw-r--r--libstdc++-v3/include/debug/safe_base.h7
-rw-r--r--libstdc++-v3/include/debug/safe_iterator.h36
-rw-r--r--libstdc++-v3/include/debug/safe_local_iterator.h18
-rw-r--r--libstdc++-v3/include/debug/safe_sequence.h5
-rw-r--r--libstdc++-v3/include/debug/safe_unordered_container.h2
-rw-r--r--libstdc++-v3/include/debug/vector3
11 files changed, 192 insertions, 114 deletions
diff --git a/libstdc++-v3/include/debug/array b/libstdc++-v3/include/debug/array
index 411e816d315..7bb74c17664 100644
--- a/libstdc++-v3/include/debug/array
+++ b/libstdc++-v3/include/debug/array
@@ -31,7 +31,8 @@
#pragma GCC system_header
-#include <debug/safe_sequence.h>
+#include <debug/formatter.h>
+#include <debug/macros.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
diff --git a/libstdc++-v3/include/debug/assertions.h b/libstdc++-v3/include/debug/assertions.h
new file mode 100644
index 00000000000..9b9a48c49b3
--- /dev/null
+++ b/libstdc++-v3/include/debug/assertions.h
@@ -0,0 +1,52 @@
+// Debugging support implementation -*- C++ -*-
+
+// Copyright (C) 2003-2015 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file debug/assertions.h
+ * This file is a GNU debug extension to the Standard C++ Library.
+ */
+
+#ifndef _GLIBCXX_DEBUG_ASSERTIONS_H
+#define _GLIBCXX_DEBUG_ASSERTIONS_H 1
+
+#ifndef _GLIBCXX_DEBUG
+
+# define _GLIBCXX_DEBUG_ASSERT(_Condition)
+# define _GLIBCXX_DEBUG_PEDASSERT(_Condition)
+# define _GLIBCXX_DEBUG_ONLY(_Statement) ;
+
+#else
+
+#define _GLIBCXX_DEBUG_ASSERT(_Condition) __glibcxx_assert(_Condition)
+
+#ifdef _GLIBCXX_DEBUG_PEDANTIC
+# define _GLIBCXX_DEBUG_PEDASSERT(_Condition) _GLIBCXX_DEBUG_ASSERT(_Condition)
+#else
+# define _GLIBCXX_DEBUG_PEDASSERT(_Condition)
+#endif
+
+# define _GLIBCXX_DEBUG_ONLY(_Statement) _Statement
+
+#endif
+
+#endif // _GLIBCXX_DEBUG_ASSERTIONS
diff --git a/libstdc++-v3/include/debug/debug.h b/libstdc++-v3/include/debug/debug.h
index 161108de0c6..b6623e62ecc 100644
--- a/libstdc++-v3/include/debug/debug.h
+++ b/libstdc++-v3/include/debug/debug.h
@@ -37,6 +37,8 @@
* the standard library algorithms.
*/
+#include <debug/assertions.h>
+
// Debug mode namespaces.
/**
@@ -58,9 +60,6 @@ namespace __gnu_debug
#ifndef _GLIBCXX_DEBUG
-# define _GLIBCXX_DEBUG_ASSERT(_Condition)
-# define _GLIBCXX_DEBUG_PEDASSERT(_Condition)
-# define _GLIBCXX_DEBUG_ONLY(_Statement) ;
# define __glibcxx_requires_cond(_Cond,_Msg)
# define __glibcxx_requires_valid_range(_First,_Last)
# define __glibcxx_requires_non_empty_range(_First,_Last)
@@ -83,16 +82,6 @@ namespace __gnu_debug
# include <debug/macros.h>
-#define _GLIBCXX_DEBUG_ASSERT(_Condition) __glibcxx_assert(_Condition)
-
-#ifdef _GLIBCXX_DEBUG_PEDANTIC
-# define _GLIBCXX_DEBUG_PEDASSERT(_Condition) _GLIBCXX_DEBUG_ASSERT(_Condition)
-#else
-# define _GLIBCXX_DEBUG_PEDASSERT(_Condition)
-#endif
-
-# define _GLIBCXX_DEBUG_ONLY(_Statement) _Statement
-
# define __glibcxx_requires_cond(_Cond,_Msg) _GLIBCXX_DEBUG_VERIFY(_Cond,_Msg)
# define __glibcxx_requires_valid_range(_First,_Last) \
__glibcxx_check_valid_range(_First,_Last)
diff --git a/libstdc++-v3/include/debug/formatter.h b/libstdc++-v3/include/debug/formatter.h
index 32dcf92ac59..378683921f7 100644
--- a/libstdc++-v3/include/debug/formatter.h
+++ b/libstdc++-v3/include/debug/formatter.h
@@ -154,8 +154,11 @@ namespace __gnu_debug
// Tags denoting the type of parameter for construction
struct _Is_iterator { };
+ struct _Is_iterator_value_type { };
struct _Is_sequence { };
+ struct _Is_instance { };
+ public:
// A parameter that may be referenced by an error message
struct _Parameter
{
@@ -165,17 +168,27 @@ namespace __gnu_debug
__iterator,
__sequence,
__integer,
- __string
+ __string,
+ __instance,
+ __iterator_value_type
} _M_kind;
+ struct _Type
+ {
+ const char* _M_name;
+ const type_info* _M_type;
+ };
+
+ struct _Instance : _Type
+ {
+ const void* _M_address;
+ };
+
union
{
// When _M_kind == __iterator
- struct
+ struct : _Instance
{
- const char* _M_name;
- const void* _M_address;
- const type_info* _M_type;
_Constness _M_constness;
_Iterator_state _M_state;
const void* _M_sequence;
@@ -183,12 +196,7 @@ namespace __gnu_debug
} _M_iterator;
// When _M_kind == __sequence
- struct
- {
- const char* _M_name;
- const void* _M_address;
- const type_info* _M_type;
- } _M_sequence;
+ _Instance _M_sequence;
// When _M_kind == __integer
struct
@@ -203,6 +211,12 @@ namespace __gnu_debug
const char* _M_name;
const char* _M_value;
} _M_string;
+
+ // When _M_kind == __instance
+ _Instance _M_instance;
+
+ // When _M_kind == __iterator_value_type
+ _Type _M_iterator_value_type;
} _M_variant;
_Parameter() : _M_kind(__unused_param), _M_variant() { }
@@ -222,7 +236,7 @@ namespace __gnu_debug
}
template<typename _Iterator, typename _Sequence>
- _Parameter(const _Safe_iterator<_Iterator, _Sequence>& __it,
+ _Parameter(_Safe_iterator<_Iterator, _Sequence> const& __it,
const char* __name, _Is_iterator)
: _M_kind(__iterator), _M_variant()
{
@@ -252,7 +266,7 @@ namespace __gnu_debug
}
template<typename _Iterator, typename _Sequence>
- _Parameter(const _Safe_local_iterator<_Iterator, _Sequence>& __it,
+ _Parameter(_Safe_local_iterator<_Iterator, _Sequence> const& __it,
const char* __name, _Is_iterator)
: _M_kind(__iterator), _M_variant()
{
@@ -280,33 +294,33 @@ namespace __gnu_debug
}
template<typename _Type>
- _Parameter(const _Type*& __it, const char* __name, _Is_iterator)
+ _Parameter(const _Type* const& __it, const char* __name, _Is_iterator)
: _M_kind(__iterator), _M_variant()
{
_M_variant._M_iterator._M_name = __name;
_M_variant._M_iterator._M_address = &__it;
_M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
- _M_variant._M_iterator._M_constness = __mutable_iterator;
- _M_variant._M_iterator._M_state = __it? __unknown_state : __singular;
+ _M_variant._M_iterator._M_constness = __const_iterator;
+ _M_variant._M_iterator._M_state = __it ? __unknown_state : __singular;
_M_variant._M_iterator._M_sequence = 0;
_M_variant._M_iterator._M_seq_type = 0;
}
template<typename _Type>
- _Parameter(_Type*& __it, const char* __name, _Is_iterator)
+ _Parameter(_Type* const& __it, const char* __name, _Is_iterator)
: _M_kind(__iterator), _M_variant()
{
_M_variant._M_iterator._M_name = __name;
_M_variant._M_iterator._M_address = &__it;
_M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
- _M_variant._M_iterator._M_constness = __const_iterator;
- _M_variant._M_iterator._M_state = __it? __unknown_state : __singular;
+ _M_variant._M_iterator._M_constness = __mutable_iterator;
+ _M_variant._M_iterator._M_state = __it ? __unknown_state : __singular;
_M_variant._M_iterator._M_sequence = 0;
_M_variant._M_iterator._M_seq_type = 0;
}
template<typename _Iterator>
- _Parameter(const _Iterator& __it, const char* __name, _Is_iterator)
+ _Parameter(_Iterator const& __it, const char* __name, _Is_iterator)
: _M_kind(__iterator), _M_variant()
{
_M_variant._M_iterator._M_name = __name;
@@ -314,7 +328,7 @@ namespace __gnu_debug
_M_variant._M_iterator._M_type = _GLIBCXX_TYPEID(__it);
_M_variant._M_iterator._M_constness = __unknown_constness;
_M_variant._M_iterator._M_state =
- __gnu_debug::__check_singular(__it)? __singular : __unknown_state;
+ __gnu_debug::__check_singular(__it) ? __singular : __unknown_state;
_M_variant._M_iterator._M_sequence = 0;
_M_variant._M_iterator._M_seq_type = 0;
}
@@ -339,6 +353,25 @@ namespace __gnu_debug
_M_variant._M_sequence._M_type = _GLIBCXX_TYPEID(_Sequence);
}
+ template<typename _Iterator>
+ _Parameter(const _Iterator& __it, const char* __name,
+ _Is_iterator_value_type)
+ : _M_kind(__iterator_value_type), _M_variant()
+ {
+ _M_variant._M_iterator_value_type._M_name = __name;
+ _M_variant._M_iterator_value_type._M_type =
+ _GLIBCXX_TYPEID(typename std::iterator_traits<_Iterator>::value_type);
+ }
+
+ template<typename _Type>
+ _Parameter(const _Type& __inst, const char* __name, _Is_instance)
+ : _M_kind(__instance), _M_variant()
+ {
+ _M_variant._M_instance._M_name = __name;
+ _M_variant._M_instance._M_address = &__inst;
+ _M_variant._M_instance._M_type = _GLIBCXX_TYPEID(_Type);
+ }
+
void
_M_print_field(const _Error_formatter* __formatter,
const char* __name) const;
@@ -347,9 +380,6 @@ namespace __gnu_debug
_M_print_description(const _Error_formatter* __formatter) const;
};
- friend struct _Parameter;
-
- public:
template<typename _Iterator>
const _Error_formatter&
_M_iterator(const _Iterator& __it, const char* __name = 0) const
@@ -360,6 +390,17 @@ namespace __gnu_debug
return *this;
}
+ template<typename _Iterator>
+ const _Error_formatter&
+ _M_iterator_value_type(const _Iterator& __it,
+ const char* __name = 0) const
+ {
+ if (_M_num_parameters < std::size_t(__max_parameters))
+ _M_parameters[_M_num_parameters++] =
+ _Parameter(__it, __name, _Is_iterator_value_type());
+ return *this;
+ }
+
const _Error_formatter&
_M_integer(long __value, const char* __name = 0) const
{
@@ -386,6 +427,16 @@ namespace __gnu_debug
return *this;
}
+ template<typename _Type>
+ const _Error_formatter&
+ _M_instance(const _Type& __inst, const char* __name = 0) const
+ {
+ if (_M_num_parameters < std::size_t(__max_parameters))
+ _M_parameters[_M_num_parameters++] = _Parameter(__inst, __name,
+ _Is_instance());
+ return *this;
+ }
+
const _Error_formatter&
_M_message(const char* __text) const
{ _M_text = __text; return *this; }
@@ -396,12 +447,6 @@ namespace __gnu_debug
_GLIBCXX_NORETURN void
_M_error() const;
- private:
- _Error_formatter(const char* __file, std::size_t __line)
- : _M_file(__file), _M_line(__line), _M_num_parameters(0), _M_text(0),
- _M_max_length(78), _M_column(1), _M_first_line(true), _M_wordwrap(false)
- { _M_get_max_length(); }
-
template<typename _Tp>
void
_M_format_word(char*, int, const char*, _Tp) const throw ();
@@ -412,9 +457,11 @@ namespace __gnu_debug
void
_M_print_string(const char* __string) const;
- void
- _M_print_type(const type_info* __info,
- const char* __unknown_name) const;
+ private:
+ _Error_formatter(const char* __file, std::size_t __line)
+ : _M_file(__file), _M_line(__line), _M_num_parameters(0), _M_text(0),
+ _M_max_length(78), _M_column(1), _M_first_line(true), _M_wordwrap(false)
+ { _M_get_max_length(); }
void
_M_get_max_length() const throw ();
diff --git a/libstdc++-v3/include/debug/functions.h b/libstdc++-v3/include/debug/functions.h
index c67b4eb4758..4a245dd9ed2 100644
--- a/libstdc++-v3/include/debug/functions.h
+++ b/libstdc++-v3/include/debug/functions.h
@@ -30,14 +30,17 @@
#define _GLIBCXX_DEBUG_FUNCTIONS_H 1
#include <bits/c++config.h>
-#include <bits/stl_iterator_base_types.h> // for iterator_traits, categories and
- // _Iter_base
-#include <bits/cpp_type_traits.h> // for __is_integer
-#include <bits/move.h> // for __addressof and addressof
-#include <bits/stl_function.h> // for less
+#include <bits/stl_iterator_base_types.h> // for iterator_traits,
+ // categories and _Iter_base
+#include <bits/cpp_type_traits.h> // for __is_integer
+
+#include <bits/move.h> // for __addressof
+#include <bits/stl_function.h> // for less
#if __cplusplus >= 201103L
-# include <type_traits> // for is_lvalue_reference and __and_
+# include <type_traits> // for is_lvalue_reference and
+ // conditional.
#endif
+
#include <debug/formatter.h>
namespace __gnu_debug
@@ -45,9 +48,6 @@ namespace __gnu_debug
template<typename _Iterator, typename _Sequence>
class _Safe_iterator;
- template<typename _Iterator, typename _Sequence>
- class _Safe_local_iterator;
-
template<typename _Sequence>
struct _Insert_range_from_self_is_safe
{ enum { __value = 0 }; };
@@ -85,19 +85,6 @@ namespace __gnu_debug
__check_dereferenceable(const _Tp* __ptr)
{ return __ptr; }
- /** Safe iterators know if they are dereferenceable. */
- template<typename _Iterator, typename _Sequence>
- inline bool
- __check_dereferenceable(const _Safe_iterator<_Iterator, _Sequence>& __x)
- { return __x._M_dereferenceable(); }
-
- /** Safe local iterators know if they are dereferenceable. */
- template<typename _Iterator, typename _Sequence>
- inline bool
- __check_dereferenceable(const _Safe_local_iterator<_Iterator,
- _Sequence>& __x)
- { return __x._M_dereferenceable(); }
-
/** If the distance between two random access iterators is
* nonnegative, assume the range is valid.
*/
@@ -150,20 +137,6 @@ namespace __gnu_debug
return __valid_range_aux(__first, __last, _Integral());
}
- /** Safe iterators know how to check if they form a valid range. */
- template<typename _Iterator, typename _Sequence>
- inline bool
- __valid_range(const _Safe_iterator<_Iterator, _Sequence>& __first,
- const _Safe_iterator<_Iterator, _Sequence>& __last)
- { return __first._M_valid_range(__last); }
-
- /** Safe local iterators know how to check if they form a valid range. */
- template<typename _Iterator, typename _Sequence>
- inline bool
- __valid_range(const _Safe_local_iterator<_Iterator, _Sequence>& __first,
- const _Safe_local_iterator<_Iterator, _Sequence>& __last)
- { return __first._M_valid_range(__last); }
-
/* Checks that [first, last) is a valid range, and then returns
* __first. This routine is useful when we can't use a separate
* assertion statement because, e.g., we are in a constructor.
@@ -535,13 +508,6 @@ namespace __gnu_debug
typedef std::__false_type __type;
};
- template<typename _Iterator, typename _Sequence>
- struct __is_safe_random_iterator<_Safe_iterator<_Iterator, _Sequence> >
- : std::__are_same<std::random_access_iterator_tag,
- typename std::iterator_traits<_Iterator>::
- iterator_category>
- { };
-
template<typename _Iterator>
struct _Siter_base
: std::_Iter_base<_Iterator, __is_safe_random_iterator<_Iterator>::__value>
diff --git a/libstdc++-v3/include/debug/safe_base.h b/libstdc++-v3/include/debug/safe_base.h
index c9f32bf2ac1..b44ded013a8 100644
--- a/libstdc++-v3/include/debug/safe_base.h
+++ b/libstdc++-v3/include/debug/safe_base.h
@@ -159,6 +159,13 @@ namespace __gnu_debug
}
};
+ /** Iterators that derive from _Safe_iterator_base can be determined singular
+ * or non-singular.
+ **/
+ inline bool
+ __check_singular_aux(const _Safe_iterator_base* __x)
+ { return __x->_M_singular(); }
+
/**
* @brief Base class that supports tracking of iterators that
* reference a sequence.
diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h
index 1eea238b97a..9f2dcd1e238 100644
--- a/libstdc++-v3/include/debug/safe_iterator.h
+++ b/libstdc++-v3/include/debug/safe_iterator.h
@@ -29,7 +29,7 @@
#ifndef _GLIBCXX_DEBUG_SAFE_ITERATOR_H
#define _GLIBCXX_DEBUG_SAFE_ITERATOR_H 1
-#include <debug/debug.h>
+#include <debug/assertions.h>
#include <debug/macros.h>
#include <debug/functions.h>
#include <debug/safe_base.h>
@@ -55,13 +55,6 @@ namespace __gnu_debug
{ return __it.base() == __it._M_get_sequence()->_M_base().begin(); }
};
- /** Iterators that derive from _Safe_iterator_base can be determined singular
- * or non-singular.
- **/
- inline bool
- __check_singular_aux(const _Safe_iterator_base* __x)
- { return __x->_M_singular(); }
-
/** The precision to which we can calculate the distance between
* two iterators.
*/
@@ -93,11 +86,7 @@ namespace __gnu_debug
inline std::pair<typename std::iterator_traits<_Iterator>::difference_type,
_Distance_precision>
__get_distance(const _Iterator& __lhs, const _Iterator& __rhs)
- {
- typedef typename std::iterator_traits<_Iterator>::iterator_category
- _Category;
- return __get_distance(__lhs, __rhs, _Category());
- }
+ { return __get_distance(__lhs, __rhs, std::__iterator_category(__lhs)); }
/** \brief Safe iterator wrapper.
*
@@ -768,6 +757,27 @@ namespace __gnu_debug
operator+(typename _Safe_iterator<_Iterator,_Sequence>::difference_type __n,
const _Safe_iterator<_Iterator, _Sequence>& __i) _GLIBCXX_NOEXCEPT
{ return __i + __n; }
+
+ /** Safe iterators know if they are dereferenceable. */
+ template<typename _Iterator, typename _Sequence>
+ inline bool
+ __check_dereferenceable(const _Safe_iterator<_Iterator, _Sequence>& __x)
+ { return __x._M_dereferenceable(); }
+
+ /** Safe iterators know how to check if they form a valid range. */
+ template<typename _Iterator, typename _Sequence>
+ inline bool
+ __valid_range(const _Safe_iterator<_Iterator, _Sequence>& __first,
+ const _Safe_iterator<_Iterator, _Sequence>& __last)
+ { return __first._M_valid_range(__last); }
+
+ template<typename _Iterator, typename _Sequence>
+ struct __is_safe_random_iterator<_Safe_iterator<_Iterator, _Sequence> >
+ : std::__are_same<std::random_access_iterator_tag,
+ typename std::iterator_traits<_Iterator>::
+ iterator_category>
+ { };
+
} // namespace __gnu_debug
#include <debug/safe_iterator.tcc>
diff --git a/libstdc++-v3/include/debug/safe_local_iterator.h b/libstdc++-v3/include/debug/safe_local_iterator.h
index 066e10bd277..dcbe4400cac 100644
--- a/libstdc++-v3/include/debug/safe_local_iterator.h
+++ b/libstdc++-v3/include/debug/safe_local_iterator.h
@@ -29,11 +29,7 @@
#ifndef _GLIBCXX_DEBUG_SAFE_LOCAL_ITERATOR_H
#define _GLIBCXX_DEBUG_SAFE_LOCAL_ITERATOR_H 1
-#include <debug/debug.h>
-#include <debug/macros.h>
-#include <debug/functions.h>
#include <debug/safe_unordered_base.h>
-#include <ext/type_traits.h>
namespace __gnu_debug
{
@@ -432,6 +428,20 @@ namespace __gnu_debug
._M_iterator(__rhs, "rhs"));
return __lhs.base() != __rhs.base();
}
+
+ /** Safe local iterators know if they are dereferenceable. */
+ template<typename _Iterator, typename _Sequence>
+ inline bool
+ __check_dereferenceable(const _Safe_local_iterator<_Iterator,
+ _Sequence>& __x)
+ { return __x._M_dereferenceable(); }
+
+ /** Safe local iterators know how to check if they form a valid range. */
+ template<typename _Iterator, typename _Sequence>
+ inline bool
+ __valid_range(const _Safe_local_iterator<_Iterator, _Sequence>& __first,
+ const _Safe_local_iterator<_Iterator, _Sequence>& __last)
+ { return __first._M_valid_range(__last); }
} // namespace __gnu_debug
#include <debug/safe_local_iterator.tcc>
diff --git a/libstdc++-v3/include/debug/safe_sequence.h b/libstdc++-v3/include/debug/safe_sequence.h
index abb0c296bed..4e9397bd527 100644
--- a/libstdc++-v3/include/debug/safe_sequence.h
+++ b/libstdc++-v3/include/debug/safe_sequence.h
@@ -29,16 +29,13 @@
#ifndef _GLIBCXX_DEBUG_SAFE_SEQUENCE_H
#define _GLIBCXX_DEBUG_SAFE_SEQUENCE_H 1
-#include <debug/debug.h>
+#include <debug/assertions.h>
#include <debug/macros.h>
#include <debug/functions.h>
#include <debug/safe_base.h>
namespace __gnu_debug
{
- template<typename _Iterator, typename _Sequence>
- class _Safe_iterator;
-
/** A simple function object that returns true if the passed-in
* value is not equal to the stored value. It saves typing over
* using both bind1st and not_equal.
diff --git a/libstdc++-v3/include/debug/safe_unordered_container.h b/libstdc++-v3/include/debug/safe_unordered_container.h
index 05d08b7db72..8d4da958b1b 100644
--- a/libstdc++-v3/include/debug/safe_unordered_container.h
+++ b/libstdc++-v3/include/debug/safe_unordered_container.h
@@ -29,7 +29,7 @@
#ifndef _GLIBCXX_DEBUG_SAFE_UNORDERED_CONTAINER_H
#define _GLIBCXX_DEBUG_SAFE_UNORDERED_CONTAINER_H 1
-#include <debug/debug.h>
+#include <debug/assertions.h>
#include <debug/macros.h>
#include <debug/functions.h>
#include <debug/safe_unordered_base.h>
diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector
index bf0a88eb01c..be679920949 100644
--- a/libstdc++-v3/include/debug/vector
+++ b/libstdc++-v3/include/debug/vector
@@ -742,8 +742,7 @@ namespace __debug
{
size_t
operator()(const __debug::vector<bool, _Alloc>& __b) const noexcept
- { return std::hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>()
- (__b._M_base()); }
+ { return std::hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>()(__b); }
};
#endif