diff options
author | fdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-05-29 21:29:07 +0000 |
---|---|---|
committer | fdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-05-29 21:29:07 +0000 |
commit | e009b1d8fa5f8b86520fabcd499113f75b08f24e (patch) | |
tree | 4ecd5b0b0c4b5cb8aeeff48b582990fbbcb62202 /libstdc++-v3/include/debug | |
parent | 48e66daa2b556ffd411faeaeb4f38baf31726927 (diff) | |
download | gcc-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/array | 3 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/assertions.h | 52 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/debug.h | 15 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/formatter.h | 113 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/functions.h | 52 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/safe_base.h | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/safe_iterator.h | 36 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/safe_local_iterator.h | 18 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/safe_sequence.h | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/safe_unordered_container.h | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/vector | 3 |
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 |