2005-05-27 15:01:45 +00:00
|
|
|
// Debugging support implementation -*- C++ -*-
|
|
|
|
|
2024-01-03 12:19:35 +01:00
|
|
|
// Copyright (C) 2003-2024 Free Software Foundation, Inc.
|
2005-05-27 15:01:45 +00:00
|
|
|
//
|
|
|
|
// 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
|
2009-04-09 17:00:19 +02:00
|
|
|
// Free Software Foundation; either version 3, or (at your option)
|
2005-05-27 15:01:45 +00:00
|
|
|
// 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.
|
|
|
|
|
2009-04-09 17:00:19 +02:00
|
|
|
// 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.
|
2005-05-27 15:01:45 +00:00
|
|
|
|
2009-04-09 17:00:19 +02:00
|
|
|
// 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/>.
|
2005-05-27 15:01:45 +00:00
|
|
|
|
2006-11-29 20:59:22 +00:00
|
|
|
/** @file debug/macros.h
|
|
|
|
* This file is a GNU debug extension to the Standard C++ Library.
|
|
|
|
*/
|
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
#ifndef _GLIBCXX_DEBUG_MACROS_H
|
|
|
|
#define _GLIBCXX_DEBUG_MACROS_H 1
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Macros used by the implementation to verify certain
|
|
|
|
* properties. These macros may only be used directly by the debug
|
|
|
|
* wrappers. Note that these are macros (instead of the more obviously
|
2010-02-04 18:20:34 +00:00
|
|
|
* @a correct choice of making them functions) because we need line and
|
2005-05-27 15:01:45 +00:00
|
|
|
* file information at the call site, to minimize the distance between
|
|
|
|
* the user error and where the error is reported.
|
|
|
|
*
|
|
|
|
*/
|
2018-06-12 20:18:35 +00:00
|
|
|
|
2018-05-08 19:41:02 +00:00
|
|
|
#define _GLIBCXX_DEBUG_VERIFY_AT_F(_Cond,_ErrMsg,_File,_Line,_Func) \
|
2020-01-21 19:12:29 +01:00
|
|
|
do { \
|
libstdc++: Make __gnu_debug::vector usable in constant expressions [PR109536]
This makes constexpr std::vector (mostly) work in Debug Mode. All safe
iterator instrumentation and checking is disabled during constant
evaluation, because it requires mutex locks and calls to non-inline
functions defined in libstdc++.so. It should be OK to disable the safety
checks, because most UB should be detected during constant evaluation
anyway.
We could try to enable the full checking in constexpr, but it would mean
wrapping all the non-inline functions like _M_attach with an inline
_M_constexpr_attach that does the iterator housekeeping inline without
mutex locks when called for constant evaluation, and calls the
non-inline function at runtime. That could be done in future if we find
that we've lost safety or useful checking by disabling the safe
iterators.
There are a few test failures in C++20 mode, which I'm unable to
explain. The _Safe_iterator::operator++() member gives errors for using
non-constexpr functions during constant evaluation, even though those
functions are guarded by std::is_constant_evaluated() checks. The same
code works fine for C++23 and up.
libstdc++-v3/ChangeLog:
PR libstdc++/109536
* include/bits/c++config (__glibcxx_constexpr_assert): Remove
macro.
* include/bits/stl_algobase.h (__niter_base, __copy_move_a)
(__copy_move_backward_a, __fill_a, __fill_n_a, __equal_aux)
(__lexicographical_compare_aux): Add constexpr to overloads for
debug mode iterators.
* include/debug/helper_functions.h (__unsafe): Add constexpr.
* include/debug/macros.h (_GLIBCXX_DEBUG_VERIFY_COND_AT): Remove
macro, folding it into ...
(_GLIBCXX_DEBUG_VERIFY_AT_F): ... here. Do not use
__glibcxx_constexpr_assert.
* include/debug/safe_base.h (_Safe_iterator_base): Add constexpr
to some member functions. Omit attaching, detaching and checking
operations during constant evaluation.
* include/debug/safe_container.h (_Safe_container): Likewise.
* include/debug/safe_iterator.h (_Safe_iterator): Likewise.
* include/debug/safe_iterator.tcc (__niter_base, __copy_move_a)
(__copy_move_backward_a, __fill_a, __fill_n_a, __equal_aux)
(__lexicographical_compare_aux): Add constexpr.
* include/debug/vector (_Safe_vector, vector): Add constexpr.
Omit safe iterator operations during constant evaluation.
* testsuite/23_containers/vector/bool/capacity/constexpr.cc:
Remove dg-xfail-if for debug mode.
* testsuite/23_containers/vector/bool/cmp_c++20.cc: Likewise.
* testsuite/23_containers/vector/bool/cons/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/bool/element_access/1.cc:
Likewise.
* testsuite/23_containers/vector/bool/element_access/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/bool/modifiers/assign/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/bool/modifiers/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/bool/modifiers/swap/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/capacity/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/cmp_c++20.cc: Likewise.
* testsuite/23_containers/vector/cons/constexpr.cc: Likewise.
* testsuite/23_containers/vector/data_access/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/element_access/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/modifiers/assign/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/modifiers/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/modifiers/swap/constexpr.cc:
Likewise.
* testsuite/23_containers/vector/cons/destructible_debug_neg.cc:
Adjust dg-error line number.
2023-12-06 13:39:52 +00:00
|
|
|
if (__builtin_expect(!bool(_Cond), false)) \
|
|
|
|
__gnu_debug::_Error_formatter::_S_at(_File, _Line, _Func) \
|
|
|
|
._ErrMsg._M_error(); \
|
2005-05-27 15:01:45 +00:00
|
|
|
} while (false)
|
|
|
|
|
2018-05-08 19:41:02 +00:00
|
|
|
#define _GLIBCXX_DEBUG_VERIFY_AT(_Cond,_ErrMsg,_File,_Line) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY_AT_F(_Cond,_ErrMsg,_File,_Line,__PRETTY_FUNCTION__)
|
|
|
|
|
|
|
|
#define _GLIBCXX_DEBUG_VERIFY(_Cond,_ErrMsg) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY_AT_F(_Cond, _ErrMsg, __FILE__, __LINE__, \
|
|
|
|
__PRETTY_FUNCTION__)
|
macro.h (_GLIBCXX_DEBUG_VERIFY_AT): New.
2011-05-07 François Dumont <francois.cppdevs@free.fr>
* include/debug/macro.h (_GLIBCXX_DEBUG_VERIFY_AT): New.
(_GLICXX_DEBUG_VERIFY): Use latter.
* include/ext/pb_ds/detail/resize_policy/
hash_load_check_resize_trigger_imp.hpp: Emit assertion on the line
containing the original assert call.
* include/ext/pb_ds/detail/binomial_heap_base_/erase_fn_imps.hpp,
find_fn_imps.hpp, insert_fn_imps.hpp, binomial_heap_base_.hpp,
constructors_destructor_fn_imps.hpp, debug_fn_imps.hpp,
split_join_fn_imps.hpp: Likewise.
* include/ext/pb_ds/detail/cc_hash_table_map_/
erase_store_hash_fn_imps.hpp, insert_no_store_hash_fn_imps.hpp,
find_fn_imps.hpp, insert_store_hash_fn_imps.hpp, debug_fn_imps.hpp,
debug_no_store_hash_fn_imps.hpp, cc_ht_map_.hpp, resize_fn_imps.hpp,
constructor_destructor_fn_imps.hpp, debug_store_hash_fn_imps.hpp,
erase_no_store_hash_fn_imps.hpp: Likewise.
* include/ext/pb_ds/detail/pat_trie_/find_fn_imps.hpp,
insert_join_fn_imps.hpp, pat_trie_/head.hpp, debug_fn_imps.hpp,
constructors_destructor_fn_imps.hpp, pat_trie_.hpp, split_fn_imps.hpp,
leaf.hpp, erase_fn_imps.hpp, node_base.hpp, internal_node.hpp:
Likewise.
* include/ext/pb_ds/detail/bin_search_tree_/find_fn_imps.hpp,
r_erase_fn_imps.hpp, constructors_destructor_fn_imps.hpp,
debug_fn_imps.hpp, rotate_fn_imps.hpp, erase_fn_imps.hpp,
bin_search_tree_.hpp, insert_fn_imps.hpp, split_join_fn_imps.hpp:
Likewise.
* include/ext/pb_ds/detail/gp_hash_table_map_/
erase_store_hash_fn_imps.hpp, insert_no_store_hash_fn_imps.hpp,
find_fn_imps.hpp, gp_ht_map_.hpp, insert_store_hash_fn_imps.hpp,
debug_fn_imps.hpp, erase_fn_imps.hpp, debug_no_store_hash_fn_imps.hpp,
resize_fn_imps.hpp, constructor_destructor_fn_imps.hpp,
debug_store_hash_fn_imps.hpp, erase_no_store_hash_fn_imps.hpp:
Likewise.
* include/ext/pb_ds/detail/binary_heap_/find_fn_imps.hpp,
constructors_destructor_fn_imps.hpp, debug_fn_imps.hpp,
erase_fn_imps.hpp, insert_fn_imps.hpp, binary_heap_.hpp,
resize_policy.hpp, split_join_fn_imps.hpp: Likewise.
* include/ext/pb_ds/detail/pairing_heap_/erase_fn_imps.hpp,
find_fn_imps.hpp, insert_fn_imps.hpp,
constructors_destructor_fn_imps.hpp, debug_fn_imps.hpp,
pairing_heap_.hpp, split_join_fn_imps.hpp: Likewise.
* include/ext/pb_ds/detail/binomial_heap_/
constructors_destructor_fn_imps.hpp, debug_fn_imps.hpp,
binomial_heap_.hpp: Likewise.
* include/ext/pb_ds/detail/left_child_next_sibling_heap_/
erase_fn_imps.hpp, left_child_next_sibling_heap_.hpp,
constructors_destructor_fn_imps.hpp, debug_fn_imps.hpp: Likewise.
* include/ext/pb_ds/detail/thin_heap_/erase_fn_imps.hpp,
find_fn_imps.hpp, thin_heap_.hpp, insert_fn_imps.hpp,
constructors_destructor_fn_imps.hpp, debug_fn_imps.hpp,
split_join_fn_imps.hpp: Likewise.
* include/ext/pb_ds/detail/ov_tree_map_/erase_fn_imps.hpp,
ov_tree_map_.hpp, constructors_destructor_fn_imps.hpp,
debug_fn_imps.hpp, split_join_fn_imps.hpp, info_fn_imps.hpp: Likewise.
* include/ext/pb_ds/detail/debug_map_base.hpp: Likewise.
* include/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp,
find_fn_imps.hpp, insert_fn_imps.hpp,
constructors_destructor_fn_imps.hpp, debug_fn_imps.hpp,
splay_fn_imps.hpp, split_join_fn_imps.hpp, splay_tree_.hpp: Likewise.
* include/ext/pb_ds/detail/list_update_map_/erase_fn_imps.hpp,
find_fn_imps.hpp, lu_map_.hpp, constructor_destructor_fn_imps.hpp,
insert_fn_imps.hpp, debug_fn_imps.hpp: Likewise.
* include/ext/pb_ds/detail/rc_binomial_heap_/erase_fn_imps.hpp,
rc_binomial_heap_.hpp, insert_fn_imps.hpp,
constructors_destructor_fn_imps.hpp, debug_fn_imps.hpp, rc.hpp,
split_join_fn_imps.hpp: Likewise.
* include/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp,
insert_fn_imps.hpp, constructors_destructor_fn_imps.hpp,
debug_fn_imps.hpp, rb_tree_.hpp, split_join_fn_imps.hpp: Likewise.
* include/ext/pb_ds/hash_policy.hpp: Likewise.
From-SVN: r173529
2011-05-07 15:45:24 +02:00
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
// Verify that [_First, _Last) forms a valid iterator range.
|
|
|
|
#define __glibcxx_check_valid_range(_First,_Last) \
|
2006-02-22 00:57:24 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__valid_range(_First, _Last), \
|
|
|
|
_M_message(__gnu_debug::__msg_valid_range) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last))
|
|
|
|
|
macros.h (__glibcxx_check_valid_range_at): New.
2018-05-08 François Dumont <fdumont@gcc.gnu.org>
* include/debug/macros.h (__glibcxx_check_valid_range_at): New.
* include/debug/functions.h (__check_valid_range): Use latter.
* include/debug/macros.h (__glibcxx_check_valid_constructor_range): New,
use latter.
* include/debug/deque
(deque::deque<_Iter>(_Iter, _Iter, const _Alloc&)): Use latter.
* include/debug/forward_list
(forward_list::forward_list<_Iter>(_Iter, _Iter, const _Alloc&)):
Likewise.
* include/debug/list
(list::list<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
* include/debug/list
(list::list<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
* include/debug/map.h
(map::map<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
(map::map<_Iter>(_Iter, _Iter, const _Compare&, const _Alloc&)):
Likewise.
* include/debug/multimap.h
(multimap::multimap<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
(multimap::multimap<_Iter>(_Iter, _Iter, const _Compare&,
const _Alloc&)): Likewise.
* include/debug/set.h
(set::set<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
(set::set<_Iter>(_Iter, _Iter, const _Compare&, const _Alloc&)):
Likewise.
* include/debug/multiset.h
(multiset::multiset<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
(multiset::multiset<_Iter>(_Iter, _Iter, const _Compare&,
const _Alloc&)): Likewise.
* include/debug/string
(basic_string::basic_string<_Iter>(_Iter, _Iter, const _Alloc&)):
Likewise.
* include/debug/unordered_map
(unordered_map::unordered_map<_Iter>(_Iter, _Iter, const _Alloc&)):
Likewise.
(unordered_multimap::unordered_multimap<_Iter>(_Iter, _Iter,
const _Alloc&)): Likewise.
* include/debug/unordered_set
(unordered_set::unordered_set<_Iter>(_Iter, _Iter, const _Alloc&)):
Likewise.
(unordered_multiset::unordered_multiset<_Iter>(_Iter, _Iter,
const _Alloc&)): Likewise.
* include/debug/vector
(vector::vector<_Iter>(_Iter, _Iter, const _Alloc&)): Use latter.
From-SVN: r260053
2018-05-08 19:46:59 +00:00
|
|
|
#define __glibcxx_check_valid_range_at(_First,_Last,_File,_Line,_Func) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY_AT_F(__gnu_debug::__valid_range(_First, _Last), \
|
|
|
|
_M_message(__gnu_debug::__msg_valid_range) \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last), \
|
|
|
|
_File,_Line,_Func)
|
|
|
|
|
stl_iterator_base_types.h (_Iter_base): Limit definition to pre-C++11 mode.
2015-06-29 François Dumont <fdumont@gcc.gnu.org>
* include/bits/stl_iterator_base_types.h (_Iter_base): Limit definition
to pre-C++11 mode.
* include/debug/functions.h
(__gnu_debug::__valid_range, __gnu_debug::__base): Move...
* include/debug/safe_iterator.h
(__gnu_debug::_Sequence_traits): New.
(__gnu_debug::__get_distance_from_begin): New.
(__gnu_debug::__get_distance_to_end): New.
(__gnu_debug::_Safe_iterator<>::_M_valid_range): Expose iterator range
distance information. Add optional check_dereferenceable parameter,
default true.
(__gnu_debug::_Distance_precision, __gnu_debug::__get_distance): Move
default definition...
(__gnu_debug::__get_distance): New overload for _Safe_iterator.
(__gnu_debug::__unsafe): Likewise.
* include/debug/helper_functions.h: ...here. New.
(__gnu_debug::__unsafe): New helper function to remove safe iterator
layer.
* include/debug/stl_iterator.h: New. Include latter.
* include/bits/stl_iterator.h: Include latter in debug mode.
* include/debug/stl_iterator.tcc: Adapt.
* include/debug/safe_local_iterator.h (__gnu_debug::__get_distance): Add
overload for _Safe_local_iterator.
(__gnu_debug::__unsafe): Likewise.
* include/debug/safe_local_iterator.tcc: Adapt.
* include/debug/macros.h (__glibcxx_check_valid_range2): New.
(__glibcxx_check_insert_range): Add _Dist parameter.
(__glibcxx_check_insert_range_after): Likewise.
(__glibcxx_check_string, __glibcxx_check_string_len): Implement using
_GLIBCXX_DEBUG_PEDASSERT.
* include/debug/deque (deque<>::assign): Remove iterator debug layer
when possible.
(deque<>::insert): Likewise.
* include/debug/forward_list (__glibcxx_check_valid_fl_range): New.
(forward_list<>::splice_after): Use latter.
(forward_list<>::assign): Remove iterator debug layer when possible.
(forward_list<>::insert_after): Likewise.
(__gnu_debug::_Sequence_traits<>): Partial specialization.
* include/debug/list (list<>::assign): Remove iterator debug layer when
possible.
(list<>::insert): Likewise.
[__gnu_debug::_Sequence_traits<>]: Partial specialization pre C++11 ABI.
* include/debug/map.h (map<>::insert): Remove iterator debug layer when
possible.
* include/debug/multimap.h (multimap<>::insert): Likewise.
* include/debug/set.h (set<>::insert): Likewise.
* include/debug/multiset.h (multiset<>::insert): Likewise.
* include/debug/string (basic_string<>::append, basic_string<>::assign,
basic_string<>::insert, basic_string<>::replace): Likewise.
* include/debug/unordered_map
(unordered_map<>::insert, unordered_multimap<>::insert): Likewise.
* include/debug/unordered_set
(unordered_set<>::insert, unordered_multiset<>insert): Likewise.
* include/debug/vector
(vector<>::assign, vector<>::insert): Likewise.
* include/Makefile.am: Add new debug headers.
* include/Makefile.in: Regenerate.
From-SVN: r225143
2015-06-29 20:17:56 +00:00
|
|
|
#define __glibcxx_check_valid_range2(_First,_Last,_Dist) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__valid_range(_First, _Last, _Dist), \
|
|
|
|
_M_message(__gnu_debug::__msg_valid_range) \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last))
|
|
|
|
|
macros.h (__glibcxx_check_valid_range_at): New.
2018-05-08 François Dumont <fdumont@gcc.gnu.org>
* include/debug/macros.h (__glibcxx_check_valid_range_at): New.
* include/debug/functions.h (__check_valid_range): Use latter.
* include/debug/macros.h (__glibcxx_check_valid_constructor_range): New,
use latter.
* include/debug/deque
(deque::deque<_Iter>(_Iter, _Iter, const _Alloc&)): Use latter.
* include/debug/forward_list
(forward_list::forward_list<_Iter>(_Iter, _Iter, const _Alloc&)):
Likewise.
* include/debug/list
(list::list<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
* include/debug/list
(list::list<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
* include/debug/map.h
(map::map<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
(map::map<_Iter>(_Iter, _Iter, const _Compare&, const _Alloc&)):
Likewise.
* include/debug/multimap.h
(multimap::multimap<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
(multimap::multimap<_Iter>(_Iter, _Iter, const _Compare&,
const _Alloc&)): Likewise.
* include/debug/set.h
(set::set<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
(set::set<_Iter>(_Iter, _Iter, const _Compare&, const _Alloc&)):
Likewise.
* include/debug/multiset.h
(multiset::multiset<_Iter>(_Iter, _Iter, const _Alloc&)): Likewise.
(multiset::multiset<_Iter>(_Iter, _Iter, const _Compare&,
const _Alloc&)): Likewise.
* include/debug/string
(basic_string::basic_string<_Iter>(_Iter, _Iter, const _Alloc&)):
Likewise.
* include/debug/unordered_map
(unordered_map::unordered_map<_Iter>(_Iter, _Iter, const _Alloc&)):
Likewise.
(unordered_multimap::unordered_multimap<_Iter>(_Iter, _Iter,
const _Alloc&)): Likewise.
* include/debug/unordered_set
(unordered_set::unordered_set<_Iter>(_Iter, _Iter, const _Alloc&)):
Likewise.
(unordered_multiset::unordered_multiset<_Iter>(_Iter, _Iter,
const _Alloc&)): Likewise.
* include/debug/vector
(vector::vector<_Iter>(_Iter, _Iter, const _Alloc&)): Use latter.
From-SVN: r260053
2018-05-08 19:46:59 +00:00
|
|
|
#define __glibcxx_check_valid_constructor_range(_First,_Last) \
|
|
|
|
__gnu_debug::__check_valid_range(_First, _Last, \
|
|
|
|
__FILE__, __LINE__, __PRETTY_FUNCTION__)
|
|
|
|
|
2011-12-03 15:35:35 +00:00
|
|
|
// Verify that [_First, _Last) forms a non-empty iterator range.
|
|
|
|
#define __glibcxx_check_non_empty_range(_First,_Last) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First != _Last, \
|
|
|
|
_M_message(__gnu_debug::__msg_non_empty_range) \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last))
|
|
|
|
|
2018-06-13 20:27:26 +00:00
|
|
|
// Verify that [_First, _First + _Size) forms a valid range.
|
|
|
|
#define __glibcxx_check_can_increment(_First,_Size) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__can_advance(_First, _Size), \
|
|
|
|
_M_message(__gnu_debug::__msg_iter_subscript_oob) \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_integer(_Size, #_Size))
|
|
|
|
|
libstdc++: [_GLIBCXX_DEBUG] Fix management of __dp_sign_max_size [PR 99402]
__dp_sign precision indicates that we found out what iterator comes first or
last in the range. __dp_sign_max_size is the same plus it gives the information
of the max size of the range that is to say the max_size value such that
distance(lhs, rhs) < max_size.
Thanks to this additional information we are able to tell when a copy of n elements
to that range will fail even if we do not know exactly how large it is.
This patch makes sure that we are properly using this information.
libstdc++-v3/ChangeLog:
PR libstdc++/99402
* include/debug/helper_functions.h (__can_advance(_InputIterator,
const std::pair<_Diff, _Distance_precision>&, int)): New.
(__can_advance(const _Safe_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
* include/debug/macros.h (__glibcxx_check_can_increment_dist): New,
use latter.
(__glibcxx_check_can_increment_range): Adapt to use latter.
(__glibcxx_check_can_decrement_range): Likewise.
* include/debug/safe_iterator.h
(_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, _Distance_precision>&,
int)): New.
(__can_advance(const _Safe_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
* include/debug/safe_iterator.tcc
(_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, _Distance_precision>&,
int)): New.
(_Safe_iterator<>::_M_valid_range(const _Safe_iterator<>&,
std::pair<difference_type, _Distance_precision>&, bool)): Adapt for
__dp_sign_max_size.
(__copy_move_a): Adapt to use __glibcxx_check_can_increment_dist.
(__copy_move_backward_a): Likewise.
(__equal_aux): Likewise.
* include/debug/stl_iterator.h (__can_advance(const std::reverse_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
(__can_advance(const std::move_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
* testsuite/25_algorithms/copy/debug/99402.cc: New test.
2021-03-07 19:11:02 +01:00
|
|
|
#define __glibcxx_check_can_increment_dist(_First,_Dist,_Way) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__can_advance(_First, _Dist, _Way), \
|
|
|
|
_M_message(__gnu_debug::__msg_iter_subscript_oob) \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_integer(_Way * _Dist.first, #_Dist))
|
|
|
|
|
2018-06-12 20:18:35 +00:00
|
|
|
#define __glibcxx_check_can_increment_range(_First1,_Last1,_First2) \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
typename __gnu_debug::_Distance_traits<__decltype(_First1)>::__type __dist;\
|
2020-12-11 07:48:06 +01:00
|
|
|
_GLIBCXX_DEBUG_VERIFY_AT_F( \
|
2018-06-12 20:18:35 +00:00
|
|
|
__gnu_debug::__valid_range(_First1, _Last1, __dist),\
|
|
|
|
_M_message(__gnu_debug::__msg_valid_range) \
|
|
|
|
._M_iterator(_First1, #_First1) \
|
|
|
|
._M_iterator(_Last1, #_Last1), \
|
|
|
|
__FILE__,__LINE__,__PRETTY_FUNCTION__); \
|
2020-12-11 07:48:06 +01:00
|
|
|
_GLIBCXX_DEBUG_VERIFY_AT_F( \
|
libstdc++: [_GLIBCXX_DEBUG] Fix management of __dp_sign_max_size [PR 99402]
__dp_sign precision indicates that we found out what iterator comes first or
last in the range. __dp_sign_max_size is the same plus it gives the information
of the max size of the range that is to say the max_size value such that
distance(lhs, rhs) < max_size.
Thanks to this additional information we are able to tell when a copy of n elements
to that range will fail even if we do not know exactly how large it is.
This patch makes sure that we are properly using this information.
libstdc++-v3/ChangeLog:
PR libstdc++/99402
* include/debug/helper_functions.h (__can_advance(_InputIterator,
const std::pair<_Diff, _Distance_precision>&, int)): New.
(__can_advance(const _Safe_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
* include/debug/macros.h (__glibcxx_check_can_increment_dist): New,
use latter.
(__glibcxx_check_can_increment_range): Adapt to use latter.
(__glibcxx_check_can_decrement_range): Likewise.
* include/debug/safe_iterator.h
(_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, _Distance_precision>&,
int)): New.
(__can_advance(const _Safe_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
* include/debug/safe_iterator.tcc
(_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, _Distance_precision>&,
int)): New.
(_Safe_iterator<>::_M_valid_range(const _Safe_iterator<>&,
std::pair<difference_type, _Distance_precision>&, bool)): Adapt for
__dp_sign_max_size.
(__copy_move_a): Adapt to use __glibcxx_check_can_increment_dist.
(__copy_move_backward_a): Likewise.
(__equal_aux): Likewise.
* include/debug/stl_iterator.h (__can_advance(const std::reverse_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
(__can_advance(const std::move_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
* testsuite/25_algorithms/copy/debug/99402.cc: New test.
2021-03-07 19:11:02 +01:00
|
|
|
__gnu_debug::__can_advance(_First2, __dist, 1), \
|
2018-06-12 20:18:35 +00:00
|
|
|
_M_message(__gnu_debug::__msg_iter_subscript_oob)\
|
|
|
|
._M_iterator(_First2, #_First2) \
|
|
|
|
._M_integer(__dist.first), \
|
|
|
|
__FILE__,__LINE__,__PRETTY_FUNCTION__); \
|
|
|
|
} while(false)
|
|
|
|
|
|
|
|
#define __glibcxx_check_can_decrement_range(_First1,_Last1,_First2) \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
typename __gnu_debug::_Distance_traits<__decltype(_First1)>::__type __dist;\
|
2020-12-11 07:48:06 +01:00
|
|
|
_GLIBCXX_DEBUG_VERIFY_AT_F( \
|
2018-06-12 20:18:35 +00:00
|
|
|
__gnu_debug::__valid_range(_First1, _Last1, __dist),\
|
|
|
|
_M_message(__gnu_debug::__msg_valid_range) \
|
|
|
|
._M_iterator(_First1, #_First1) \
|
|
|
|
._M_iterator(_Last1, #_Last1), \
|
|
|
|
__FILE__,__LINE__,__PRETTY_FUNCTION__); \
|
2020-12-11 07:48:06 +01:00
|
|
|
_GLIBCXX_DEBUG_VERIFY_AT_F( \
|
libstdc++: [_GLIBCXX_DEBUG] Fix management of __dp_sign_max_size [PR 99402]
__dp_sign precision indicates that we found out what iterator comes first or
last in the range. __dp_sign_max_size is the same plus it gives the information
of the max size of the range that is to say the max_size value such that
distance(lhs, rhs) < max_size.
Thanks to this additional information we are able to tell when a copy of n elements
to that range will fail even if we do not know exactly how large it is.
This patch makes sure that we are properly using this information.
libstdc++-v3/ChangeLog:
PR libstdc++/99402
* include/debug/helper_functions.h (__can_advance(_InputIterator,
const std::pair<_Diff, _Distance_precision>&, int)): New.
(__can_advance(const _Safe_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
* include/debug/macros.h (__glibcxx_check_can_increment_dist): New,
use latter.
(__glibcxx_check_can_increment_range): Adapt to use latter.
(__glibcxx_check_can_decrement_range): Likewise.
* include/debug/safe_iterator.h
(_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, _Distance_precision>&,
int)): New.
(__can_advance(const _Safe_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
* include/debug/safe_iterator.tcc
(_Safe_iterator<>::_M_can_advance(const std::pair<_Diff, _Distance_precision>&,
int)): New.
(_Safe_iterator<>::_M_valid_range(const _Safe_iterator<>&,
std::pair<difference_type, _Distance_precision>&, bool)): Adapt for
__dp_sign_max_size.
(__copy_move_a): Adapt to use __glibcxx_check_can_increment_dist.
(__copy_move_backward_a): Likewise.
(__equal_aux): Likewise.
* include/debug/stl_iterator.h (__can_advance(const std::reverse_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
(__can_advance(const std::move_iterator<>&,
const std::pair<_Diff, _Distance_precision>&, int)): New.
* testsuite/25_algorithms/copy/debug/99402.cc: New test.
2021-03-07 19:11:02 +01:00
|
|
|
__gnu_debug::__can_advance(_First2, __dist, -1), \
|
2018-06-12 20:18:35 +00:00
|
|
|
_M_message(__gnu_debug::__msg_iter_subscript_oob)\
|
|
|
|
._M_iterator(_First2, #_First2) \
|
|
|
|
._M_integer(-__dist.first), \
|
|
|
|
__FILE__,__LINE__,__PRETTY_FUNCTION__); \
|
|
|
|
} while(false)
|
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
/** Verify that we can insert into *this with the iterator _Position.
|
|
|
|
* Insertion into a container at a specific position requires that
|
[multiple changes]
2010-09-29 Paolo Carlini <paolo.carlini@oracle.com>
* include/Makefile.am: Add debug/forward_list.
* include/Makefile.in: Regenerate.
* testsuite/util/testsuite_container_traits.h (traits_base):
Add has_erase_after and hash_insert_after typedefs.
(traits<forward_list<>>): Adjust.
* testsuite/util/exception/safety.h (erase_point, erase_range,
insert_point): Deal correctly with forward_list.
* include/Makefile.am: Add.
2010-09-29 François Dumont <francois.cppdevs@free.fr>
* src/debug.cc: Add forward_list specific debug messages.
* include/debug/forward_list: New.
* include/debug/formatter.h: Add debug message ids and before begin
iterator state.
* include/debug/macros.h (__glibcxx_check_insert_after,
__glibcxx_check_insert_range_after, __glibcxx_check_erase_after,
__glibcxx_check_erase_range_after): Add.
* include/debug/safe_iterator.h (_BeforeBeginHelper): Add.
(_Safe_iterator<>::_M_before_dereferenceable,
_Safe_iterator<>::_M_is_before_begin): Add.
(_Safe_iterator<>::_M_dereferenceable, _Safe_iterator<>::_M_is_end,
_Safe_iterator<>::_M_incrementable): Adjust.
* include/std/forward_list: Include debug/forward when _GLIBCXX_DEBUG
defined.
* include/bits/forward_list.h, forward_list.tcc: Put in std::__norm
when debug mode is active.
* testsuite/23_containers/forward_list/capacity/1.cc: Fix to compile
even in debug mode.
* testsuite/23_containers/forward_list/debug/erase_after1.cc,
erase_after2.cc, erase_after3.cc, erase_after4.cc, erase_after5.cc,
insert_after1.cc,erase_after6.cc, erase_after7.cc, insert_after2.cc,
erase_after8.cc, insert_after3.cc, erase_after9.cc: New.
From-SVN: r164717
2010-09-29 11:56:34 +00:00
|
|
|
* the iterator be nonsingular, either dereferenceable or past-the-end,
|
|
|
|
* and that it reference the sequence we are inserting into. Note that
|
|
|
|
* this macro is only valid when the container is a_Safe_sequence and
|
|
|
|
* the iterator is a _Safe_iterator.
|
2005-05-27 15:01:45 +00:00
|
|
|
*/
|
|
|
|
#define __glibcxx_check_insert(_Position) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(!_Position._M_singular(), \
|
2013-08-01 19:54:46 +00:00
|
|
|
_M_message(__gnu_debug::__msg_insert_singular) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_Position, #_Position)); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
|
2013-08-01 19:54:46 +00:00
|
|
|
_M_message(__gnu_debug::__msg_insert_different) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_Position, #_Position))
|
|
|
|
|
[multiple changes]
2010-09-29 Paolo Carlini <paolo.carlini@oracle.com>
* include/Makefile.am: Add debug/forward_list.
* include/Makefile.in: Regenerate.
* testsuite/util/testsuite_container_traits.h (traits_base):
Add has_erase_after and hash_insert_after typedefs.
(traits<forward_list<>>): Adjust.
* testsuite/util/exception/safety.h (erase_point, erase_range,
insert_point): Deal correctly with forward_list.
* include/Makefile.am: Add.
2010-09-29 François Dumont <francois.cppdevs@free.fr>
* src/debug.cc: Add forward_list specific debug messages.
* include/debug/forward_list: New.
* include/debug/formatter.h: Add debug message ids and before begin
iterator state.
* include/debug/macros.h (__glibcxx_check_insert_after,
__glibcxx_check_insert_range_after, __glibcxx_check_erase_after,
__glibcxx_check_erase_range_after): Add.
* include/debug/safe_iterator.h (_BeforeBeginHelper): Add.
(_Safe_iterator<>::_M_before_dereferenceable,
_Safe_iterator<>::_M_is_before_begin): Add.
(_Safe_iterator<>::_M_dereferenceable, _Safe_iterator<>::_M_is_end,
_Safe_iterator<>::_M_incrementable): Adjust.
* include/std/forward_list: Include debug/forward when _GLIBCXX_DEBUG
defined.
* include/bits/forward_list.h, forward_list.tcc: Put in std::__norm
when debug mode is active.
* testsuite/23_containers/forward_list/capacity/1.cc: Fix to compile
even in debug mode.
* testsuite/23_containers/forward_list/debug/erase_after1.cc,
erase_after2.cc, erase_after3.cc, erase_after4.cc, erase_after5.cc,
insert_after1.cc,erase_after6.cc, erase_after7.cc, insert_after2.cc,
erase_after8.cc, insert_after3.cc, erase_after9.cc: New.
From-SVN: r164717
2010-09-29 11:56:34 +00:00
|
|
|
/** Verify that we can insert into *this after the iterator _Position.
|
|
|
|
* Insertion into a container after a specific position requires that
|
|
|
|
* the iterator be nonsingular, either dereferenceable or before-begin,
|
|
|
|
* and that it reference the sequence we are inserting into. Note that
|
|
|
|
* this macro is only valid when the container is a_Safe_sequence and
|
|
|
|
* the iterator is a _Safe_iterator.
|
|
|
|
*/
|
|
|
|
#define __glibcxx_check_insert_after(_Position) \
|
|
|
|
__glibcxx_check_insert(_Position); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(!_Position._M_is_end(), \
|
|
|
|
_M_message(__gnu_debug::__msg_insert_after_end) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_Position, #_Position))
|
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
/** Verify that we can insert the values in the iterator range
|
|
|
|
* [_First, _Last) into *this with the iterator _Position. Insertion
|
|
|
|
* into a container at a specific position requires that the iterator
|
|
|
|
* be nonsingular (i.e., either dereferenceable or past-the-end),
|
|
|
|
* that it reference the sequence we are inserting into, and that the
|
2014-03-21 18:54:06 +00:00
|
|
|
* iterator range [_First, _Last) is a valid (possibly empty)
|
|
|
|
* range which does not reference the sequence we are inserting into.
|
|
|
|
* Note that this macro is only valid when the container is a
|
2013-08-01 19:54:46 +00:00
|
|
|
* _Safe_sequence and the _Position iterator is a _Safe_iterator.
|
2005-05-27 15:01:45 +00:00
|
|
|
*/
|
stl_iterator_base_types.h (_Iter_base): Limit definition to pre-C++11 mode.
2015-06-29 François Dumont <fdumont@gcc.gnu.org>
* include/bits/stl_iterator_base_types.h (_Iter_base): Limit definition
to pre-C++11 mode.
* include/debug/functions.h
(__gnu_debug::__valid_range, __gnu_debug::__base): Move...
* include/debug/safe_iterator.h
(__gnu_debug::_Sequence_traits): New.
(__gnu_debug::__get_distance_from_begin): New.
(__gnu_debug::__get_distance_to_end): New.
(__gnu_debug::_Safe_iterator<>::_M_valid_range): Expose iterator range
distance information. Add optional check_dereferenceable parameter,
default true.
(__gnu_debug::_Distance_precision, __gnu_debug::__get_distance): Move
default definition...
(__gnu_debug::__get_distance): New overload for _Safe_iterator.
(__gnu_debug::__unsafe): Likewise.
* include/debug/helper_functions.h: ...here. New.
(__gnu_debug::__unsafe): New helper function to remove safe iterator
layer.
* include/debug/stl_iterator.h: New. Include latter.
* include/bits/stl_iterator.h: Include latter in debug mode.
* include/debug/stl_iterator.tcc: Adapt.
* include/debug/safe_local_iterator.h (__gnu_debug::__get_distance): Add
overload for _Safe_local_iterator.
(__gnu_debug::__unsafe): Likewise.
* include/debug/safe_local_iterator.tcc: Adapt.
* include/debug/macros.h (__glibcxx_check_valid_range2): New.
(__glibcxx_check_insert_range): Add _Dist parameter.
(__glibcxx_check_insert_range_after): Likewise.
(__glibcxx_check_string, __glibcxx_check_string_len): Implement using
_GLIBCXX_DEBUG_PEDASSERT.
* include/debug/deque (deque<>::assign): Remove iterator debug layer
when possible.
(deque<>::insert): Likewise.
* include/debug/forward_list (__glibcxx_check_valid_fl_range): New.
(forward_list<>::splice_after): Use latter.
(forward_list<>::assign): Remove iterator debug layer when possible.
(forward_list<>::insert_after): Likewise.
(__gnu_debug::_Sequence_traits<>): Partial specialization.
* include/debug/list (list<>::assign): Remove iterator debug layer when
possible.
(list<>::insert): Likewise.
[__gnu_debug::_Sequence_traits<>]: Partial specialization pre C++11 ABI.
* include/debug/map.h (map<>::insert): Remove iterator debug layer when
possible.
* include/debug/multimap.h (multimap<>::insert): Likewise.
* include/debug/set.h (set<>::insert): Likewise.
* include/debug/multiset.h (multiset<>::insert): Likewise.
* include/debug/string (basic_string<>::append, basic_string<>::assign,
basic_string<>::insert, basic_string<>::replace): Likewise.
* include/debug/unordered_map
(unordered_map<>::insert, unordered_multimap<>::insert): Likewise.
* include/debug/unordered_set
(unordered_set<>::insert, unordered_multiset<>insert): Likewise.
* include/debug/vector
(vector<>::assign, vector<>::insert): Likewise.
* include/Makefile.am: Add new debug headers.
* include/Makefile.in: Regenerate.
From-SVN: r225143
2015-06-29 20:17:56 +00:00
|
|
|
#define __glibcxx_check_insert_range(_Position,_First,_Last,_Dist) \
|
|
|
|
__glibcxx_check_valid_range2(_First,_Last,_Dist); \
|
2013-08-01 19:54:46 +00:00
|
|
|
__glibcxx_check_insert(_Position); \
|
2014-03-21 18:54:06 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__foreign_iterator(_Position,_First,_Last),\
|
2013-08-01 19:54:46 +00:00
|
|
|
_M_message(__gnu_debug::__msg_insert_range_from_self)\
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last) \
|
|
|
|
._M_sequence(*this, "this"))
|
[multiple changes]
2010-09-29 Paolo Carlini <paolo.carlini@oracle.com>
* include/Makefile.am: Add debug/forward_list.
* include/Makefile.in: Regenerate.
* testsuite/util/testsuite_container_traits.h (traits_base):
Add has_erase_after and hash_insert_after typedefs.
(traits<forward_list<>>): Adjust.
* testsuite/util/exception/safety.h (erase_point, erase_range,
insert_point): Deal correctly with forward_list.
* include/Makefile.am: Add.
2010-09-29 François Dumont <francois.cppdevs@free.fr>
* src/debug.cc: Add forward_list specific debug messages.
* include/debug/forward_list: New.
* include/debug/formatter.h: Add debug message ids and before begin
iterator state.
* include/debug/macros.h (__glibcxx_check_insert_after,
__glibcxx_check_insert_range_after, __glibcxx_check_erase_after,
__glibcxx_check_erase_range_after): Add.
* include/debug/safe_iterator.h (_BeforeBeginHelper): Add.
(_Safe_iterator<>::_M_before_dereferenceable,
_Safe_iterator<>::_M_is_before_begin): Add.
(_Safe_iterator<>::_M_dereferenceable, _Safe_iterator<>::_M_is_end,
_Safe_iterator<>::_M_incrementable): Adjust.
* include/std/forward_list: Include debug/forward when _GLIBCXX_DEBUG
defined.
* include/bits/forward_list.h, forward_list.tcc: Put in std::__norm
when debug mode is active.
* testsuite/23_containers/forward_list/capacity/1.cc: Fix to compile
even in debug mode.
* testsuite/23_containers/forward_list/debug/erase_after1.cc,
erase_after2.cc, erase_after3.cc, erase_after4.cc, erase_after5.cc,
insert_after1.cc,erase_after6.cc, erase_after7.cc, insert_after2.cc,
erase_after8.cc, insert_after3.cc, erase_after9.cc: New.
From-SVN: r164717
2010-09-29 11:56:34 +00:00
|
|
|
|
|
|
|
/** Verify that we can insert the values in the iterator range
|
|
|
|
* [_First, _Last) into *this after the iterator _Position. Insertion
|
|
|
|
* into a container after a specific position requires that the iterator
|
|
|
|
* be nonsingular (i.e., either dereferenceable or past-the-end),
|
|
|
|
* that it reference the sequence we are inserting into, and that the
|
2014-03-21 18:54:06 +00:00
|
|
|
* iterator range [_First, _Last) is a valid (possibly empty)
|
|
|
|
* range which does not reference the sequence we are inserting into.
|
|
|
|
* Note that this macro is only valid when the container is a
|
|
|
|
* _Safe_sequence and the _Position iterator is a _Safe_iterator.
|
[multiple changes]
2010-09-29 Paolo Carlini <paolo.carlini@oracle.com>
* include/Makefile.am: Add debug/forward_list.
* include/Makefile.in: Regenerate.
* testsuite/util/testsuite_container_traits.h (traits_base):
Add has_erase_after and hash_insert_after typedefs.
(traits<forward_list<>>): Adjust.
* testsuite/util/exception/safety.h (erase_point, erase_range,
insert_point): Deal correctly with forward_list.
* include/Makefile.am: Add.
2010-09-29 François Dumont <francois.cppdevs@free.fr>
* src/debug.cc: Add forward_list specific debug messages.
* include/debug/forward_list: New.
* include/debug/formatter.h: Add debug message ids and before begin
iterator state.
* include/debug/macros.h (__glibcxx_check_insert_after,
__glibcxx_check_insert_range_after, __glibcxx_check_erase_after,
__glibcxx_check_erase_range_after): Add.
* include/debug/safe_iterator.h (_BeforeBeginHelper): Add.
(_Safe_iterator<>::_M_before_dereferenceable,
_Safe_iterator<>::_M_is_before_begin): Add.
(_Safe_iterator<>::_M_dereferenceable, _Safe_iterator<>::_M_is_end,
_Safe_iterator<>::_M_incrementable): Adjust.
* include/std/forward_list: Include debug/forward when _GLIBCXX_DEBUG
defined.
* include/bits/forward_list.h, forward_list.tcc: Put in std::__norm
when debug mode is active.
* testsuite/23_containers/forward_list/capacity/1.cc: Fix to compile
even in debug mode.
* testsuite/23_containers/forward_list/debug/erase_after1.cc,
erase_after2.cc, erase_after3.cc, erase_after4.cc, erase_after5.cc,
insert_after1.cc,erase_after6.cc, erase_after7.cc, insert_after2.cc,
erase_after8.cc, insert_after3.cc, erase_after9.cc: New.
From-SVN: r164717
2010-09-29 11:56:34 +00:00
|
|
|
*/
|
stl_iterator_base_types.h (_Iter_base): Limit definition to pre-C++11 mode.
2015-06-29 François Dumont <fdumont@gcc.gnu.org>
* include/bits/stl_iterator_base_types.h (_Iter_base): Limit definition
to pre-C++11 mode.
* include/debug/functions.h
(__gnu_debug::__valid_range, __gnu_debug::__base): Move...
* include/debug/safe_iterator.h
(__gnu_debug::_Sequence_traits): New.
(__gnu_debug::__get_distance_from_begin): New.
(__gnu_debug::__get_distance_to_end): New.
(__gnu_debug::_Safe_iterator<>::_M_valid_range): Expose iterator range
distance information. Add optional check_dereferenceable parameter,
default true.
(__gnu_debug::_Distance_precision, __gnu_debug::__get_distance): Move
default definition...
(__gnu_debug::__get_distance): New overload for _Safe_iterator.
(__gnu_debug::__unsafe): Likewise.
* include/debug/helper_functions.h: ...here. New.
(__gnu_debug::__unsafe): New helper function to remove safe iterator
layer.
* include/debug/stl_iterator.h: New. Include latter.
* include/bits/stl_iterator.h: Include latter in debug mode.
* include/debug/stl_iterator.tcc: Adapt.
* include/debug/safe_local_iterator.h (__gnu_debug::__get_distance): Add
overload for _Safe_local_iterator.
(__gnu_debug::__unsafe): Likewise.
* include/debug/safe_local_iterator.tcc: Adapt.
* include/debug/macros.h (__glibcxx_check_valid_range2): New.
(__glibcxx_check_insert_range): Add _Dist parameter.
(__glibcxx_check_insert_range_after): Likewise.
(__glibcxx_check_string, __glibcxx_check_string_len): Implement using
_GLIBCXX_DEBUG_PEDASSERT.
* include/debug/deque (deque<>::assign): Remove iterator debug layer
when possible.
(deque<>::insert): Likewise.
* include/debug/forward_list (__glibcxx_check_valid_fl_range): New.
(forward_list<>::splice_after): Use latter.
(forward_list<>::assign): Remove iterator debug layer when possible.
(forward_list<>::insert_after): Likewise.
(__gnu_debug::_Sequence_traits<>): Partial specialization.
* include/debug/list (list<>::assign): Remove iterator debug layer when
possible.
(list<>::insert): Likewise.
[__gnu_debug::_Sequence_traits<>]: Partial specialization pre C++11 ABI.
* include/debug/map.h (map<>::insert): Remove iterator debug layer when
possible.
* include/debug/multimap.h (multimap<>::insert): Likewise.
* include/debug/set.h (set<>::insert): Likewise.
* include/debug/multiset.h (multiset<>::insert): Likewise.
* include/debug/string (basic_string<>::append, basic_string<>::assign,
basic_string<>::insert, basic_string<>::replace): Likewise.
* include/debug/unordered_map
(unordered_map<>::insert, unordered_multimap<>::insert): Likewise.
* include/debug/unordered_set
(unordered_set<>::insert, unordered_multiset<>insert): Likewise.
* include/debug/vector
(vector<>::assign, vector<>::insert): Likewise.
* include/Makefile.am: Add new debug headers.
* include/Makefile.in: Regenerate.
From-SVN: r225143
2015-06-29 20:17:56 +00:00
|
|
|
#define __glibcxx_check_insert_range_after(_Position,_First,_Last,_Dist)\
|
2018-06-12 20:18:35 +00:00
|
|
|
__glibcxx_check_valid_range2(_First,_Last,_Dist); \
|
2014-03-21 18:54:06 +00:00
|
|
|
__glibcxx_check_insert_after(_Position); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__foreign_iterator(_Position,_First,_Last),\
|
2013-08-01 19:54:46 +00:00
|
|
|
_M_message(__gnu_debug::__msg_insert_range_from_self)\
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last) \
|
|
|
|
._M_sequence(*this, "this"))
|
2005-05-27 15:01:45 +00:00
|
|
|
|
|
|
|
/** Verify that we can erase the element referenced by the iterator
|
|
|
|
* _Position. We can erase the element if the _Position iterator is
|
|
|
|
* dereferenceable and references this sequence.
|
|
|
|
*/
|
|
|
|
#define __glibcxx_check_erase(_Position) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_Position._M_dereferenceable(), \
|
2021-11-16 21:51:11 +01:00
|
|
|
_M_message(__gnu_debug::__msg_erase_bad) \
|
|
|
|
._M_sequence(*this, "this") \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_iterator(_Position, #_Position)); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
|
2006-02-22 00:57:24 +00:00
|
|
|
_M_message(__gnu_debug::__msg_erase_different) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_Position, #_Position))
|
|
|
|
|
2021-11-16 21:51:11 +01:00
|
|
|
#if __cplusplus >= 201103L
|
|
|
|
# define __glibcxx_check_erase2(_CPosition) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_CPosition != _M_base().cend(), \
|
|
|
|
_M_message(__gnu_debug::__msg_erase_bad) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_CPosition, #_CPosition));
|
|
|
|
#endif
|
|
|
|
|
[multiple changes]
2010-09-29 Paolo Carlini <paolo.carlini@oracle.com>
* include/Makefile.am: Add debug/forward_list.
* include/Makefile.in: Regenerate.
* testsuite/util/testsuite_container_traits.h (traits_base):
Add has_erase_after and hash_insert_after typedefs.
(traits<forward_list<>>): Adjust.
* testsuite/util/exception/safety.h (erase_point, erase_range,
insert_point): Deal correctly with forward_list.
* include/Makefile.am: Add.
2010-09-29 François Dumont <francois.cppdevs@free.fr>
* src/debug.cc: Add forward_list specific debug messages.
* include/debug/forward_list: New.
* include/debug/formatter.h: Add debug message ids and before begin
iterator state.
* include/debug/macros.h (__glibcxx_check_insert_after,
__glibcxx_check_insert_range_after, __glibcxx_check_erase_after,
__glibcxx_check_erase_range_after): Add.
* include/debug/safe_iterator.h (_BeforeBeginHelper): Add.
(_Safe_iterator<>::_M_before_dereferenceable,
_Safe_iterator<>::_M_is_before_begin): Add.
(_Safe_iterator<>::_M_dereferenceable, _Safe_iterator<>::_M_is_end,
_Safe_iterator<>::_M_incrementable): Adjust.
* include/std/forward_list: Include debug/forward when _GLIBCXX_DEBUG
defined.
* include/bits/forward_list.h, forward_list.tcc: Put in std::__norm
when debug mode is active.
* testsuite/23_containers/forward_list/capacity/1.cc: Fix to compile
even in debug mode.
* testsuite/23_containers/forward_list/debug/erase_after1.cc,
erase_after2.cc, erase_after3.cc, erase_after4.cc, erase_after5.cc,
insert_after1.cc,erase_after6.cc, erase_after7.cc, insert_after2.cc,
erase_after8.cc, insert_after3.cc, erase_after9.cc: New.
From-SVN: r164717
2010-09-29 11:56:34 +00:00
|
|
|
/** Verify that we can erase the element after the iterator
|
|
|
|
* _Position. We can erase the element if the _Position iterator is
|
|
|
|
* before a dereferenceable one and references this sequence.
|
|
|
|
*/
|
|
|
|
#define __glibcxx_check_erase_after(_Position) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_Position._M_before_dereferenceable(), \
|
|
|
|
_M_message(__gnu_debug::__msg_erase_after_bad) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_Position, #_Position)); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
|
|
|
|
_M_message(__gnu_debug::__msg_erase_different) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_Position, #_Position))
|
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
/** Verify that we can erase the elements in the iterator range
|
|
|
|
* [_First, _Last). We can erase the elements if [_First, _Last) is a
|
|
|
|
* valid iterator range within this sequence.
|
|
|
|
*/
|
|
|
|
#define __glibcxx_check_erase_range(_First,_Last) \
|
|
|
|
__glibcxx_check_valid_range(_First,_Last); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First._M_attached_to(this), \
|
2006-02-22 00:57:24 +00:00
|
|
|
_M_message(__gnu_debug::__msg_erase_different) \
|
2021-11-16 21:51:11 +01:00
|
|
|
._M_sequence(*this, "this") \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last))
|
|
|
|
|
[multiple changes]
2010-09-29 Paolo Carlini <paolo.carlini@oracle.com>
* include/Makefile.am: Add debug/forward_list.
* include/Makefile.in: Regenerate.
* testsuite/util/testsuite_container_traits.h (traits_base):
Add has_erase_after and hash_insert_after typedefs.
(traits<forward_list<>>): Adjust.
* testsuite/util/exception/safety.h (erase_point, erase_range,
insert_point): Deal correctly with forward_list.
* include/Makefile.am: Add.
2010-09-29 François Dumont <francois.cppdevs@free.fr>
* src/debug.cc: Add forward_list specific debug messages.
* include/debug/forward_list: New.
* include/debug/formatter.h: Add debug message ids and before begin
iterator state.
* include/debug/macros.h (__glibcxx_check_insert_after,
__glibcxx_check_insert_range_after, __glibcxx_check_erase_after,
__glibcxx_check_erase_range_after): Add.
* include/debug/safe_iterator.h (_BeforeBeginHelper): Add.
(_Safe_iterator<>::_M_before_dereferenceable,
_Safe_iterator<>::_M_is_before_begin): Add.
(_Safe_iterator<>::_M_dereferenceable, _Safe_iterator<>::_M_is_end,
_Safe_iterator<>::_M_incrementable): Adjust.
* include/std/forward_list: Include debug/forward when _GLIBCXX_DEBUG
defined.
* include/bits/forward_list.h, forward_list.tcc: Put in std::__norm
when debug mode is active.
* testsuite/23_containers/forward_list/capacity/1.cc: Fix to compile
even in debug mode.
* testsuite/23_containers/forward_list/debug/erase_after1.cc,
erase_after2.cc, erase_after3.cc, erase_after4.cc, erase_after5.cc,
insert_after1.cc,erase_after6.cc, erase_after7.cc, insert_after2.cc,
erase_after8.cc, insert_after3.cc, erase_after9.cc: New.
From-SVN: r164717
2010-09-29 11:56:34 +00:00
|
|
|
/** Verify that we can erase the elements in the iterator range
|
|
|
|
* (_First, _Last). We can erase the elements if (_First, _Last) is a
|
|
|
|
* valid iterator range within this sequence.
|
|
|
|
*/
|
|
|
|
#define __glibcxx_check_erase_range_after(_First,_Last) \
|
2021-01-01 17:35:56 +01:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(!_First._M_singular() && !_Last._M_singular(), \
|
|
|
|
_M_message(__gnu_debug::__msg_erase_different) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last)); \
|
[multiple changes]
2010-09-29 Paolo Carlini <paolo.carlini@oracle.com>
* include/Makefile.am: Add debug/forward_list.
* include/Makefile.in: Regenerate.
* testsuite/util/testsuite_container_traits.h (traits_base):
Add has_erase_after and hash_insert_after typedefs.
(traits<forward_list<>>): Adjust.
* testsuite/util/exception/safety.h (erase_point, erase_range,
insert_point): Deal correctly with forward_list.
* include/Makefile.am: Add.
2010-09-29 François Dumont <francois.cppdevs@free.fr>
* src/debug.cc: Add forward_list specific debug messages.
* include/debug/forward_list: New.
* include/debug/formatter.h: Add debug message ids and before begin
iterator state.
* include/debug/macros.h (__glibcxx_check_insert_after,
__glibcxx_check_insert_range_after, __glibcxx_check_erase_after,
__glibcxx_check_erase_range_after): Add.
* include/debug/safe_iterator.h (_BeforeBeginHelper): Add.
(_Safe_iterator<>::_M_before_dereferenceable,
_Safe_iterator<>::_M_is_before_begin): Add.
(_Safe_iterator<>::_M_dereferenceable, _Safe_iterator<>::_M_is_end,
_Safe_iterator<>::_M_incrementable): Adjust.
* include/std/forward_list: Include debug/forward when _GLIBCXX_DEBUG
defined.
* include/bits/forward_list.h, forward_list.tcc: Put in std::__norm
when debug mode is active.
* testsuite/23_containers/forward_list/capacity/1.cc: Fix to compile
even in debug mode.
* testsuite/23_containers/forward_list/debug/erase_after1.cc,
erase_after2.cc, erase_after3.cc, erase_after4.cc, erase_after5.cc,
insert_after1.cc,erase_after6.cc, erase_after7.cc, insert_after2.cc,
erase_after8.cc, insert_after3.cc, erase_after9.cc: New.
From-SVN: r164717
2010-09-29 11:56:34 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First._M_can_compare(_Last), \
|
|
|
|
_M_message(__gnu_debug::__msg_erase_different) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last)); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First._M_attached_to(this), \
|
|
|
|
_M_message(__gnu_debug::__msg_erase_different) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_First, #_First)); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First != _Last, \
|
|
|
|
_M_message(__gnu_debug::__msg_valid_range2) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last)); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First._M_incrementable(), \
|
|
|
|
_M_message(__gnu_debug::__msg_valid_range2) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last)); \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(!_Last._M_is_before_begin(), \
|
|
|
|
_M_message(__gnu_debug::__msg_valid_range2) \
|
|
|
|
._M_sequence(*this, "this") \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last)) \
|
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
// Verify that the subscript _N is less than the container's size.
|
|
|
|
#define __glibcxx_check_subscript(_N) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_N < this->size(), \
|
2012-10-16 19:57:03 +00:00
|
|
|
_M_message(__gnu_debug::__msg_subscript_oob) \
|
2021-11-16 21:51:11 +01:00
|
|
|
._M_sequence(*this, "this") \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_integer(_N, #_N) \
|
|
|
|
._M_integer(this->size(), "size"))
|
|
|
|
|
2012-10-16 19:57:03 +00:00
|
|
|
// Verify that the bucket _N is less than the container's buckets count.
|
|
|
|
#define __glibcxx_check_bucket_index(_N) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_N < this->bucket_count(), \
|
|
|
|
_M_message(__gnu_debug::__msg_bucket_index_oob) \
|
2021-11-16 21:51:11 +01:00
|
|
|
._M_sequence(*this, "this") \
|
2012-10-16 19:57:03 +00:00
|
|
|
._M_integer(_N, #_N) \
|
|
|
|
._M_integer(this->bucket_count(), "size"))
|
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
// Verify that the container is nonempty
|
|
|
|
#define __glibcxx_check_nonempty() \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(! this->empty(), \
|
2021-11-16 21:51:11 +01:00
|
|
|
_M_message(__gnu_debug::__msg_empty) \
|
|
|
|
._M_sequence(*this, "this"))
|
2005-05-27 15:01:45 +00:00
|
|
|
|
stl_algo.h (merge): Fix documentation.
2019-09-28 François Dumont <fdumont@gcc.gnu.org>
* include/bits/stl_algo.h (merge): Fix documentation.
* include/debug/functions.h (__check_sorted_aux): Add C++20 constexpr.
(__check_sorted): Likewise and remove nested irreflexive check.
(__check_sorted_set_aux, __check_sorted_set): Add C++20 constexpr.
(__check_partitioned_lower, __check_partitioned_upper): Likewise.
(_Irreflexive_checker::_S_is_valid): Likewise.
(__is_irreflexive, __is_irreflexive_pred): Likewise.
* include/debug/helper_functions.h (__get_distance): Add constexpr.
(__valid_range_aux): Add C++20 constexpr.
(__valid_range(_Iter, _Iter, _Distance_traits<_Iter>::__type&)):
Likewise and add std::is_constant_evaluated check.
(__valid_range_aux(_Iter, _Iter, std::input_iterator_tag)): New.
(__valid_range_aux(_Iter, _Iter, std::random_accss_iterator_tag)): New.
(__valid_range_aux(_Integral, _Integral, std::__true_type)): New,
use latter.
(__valid_range(_Iter, _Iter)): Adapt to use latter, add constexpr and
__builtin_is_contant_evaludated check..
(__can_advance, __base): Add constexpr.
* include/debug/macros.h [_GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED]
(_GLIBCXX_DEBUG_VERIFY_COND_AT): New.
(__glibcxx_check_sorted): Use __glibcxx_check_irreflexive.
(__glibcxx_check_sorted_pred): Use __glibcxx_check_irreflexive_pred.
* testsuite/25_algorithms/binary_search/constexpr.cc: Use irreflexive
std::less.
* testsuite/25_algorithms/is_sorted/constexpr.cc: Likewise.
* testsuite/25_algorithms/merge/constexpr.cc: Fix order in camm. Fix
lambda to be irreflexive.
From-SVN: r276260
2019-09-28 21:11:55 +00:00
|
|
|
// Verify that a predicate is irreflexive
|
|
|
|
#define __glibcxx_check_irreflexive(_First,_Last) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First == _Last || !(*_First < *_First), \
|
|
|
|
_M_message(__gnu_debug::__msg_irreflexive_ordering) \
|
|
|
|
._M_iterator_value_type(_First, "< operator type"))
|
|
|
|
|
|
|
|
#if __cplusplus >= 201103L
|
|
|
|
# define __glibcxx_check_irreflexive2(_First,_Last) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First == _Last \
|
|
|
|
|| __gnu_debug::__is_irreflexive(_First), \
|
|
|
|
_M_message(__gnu_debug::__msg_irreflexive_ordering) \
|
|
|
|
._M_iterator_value_type(_First, "< operator type"))
|
|
|
|
#else
|
|
|
|
# define __glibcxx_check_irreflexive2(_First,_Last)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define __glibcxx_check_irreflexive_pred(_First,_Last,_Pred) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First == _Last || !_Pred(*_First, *_First), \
|
|
|
|
_M_message(__gnu_debug::__msg_irreflexive_ordering) \
|
|
|
|
._M_instance(_Pred, "functor") \
|
|
|
|
._M_iterator_value_type(_First, "ordered type"))
|
|
|
|
|
|
|
|
#if __cplusplus >= 201103L
|
|
|
|
# define __glibcxx_check_irreflexive_pred2(_First,_Last,_Pred) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_First == _Last \
|
|
|
|
||__gnu_debug::__is_irreflexive_pred(_First, _Pred), \
|
|
|
|
_M_message(__gnu_debug::__msg_irreflexive_ordering) \
|
|
|
|
._M_instance(_Pred, "functor") \
|
|
|
|
._M_iterator_value_type(_First, "ordered type"))
|
|
|
|
#else
|
|
|
|
# define __glibcxx_check_irreflexive_pred2(_First,_Last,_Pred)
|
|
|
|
#endif
|
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
// Verify that the iterator range [_First, _Last) is sorted
|
|
|
|
#define __glibcxx_check_sorted(_First,_Last) \
|
|
|
|
__glibcxx_check_valid_range(_First,_Last); \
|
stl_algo.h (merge): Fix documentation.
2019-09-28 François Dumont <fdumont@gcc.gnu.org>
* include/bits/stl_algo.h (merge): Fix documentation.
* include/debug/functions.h (__check_sorted_aux): Add C++20 constexpr.
(__check_sorted): Likewise and remove nested irreflexive check.
(__check_sorted_set_aux, __check_sorted_set): Add C++20 constexpr.
(__check_partitioned_lower, __check_partitioned_upper): Likewise.
(_Irreflexive_checker::_S_is_valid): Likewise.
(__is_irreflexive, __is_irreflexive_pred): Likewise.
* include/debug/helper_functions.h (__get_distance): Add constexpr.
(__valid_range_aux): Add C++20 constexpr.
(__valid_range(_Iter, _Iter, _Distance_traits<_Iter>::__type&)):
Likewise and add std::is_constant_evaluated check.
(__valid_range_aux(_Iter, _Iter, std::input_iterator_tag)): New.
(__valid_range_aux(_Iter, _Iter, std::random_accss_iterator_tag)): New.
(__valid_range_aux(_Integral, _Integral, std::__true_type)): New,
use latter.
(__valid_range(_Iter, _Iter)): Adapt to use latter, add constexpr and
__builtin_is_contant_evaludated check..
(__can_advance, __base): Add constexpr.
* include/debug/macros.h [_GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED]
(_GLIBCXX_DEBUG_VERIFY_COND_AT): New.
(__glibcxx_check_sorted): Use __glibcxx_check_irreflexive.
(__glibcxx_check_sorted_pred): Use __glibcxx_check_irreflexive_pred.
* testsuite/25_algorithms/binary_search/constexpr.cc: Use irreflexive
std::less.
* testsuite/25_algorithms/is_sorted/constexpr.cc: Likewise.
* testsuite/25_algorithms/merge/constexpr.cc: Fix order in camm. Fix
lambda to be irreflexive.
From-SVN: r276260
2019-09-28 21:11:55 +00:00
|
|
|
__glibcxx_check_irreflexive(_First,_Last); \
|
2013-08-30 20:16:03 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_sorted( \
|
|
|
|
__gnu_debug::__base(_First), \
|
|
|
|
__gnu_debug::__base(_Last)), \
|
2021-11-16 21:51:11 +01:00
|
|
|
_M_message(__gnu_debug::__msg_unsorted) \
|
|
|
|
._M_iterator(_First, #_First) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_iterator(_Last, #_Last))
|
|
|
|
|
|
|
|
/** Verify that the iterator range [_First, _Last) is sorted by the
|
|
|
|
predicate _Pred. */
|
|
|
|
#define __glibcxx_check_sorted_pred(_First,_Last,_Pred) \
|
|
|
|
__glibcxx_check_valid_range(_First,_Last); \
|
stl_algo.h (merge): Fix documentation.
2019-09-28 François Dumont <fdumont@gcc.gnu.org>
* include/bits/stl_algo.h (merge): Fix documentation.
* include/debug/functions.h (__check_sorted_aux): Add C++20 constexpr.
(__check_sorted): Likewise and remove nested irreflexive check.
(__check_sorted_set_aux, __check_sorted_set): Add C++20 constexpr.
(__check_partitioned_lower, __check_partitioned_upper): Likewise.
(_Irreflexive_checker::_S_is_valid): Likewise.
(__is_irreflexive, __is_irreflexive_pred): Likewise.
* include/debug/helper_functions.h (__get_distance): Add constexpr.
(__valid_range_aux): Add C++20 constexpr.
(__valid_range(_Iter, _Iter, _Distance_traits<_Iter>::__type&)):
Likewise and add std::is_constant_evaluated check.
(__valid_range_aux(_Iter, _Iter, std::input_iterator_tag)): New.
(__valid_range_aux(_Iter, _Iter, std::random_accss_iterator_tag)): New.
(__valid_range_aux(_Integral, _Integral, std::__true_type)): New,
use latter.
(__valid_range(_Iter, _Iter)): Adapt to use latter, add constexpr and
__builtin_is_contant_evaludated check..
(__can_advance, __base): Add constexpr.
* include/debug/macros.h [_GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED]
(_GLIBCXX_DEBUG_VERIFY_COND_AT): New.
(__glibcxx_check_sorted): Use __glibcxx_check_irreflexive.
(__glibcxx_check_sorted_pred): Use __glibcxx_check_irreflexive_pred.
* testsuite/25_algorithms/binary_search/constexpr.cc: Use irreflexive
std::less.
* testsuite/25_algorithms/is_sorted/constexpr.cc: Likewise.
* testsuite/25_algorithms/merge/constexpr.cc: Fix order in camm. Fix
lambda to be irreflexive.
From-SVN: r276260
2019-09-28 21:11:55 +00:00
|
|
|
__glibcxx_check_irreflexive_pred(_First,_Last,_Pred); \
|
2013-08-30 20:16:03 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_sorted( \
|
|
|
|
__gnu_debug::__base(_First), \
|
|
|
|
__gnu_debug::__base(_Last), _Pred), \
|
2006-02-22 00:57:24 +00:00
|
|
|
_M_message(__gnu_debug::__msg_unsorted_pred) \
|
2021-11-16 21:51:11 +01:00
|
|
|
._M_iterator(_First, #_First) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_iterator(_Last, #_Last) \
|
|
|
|
._M_string(#_Pred))
|
|
|
|
|
re PR libstdc++/34730 (Legal program doesn't compile with -D_GLIBCXX_DEBUG)
2008-01-12 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/34730
* include/debug/functions.h (__check_sorted_set,
__check_sorted_set_aux): Add.
(__check_sorted): Check StrictWeakOrdering.
* include/debug/macros.h (__glibcxx_check_strict_weak_ordering,
__glibcxx_check_strict_weak_ordering_pred): Remove.
(__glibcxx_check_sorted, __glibcxx_check_sorted_pred): Adjust.
(__glibcxx_check_sorted_set, __glibcxx_check_sorted_set_pred): Add.
* include/debug/debug.h (__glibcxx_requires_sorted_set,
__glibcxx_requires_sorted_set_pred): Add.
* include/bits/stl_algo.h (merge, includes, set_union,
set_intersection, set_difference, set_symmetric_difference):
Adjust, use __glibcxx_requires_sorted_set* instead.
* testsuite/25_algorithms/set_intersection/34730.cc: New.
From-SVN: r131500
2008-01-13 01:34:58 +00:00
|
|
|
// Special variant for std::merge, std::includes, std::set_*
|
|
|
|
#define __glibcxx_check_sorted_set(_First1,_Last1,_First2) \
|
|
|
|
__glibcxx_check_valid_range(_First1,_Last1); \
|
2021-11-16 21:51:11 +01:00
|
|
|
_GLIBCXX_DEBUG_VERIFY( \
|
2013-08-30 20:16:03 +00:00
|
|
|
__gnu_debug::__check_sorted_set(__gnu_debug::__base(_First1), \
|
|
|
|
__gnu_debug::__base(_Last1), _First2),\
|
re PR libstdc++/34730 (Legal program doesn't compile with -D_GLIBCXX_DEBUG)
2008-01-12 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/34730
* include/debug/functions.h (__check_sorted_set,
__check_sorted_set_aux): Add.
(__check_sorted): Check StrictWeakOrdering.
* include/debug/macros.h (__glibcxx_check_strict_weak_ordering,
__glibcxx_check_strict_weak_ordering_pred): Remove.
(__glibcxx_check_sorted, __glibcxx_check_sorted_pred): Adjust.
(__glibcxx_check_sorted_set, __glibcxx_check_sorted_set_pred): Add.
* include/debug/debug.h (__glibcxx_requires_sorted_set,
__glibcxx_requires_sorted_set_pred): Add.
* include/bits/stl_algo.h (merge, includes, set_union,
set_intersection, set_difference, set_symmetric_difference):
Adjust, use __glibcxx_requires_sorted_set* instead.
* testsuite/25_algorithms/set_intersection/34730.cc: New.
From-SVN: r131500
2008-01-13 01:34:58 +00:00
|
|
|
_M_message(__gnu_debug::__msg_unsorted) \
|
|
|
|
._M_iterator(_First1, #_First1) \
|
|
|
|
._M_iterator(_Last1, #_Last1))
|
|
|
|
|
|
|
|
// Likewise with a _Pred.
|
|
|
|
#define __glibcxx_check_sorted_set_pred(_First1,_Last1,_First2,_Pred) \
|
2021-11-16 21:51:11 +01:00
|
|
|
__glibcxx_check_valid_range(_First1,_Last1); \
|
re PR libstdc++/34730 (Legal program doesn't compile with -D_GLIBCXX_DEBUG)
2008-01-12 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/34730
* include/debug/functions.h (__check_sorted_set,
__check_sorted_set_aux): Add.
(__check_sorted): Check StrictWeakOrdering.
* include/debug/macros.h (__glibcxx_check_strict_weak_ordering,
__glibcxx_check_strict_weak_ordering_pred): Remove.
(__glibcxx_check_sorted, __glibcxx_check_sorted_pred): Adjust.
(__glibcxx_check_sorted_set, __glibcxx_check_sorted_set_pred): Add.
* include/debug/debug.h (__glibcxx_requires_sorted_set,
__glibcxx_requires_sorted_set_pred): Add.
* include/bits/stl_algo.h (merge, includes, set_union,
set_intersection, set_difference, set_symmetric_difference):
Adjust, use __glibcxx_requires_sorted_set* instead.
* testsuite/25_algorithms/set_intersection/34730.cc: New.
From-SVN: r131500
2008-01-13 01:34:58 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY( \
|
2013-08-30 20:16:03 +00:00
|
|
|
__gnu_debug::__check_sorted_set(__gnu_debug::__base(_First1), \
|
|
|
|
__gnu_debug::__base(_Last1), \
|
|
|
|
_First2, _Pred), \
|
re PR libstdc++/34730 (Legal program doesn't compile with -D_GLIBCXX_DEBUG)
2008-01-12 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/34730
* include/debug/functions.h (__check_sorted_set,
__check_sorted_set_aux): Add.
(__check_sorted): Check StrictWeakOrdering.
* include/debug/macros.h (__glibcxx_check_strict_weak_ordering,
__glibcxx_check_strict_weak_ordering_pred): Remove.
(__glibcxx_check_sorted, __glibcxx_check_sorted_pred): Adjust.
(__glibcxx_check_sorted_set, __glibcxx_check_sorted_set_pred): Add.
* include/debug/debug.h (__glibcxx_requires_sorted_set,
__glibcxx_requires_sorted_set_pred): Add.
* include/bits/stl_algo.h (merge, includes, set_union,
set_intersection, set_difference, set_symmetric_difference):
Adjust, use __glibcxx_requires_sorted_set* instead.
* testsuite/25_algorithms/set_intersection/34730.cc: New.
From-SVN: r131500
2008-01-13 01:34:58 +00:00
|
|
|
_M_message(__gnu_debug::__msg_unsorted_pred) \
|
|
|
|
._M_iterator(_First1, #_First1) \
|
|
|
|
._M_iterator(_Last1, #_Last1) \
|
|
|
|
._M_string(#_Pred))
|
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
/** Verify that the iterator range [_First, _Last) is partitioned
|
|
|
|
w.r.t. the value _Value. */
|
2007-10-03 00:34:40 +00:00
|
|
|
#define __glibcxx_check_partitioned_lower(_First,_Last,_Value) \
|
2005-05-27 15:01:45 +00:00
|
|
|
__glibcxx_check_valid_range(_First,_Last); \
|
2013-08-30 20:16:03 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower( \
|
|
|
|
__gnu_debug::__base(_First), \
|
|
|
|
__gnu_debug::__base(_Last), _Value), \
|
2006-02-22 00:57:24 +00:00
|
|
|
_M_message(__gnu_debug::__msg_unpartitioned) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last) \
|
|
|
|
._M_string(#_Value))
|
|
|
|
|
2007-10-03 00:34:40 +00:00
|
|
|
#define __glibcxx_check_partitioned_upper(_First,_Last,_Value) \
|
|
|
|
__glibcxx_check_valid_range(_First,_Last); \
|
2013-08-30 20:16:03 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper( \
|
|
|
|
__gnu_debug::__base(_First), \
|
|
|
|
__gnu_debug::__base(_Last), _Value), \
|
2007-10-03 00:34:40 +00:00
|
|
|
_M_message(__gnu_debug::__msg_unpartitioned) \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last) \
|
|
|
|
._M_string(#_Value))
|
|
|
|
|
|
|
|
/** Verify that the iterator range [_First, _Last) is partitioned
|
|
|
|
w.r.t. the value _Value and predicate _Pred. */
|
|
|
|
#define __glibcxx_check_partitioned_lower_pred(_First,_Last,_Value,_Pred) \
|
|
|
|
__glibcxx_check_valid_range(_First,_Last); \
|
2013-08-30 20:16:03 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower( \
|
|
|
|
__gnu_debug::__base(_First), \
|
|
|
|
__gnu_debug::__base(_Last), _Value, _Pred), \
|
2007-10-03 00:34:40 +00:00
|
|
|
_M_message(__gnu_debug::__msg_unpartitioned_pred) \
|
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last) \
|
|
|
|
._M_string(#_Pred) \
|
2021-11-16 21:51:11 +01:00
|
|
|
._M_string(#_Value))
|
2007-10-03 00:34:40 +00:00
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
/** Verify that the iterator range [_First, _Last) is partitioned
|
|
|
|
w.r.t. the value _Value and predicate _Pred. */
|
2007-10-03 00:34:40 +00:00
|
|
|
#define __glibcxx_check_partitioned_upper_pred(_First,_Last,_Value,_Pred) \
|
2005-05-27 15:01:45 +00:00
|
|
|
__glibcxx_check_valid_range(_First,_Last); \
|
2013-08-30 20:16:03 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper( \
|
|
|
|
__gnu_debug::__base(_First), \
|
|
|
|
__gnu_debug::__base(_Last), _Value, _Pred), \
|
2006-02-22 00:57:24 +00:00
|
|
|
_M_message(__gnu_debug::__msg_unpartitioned_pred) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last) \
|
|
|
|
._M_string(#_Pred) \
|
2021-11-16 21:51:11 +01:00
|
|
|
._M_string(#_Value))
|
2005-05-27 15:01:45 +00:00
|
|
|
|
|
|
|
// Verify that the iterator range [_First, _Last) is a heap
|
|
|
|
#define __glibcxx_check_heap(_First,_Last) \
|
2012-05-11 19:21:31 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(std::__is_heap(__gnu_debug::__base(_First), \
|
|
|
|
__gnu_debug::__base(_Last)), \
|
2021-11-16 21:51:11 +01:00
|
|
|
_M_message(__gnu_debug::__msg_not_heap) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_iterator(_First, #_First) \
|
|
|
|
._M_iterator(_Last, #_Last))
|
|
|
|
|
|
|
|
/** Verify that the iterator range [_First, _Last) is a heap
|
|
|
|
w.r.t. the predicate _Pred. */
|
|
|
|
#define __glibcxx_check_heap_pred(_First,_Last,_Pred) \
|
2012-05-11 19:21:31 +00:00
|
|
|
_GLIBCXX_DEBUG_VERIFY(std::__is_heap(__gnu_debug::__base(_First), \
|
|
|
|
__gnu_debug::__base(_Last), \
|
|
|
|
_Pred), \
|
2006-02-22 00:57:24 +00:00
|
|
|
_M_message(__gnu_debug::__msg_not_heap_pred) \
|
2021-11-16 21:51:11 +01:00
|
|
|
._M_iterator(_First, #_First) \
|
2005-05-27 15:01:45 +00:00
|
|
|
._M_iterator(_Last, #_Last) \
|
|
|
|
._M_string(#_Pred))
|
|
|
|
|
2014-03-21 18:54:06 +00:00
|
|
|
// Verify that load factor is positive
|
2012-10-18 19:50:37 +00:00
|
|
|
#define __glibcxx_check_max_load_factor(_F) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_F > 0.0f, \
|
|
|
|
_M_message(__gnu_debug::__msg_valid_load_factor) \
|
2021-11-16 21:51:11 +01:00
|
|
|
._M_sequence(*this, "this"))
|
2012-03-09 10:37:34 +00:00
|
|
|
|
2014-05-06 19:59:44 +00:00
|
|
|
#define __glibcxx_check_equal_allocs(_This, _Other) \
|
|
|
|
_GLIBCXX_DEBUG_VERIFY(_This.get_allocator() == _Other.get_allocator(), \
|
2012-11-05 21:10:27 +00:00
|
|
|
_M_message(__gnu_debug::__msg_equal_allocs) \
|
2014-05-06 19:59:44 +00:00
|
|
|
._M_sequence(_This, "this"))
|
2012-11-05 21:10:27 +00:00
|
|
|
|
2005-05-27 15:01:45 +00:00
|
|
|
#endif
|