Commit Graph

329 Commits

Author SHA1 Message Date
Jonathan Wakely
3cb0c7cc16 libstdc++: Fix function that can't be constexpr in C++11 (PR 95289)
The body of this function isn't just a return statement, so it can't be
constexpr until C++14.

	PR libstdc++/95289
	* include/debug/helper_functions.h (__get_distance): Only declare
	as a constexpr function for C++14 and up.
	* testsuite/25_algorithms/copy/debug/95289.cc: New test.
2020-05-23 18:27:35 +01:00
Jonathan Wakely
93843da697 libstdc++: Add comparison operators to associative containers
The last C++20 changes from P1614R2, "The Mothership has Landed"

	* include/bits/stl_map.h (map): Define operator<=> and remove
	operator< for C++20.
	* include/bits/stl_multimap.h (multimap): Likewise.
	* include/bits/stl_multiset.h (multiset): Likewise.
	* include/bits/stl_set.h (set): Likewise.
	* include/bits/stl_tree.h (_Rb_tree): Likewise.
	(_Rb_tree_iterator, _Rb_tree_const_iterator): Remove redundant
	operator!= for C++20.
	* include/debug/map.h (__gnu_debug::map): Define operator<=> for C++20.
	* include/debug/multimap.h (__gnu_debug::multimap): Likewise.
	* include/debug/multiset.h (__gnu_debug::multiset): Likewise.
	* include/debug/set.h (__gnu_debug::set): Likewise.
	* testsuite/23_containers/map/operators/cmp_c++20.cc: New test.
	* testsuite/23_containers/multimap/operators/cmp_c++20.cc: New test.
	* testsuite/23_containers/multiset/operators/cmp_c++20.cc: New test.
	* testsuite/23_containers/set/operators/cmp_c++20.cc: New test.
2020-04-20 17:50:10 +01:00
Jonathan Wakely
7ab9c2430f libstdc++: Remove operator!= overloads for unordered containers
Some more C++20 changes from P1614R2, "The Mothership has Landed".

	* include/bits/unordered_map.h (unordered_map, unordered_multimap):
	Remove redundant operator!= for C++20.
	* include/bits/unordered_set.h (unordered_set, unordered_multiset):
	Likewise.
	* include/debug/unordered_map (unordered_map, unordered_multimap):
	Likewise.
	* include/debug/unordered_set (unordered_set, unordered_multiset):
	Likewise.
2020-04-19 21:05:32 +01:00
Jonathan Wakely
a2c0fa35d0 libstdc++: Fix redundant assignment (PR 94629)
This appears to be a copy&paste error, which cppcheck diagnoses.

	PR other/94629
	* include/debug/formatter.h (_Error_formatter::_Parameter): Fix
	redundant assignment in constructor.
2020-04-19 21:05:32 +01:00
Jonathan Wakely
bd2420f8fa libstdc++: Add comparison operators to sequence containers
Some more C++20 changes from P1614R2, "The Mothership has Landed".

This implements <=> for sequence containers (and the __normal_iterator
and _Pointer_adapter class templates).

	* include/bits/forward_list.h (forward_list): Define operator<=> and
	remove redundant comparison operators for C++20.
	* include/bits/stl_bvector.h (vector<bool, Alloc>): Likewise.
	* include/bits/stl_deque.h (deque): Likewise.
	* include/bits/stl_iterator.h (__normal_iterator): Likewise.
	* include/bits/stl_list.h (list): Likewise.
	* include/bits/stl_vector.h (vector): Likewise.
	* include/debug/deque (__gnu_debug::deque): Likewise.
	* include/debug/forward_list (__gnu_debug::forward_list): Likewise.
	* include/debug/list (__gnu_debug::list): Likewise.
	* include/debug/safe_iterator.h (__gnu_debug::_Safe_iterator):
	Likewise.
	* include/debug/vector (__gnu_debug::vector): Likewise.
	* include/ext/pointer.h (__gnu_cxx::_Pointer_adapter): Define
	operator<=> for C++20.
	* testsuite/23_containers/deque/operators/cmp_c++20.cc: New test.
	* testsuite/23_containers/forward_list/cmp_c++20.cc: New test.
	* testsuite/23_containers/list/cmp_c++20.cc: New test.
	* testsuite/23_containers/vector/bool/cmp_c++20.cc: New test.
	* testsuite/23_containers/vector/cmp_c++20.cc: New test.
2020-04-17 23:41:04 +01:00
Jonathan Wakely
ae7051590d libstdc++: Define <=> for Debug Mode array
This fixes a test failure with -D_GLIBCXX_DEBUG:

FAIL: 23_containers/array/comparison_operators/constexpr.cc (test for excess errors)

	* include/debug/array (operator<=>): Define for C++20.
	* testsuite/23_containers/array/tuple_interface/get_debug_neg.cc:
	Adjust dg-error line numbers.
	* testsuite/23_containers/array/tuple_interface/
	tuple_element_debug_neg.cc: Likewise.
2020-02-27 15:13:16 +00:00
Jonathan Wakely
f32a3662cd libstdc++: Fix std::string error in Debug Mode
This fixes a test failure with -std=gnu++98 -D_GLIBCXX_DEBUG:

FAIL: 21_strings/basic_string/modifiers/insert/char/1.cc (test for excess errors)

	* include/debug/string (__gnu_debug::basic_string::insert): Fix for
	C++98 where the member function of the base class returns void.
2020-02-27 15:13:16 +00:00
Jonathan Wakely
3841739c29 libstdc++: enable_view has false positives (LWG 3326)
* include/std/ranges (__deep_const_range, __enable_view_impl): Remove.
	(ranges::enable_view): Simplify (LWG 3326).
	* include/bits/range_access.h (ranges::enable_view): Declare.
	* include/bits/regex.h (__enable_view_impl): Remove partial
	specialization.
	* include/bits/stl_multiset.h (__enable_view_impl): Likewise.
	* include/bits/stl_set.h (__enable_view_impl): Likewise.
	* include/bits/unordered_set.h (__enable_view_impl): Likewise.
	* include/debug/multiset.h (__enable_view_impl): Likewise.
	* include/debug/set.h (__enable_view_impl): Likewise.
	* include/debug/unordered_set (__enable_view_impl): Likewise.
	* include/experimental/string_view (ranges::enable_view): Define
	partial specialization.
	* include/std/span (ranges::enable_view): Likewise.
	* include/std/string_view (ranges::enable_view): Likewise.
	* testsuite/std/ranges/view.cc: Check satisfaction of updated concept.
2020-02-24 12:15:05 +00:00
Jakub Jelinek
8d9254fc8a Update copyright years.
From-SVN: r279813
2020-01-01 12:51:42 +01:00
François Dumont
6004c17b4d libstdc++: Rework std::copy/copy_backward/move/move_backward/fill/fill_n algos
Enhance those algos overloads to generalize existing optimization for
__gnu_debug::_Safe_iterator w/o _GLIBCXX_DEBUG mode and for std::deque
 iterators.

Also extend __copy_move_a2 ostreambuf_iterator overloads to std::vector and
std::deque iterators.

	* include/bits/stl_algobase.h
	(__copy_move_a1<>(_II, _II, _OI)): New.
	(__copy_move_a1<>(_Deque_iterator<>, _Deque_iterator<>, _OI)): New.
	(__copy_move_a1<>(_Deque_iterator<>, _Deque_iterator<>,
	_Deque_iterator<>)): New.
	(__copy_move_a1<>(_II, _II, _Deque_iterator<>)): New.
	(__copy_move_a<>(_II, _II, _OI)): Adapt, call __copy_move_a1<>.
	(__copy_move_a<>(const _Safe_iterator<>&, const _Safe_iterator<>&,
	_OI)): New.
	(__copy_move_a<>(const _Safe_iterator<>&, const _Safe_iterator<>&,
	 const _Safe_iterator<>&)): New.
	(__copy_move_a<>(_II, _II, const _Safe_iterator<>&)): New.
	(copy, move): Adapt, call __copy_move_a.
	(__copy_move_backward_a1<>(_II, _II, _OI)): New,
	call __copy_move_backward_a2.
	(__copy_move_backward_a1<>(_Deque_iterator<>, _Deque_iterator<>, _OI)): New.
	(__copy_move_backward_a1<>(_Deque_iterator<>, _Deque_iterator<>,
	_Deque_iterator<>)): New.
	(__copy_move_backward_a1<>(_II, _II, _Deque_iterator<>)): New.
	(__copy_move_backward_a<>(_II, _II, _OI)): Adapt, call
	__copy_move_backward_a1<>.
	(__copy_move_backward_a<>(const _Safe_iterator<>&, const _Safe_iterator<>&,
	_OI)): New.
	(__copy_move_backward_a<>(const _Safe_iterator<>&, const _Safe_iterator<>&,
	 const _Safe_iterator<>&)): New.
	(__copy_move_backward_a<>(_II, _II, const _Safe_iterator<>&)): New.
	(copy_backward, move_backward): Adapt, call __copy_move_backward_a<>.
	(__fill_a): Rename into...
	(__fill_a1): ... this.
	(__fill_a1(__normal_iterator<>, __normal_iterator<>, const _Tp&)): New.
	(__fill_a1(const _Deque_iterator<>&, const _Deque_iterator<>&, _VTp)):
	New.
	(__fill_a(_FIte, _FIte, const _Tp&)): New, call __fill_a1.
	(__fill_a(const _Safe_iterator<>&, const _Safe_iterator<>&,
	const _Tp&)): New.
	(fill): Adapt, remove __niter_base usage.
	(__fill_n_a): Rename into...
	(__fill_n_a1): ...this.
	(__fill_n_a(const _Safe_iterator<>&, _Size, const _Tp&,
	input_iterator_tag)): New.
	(__fill_n_a(_OI, _Size, const _Tp&, output_iterator_tag)): New, call
	__fill_n_a1.
	(__fill_n_a(_OI, _Size, const _Tp&, random_access_iterator_tag)): New,
	call __fill_a.
	(__equal_aux): Rename into...
	(__equal_aux1): ...this.
	(__equal_aux1(_Deque_iterator<>, _Deque_iterator<>, _OI)): New.
	(__equal_aux1(_Deque_iterator<>, _Deque_iterator<>,
	_Deque_iterator<>)): New.
	(__equal_aux1(_II, _II, _Deque_iterator<>)): New.
	(__equal_aux(_II1, _II1, _II2)): New, call __equal_aux1.
	(__equal_aux(const _Safe_iterator<>&, const _Safe_iterator<>&,
	_OI)): New.
	(__equal_aux(const _Safe_iterator<>&, const _Safe_iterator<>&,
	 const _Safe_iterator<>&)): New.
	(__equal_aux(_II, _II, const _Safe_iterator<>&)): New.
	(equal(_II1, _II1, _II2)): Adapt.
	* include/bits/stl_deque.h
	(fill, copy, copy_backward, move, move_backward): Remove.
	* include/bits/deque.tcc: Include <bits/stl_algobase.h>.
	(__fill_a1): New.
	(__copy_move_dit): New.
	(__copy_move_a1): New, use latter.
	(__copy_move_a1(_II, _II, _Deque_iterator<>)): New.
	(__copy_move_backward_dit): New.
	(__copy_move_backward_a1): New, use latter.
	(__copy_move_backward_a1(_II, _II, _Deque_iterator<>)): New.
	(__equal_dit): New.
	(__equal_aux1): New, use latter.
	(__equal_aux1(_II, _II, _Deque_iterator<>)): New.
	* include/std/numeric (__is_random_access_iter): Move...
	* include/bits/stl_iterator_base_types.h (__is_random_access_iter): ...
	here. Provide pre-C++11 definition.
	* include/debug/debug.h (_Safe_iterator<>): New declaration.
	* include/debug/safe_iterator.h (_Safe_iterator<>::_M_can_advance): Add
	__strict parameter.
	* include/debug/safe_iterator.tcc: Include <bits/stl_algobase.h>.
	(_Safe_iterator<>::_M_can_advance): Adapt.
	(std::__copy_move_a, std::__copy_move_backward_a, __fill_a): New.
	(__fill_n_a, __equal_aux): New.
	* include/debug/stl_iterator.h (__niter_base): Remove.
	* include/debug/vector (__niter_base): Remove.
	* testsuite/performance/25_algorithms/copy_backward_deque_iterators.cc:
	Include <vector> and <list>. Add benches.
	* testsuite/performance/25_algorithms/copy_deque_iterators.cc: Likewise.
	* testsuite/performance/25_algorithms/equal_deque_iterators.cc: Likewise.
	* testsuite/25_algorithms/copy/debug/1_neg.cc: New.
	* testsuite/25_algorithms/copy/deque_iterators/2.cc: New.
	* testsuite/25_algorithms/copy/deque_iterators/31.cc: New.
	* testsuite/25_algorithms/copy/deque_iterators/32.cc: New.
	* testsuite/25_algorithms/copy/deque_iterators/33.cc: New.
	* testsuite/25_algorithms/copy/deque_iterators/41.cc: New.
	* testsuite/25_algorithms/copy/deque_iterators/42.cc: New.
	* testsuite/25_algorithms/copy/deque_iterators/43.cc: New.
	* testsuite/25_algorithms/copy/streambuf_iterators/char/4.cc (test02):
	New.
	* testsuite/25_algorithms/copy_backward/deque_iterators/2.cc: New.
	* testsuite/25_algorithms/equal/deque_iterators/1.cc: New.
	* testsuite/25_algorithms/fill/deque_iterators/1.cc: New.
	* testsuite/25_algorithms/move/deque_iterators/2.cc: New.
	* testsuite/25_algorithms/move_backward/deque_iterators/2.cc: New.

From-SVN: r279201
2019-12-10 21:49:55 +00:00
François Dumont
e32b9ce4d5 libstdc++: Use C++98 syntax to instantiate input_iterator_tag
* include/debug/helper_functions.h (__valid_range_aux): Use C++98
	std::input_iterator_tag default constructor invocation.

From-SVN: r278731
2019-11-26 19:23:11 +00:00
François Dumont
59d37e9709 libstdc++: Add C++20 P1032 constexpr to _GLIBCXX_DEBUG array
* include/debug/array (array<>::fill): Add C++20 constexpr.
	(array<>::swap): Likewise.

From-SVN: r278718
2019-11-26 06:12:34 +00:00
François Dumont
db58c8e919 libstdc++: Add _GLIBCXX_DEBUG safe iterator C++20 iterator concept
* include/debug/safe_iterator.h
	[__cpp_lib_concepts](_Safe_iterator<>::iterator_concept): Define for
	C++20.

From-SVN: r278717
2019-11-26 06:07:23 +00:00
François Dumont
af4e8d4d5a libstdc++: Improve _GLIBCXX_DEBUG __valid_range check
Adds iterator singular check within the valid range check.

	* include/debug/functions.h: Remove <bits/move.h> include.
	(__check_singular_aux, __check_singular): Move...
	* include/debug/helper_functions.h:
	(__check_singular_aux, __check_singular): ...here.
	(__valid_range_aux): Adapt to use latter.
	Add <bits/move.h> include.
	* testsuite/25_algorithms/copy/debug/2_neg.cc: New.

From-SVN: r278658
2019-11-24 17:09:44 +00:00
Jonathan Wakely
5ecaaf98dc libstdc++: Fix declarations of variable templates
This code is invalid and rejected by other compilers (see PR 92576).

	* include/bits/regex.h (ranges::__detail::__enable_view_impl): Fix
	declaration.
	* include/bits/stl_multiset.h (ranges::__detail::__enable_view_impl):
	Likewise.
	* include/bits/stl_set.h (ranges::__detail::__enable_view_impl):
	Likewise.
	* include/bits/unordered_set.h (ranges::__detail::__enable_view_impl):
	Likewise.
	* include/debug/multiset.h (ranges::__detail::__enable_view_impl):
	Likewise.
	* include/debug/set.h (ranges::__detail::__enable_view_impl): Likewise.
	* include/debug/unordered_set (ranges::__detail::__enable_view_impl):
	Likewise.

From-SVN: r278440
2019-11-19 09:34:59 +00:00
Jonathan Wakely
37f33df706 libstdc++: Define C++20 range utilities and range factories
This adds another chunk of the <ranges> header.

The changes from P1456R1 (Move-only views) and P1862R1 (Range adaptors
for non-copyable iterators) are included, but not the changes from
P1870R1 (forwarding-range<T> is too subtle).

The tests for subrange and iota_view are poor and should be improved.

	* include/bits/regex.h (match_results): Specialize __enable_view_impl.
	* include/bits/stl_set.h (set): Likewise.
	* include/bits/unordered_set.h (unordered_set, unordered_multiset):
	Likewise.
	* include/debug/multiset.h (__debug::multiset): Likewise.
	* include/debug/set.h (__debug::set): Likewise.
	* include/debug/unordered_set (__debug::unordered_set)
	(__debug::unordered_multiset): Likewise.
	* include/std/ranges (ranges::view, ranges::enable_view)
	(ranges::view_interface, ranges::subrange, ranges::empty_view)
	(ranges::single_view, ranges::views::single, ranges::iota_view)
	(ranges::views::iota): Define for C++20.
	* testsuite/std/ranges/empty_view.cc: New test.
	* testsuite/std/ranges/iota_view.cc: New test.
	* testsuite/std/ranges/single_view.cc: New test.
	* testsuite/std/ranges/view.cc: New test.

From-SVN: r278370
2019-11-17 01:07:54 +00:00
Jonathan Wakely
30a761c4b5 Only qualify function as constexpr for C++14 and later
This helper function is not a valid constexpr function in C++11, so
should only be marked constexpr for C++14 and later.

	* include/debug/helper_functions.h (__valid_range): Change
	_GLIBCXX_CONSTEXPR to _GLIBCXX14_CONSTEXPR.

From-SVN: r277338
2019-10-23 17:14:50 +01:00
François Dumont
36edf9cab1 Improve _GLIBCXX_DEBUG safe iterator range size computation.
* include/debug/forward_list
	(_Sequence_traits<__debug::forward_list<>>::_S_size): Returns __dp_sign
	distance when not empty.
	* include/debug/list (_Sequence_traits<__debug::list<>>::_S_size):
	Likewise.
	* include/debug/helper_functions.h (__dp_sign_max_size): New
	_Distance_precision enum entry.
	(__valid_range_aux(_IIte, _IIte, _Distance_traits<>::__type,
	__false_type)): Adapt.
	* include/debug/safe_iterator.tcc
	(_Safe_iterator<>::_M_get_distance_to(const _Safe_iterator&)): Review
	distance computation.

From-SVN: r276600
2019-10-04 20:22:11 +00:00
François Dumont
2d2ad752c0 Implement C++20 constexpr comparison operators for __debug::array (P1023).
* include/debug/array: Add C++20 constexpr to comparison operators.
	* testsuite/23_containers/array/tuple_interface/get_debug_neg.cc: Adapt
	dg-error line numbers.
	* testsuite/23_containers/array/tuple_interface/
	tuple_element_debug_neg.cc: Likewise.

From-SVN: r276375
2019-09-30 20:33:51 +00:00
François Dumont
97d5766531 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
Jonathan Wakely
c9fb0a85b6 Define std::to_array for Debug Mode
* include/debug/array (to_array): Define for debug mode.

From-SVN: r276155
2019-09-26 17:08:44 +01:00
Jonathan Wakely
10f26de915 PR libstdc++/87431 re-adjust never-valueless optimizations
Avoid creating arbitrarily large objects on the stack when emplacing
trivially copyable objects into a variant. Currently we provide the
strong exception-safety guarantee for all trivially copyable types, by
constructing a second variant and then doing a non-throwing move
assignment from the temporary. This patch restricts that behaviour to
trivially copyable types that are no larger than 256 bytes. For larger
types the object will be emplaced directly into the variant, and if its
initialization throws then the variant becomes valueless.

Also implement Antony Polukhin's suggestion to whitelist specific types
that are not trivially copyable but can be efficiently move-assigned.
Emplacing those types will never cause a variant to become valueless.
The whitelisted types are: std::shared_ptr, std::weak_ptr,
std::unique_ptr, std::function, and std::any. Additionally,
std::basic_string, std::vector, and __gnu_debug::vector are whitelisted
if their allocator traits give them a non-throwing move assignment
operator. Specifically, this means std::string is whitelisted, but
std::pmr::string is not.

As part of this patch, additional if-constexpr branches are added for
the cases where the initialization is known to be non-throwing (so the
overhead of the try-catch block can be avoided) and where a scalar is
being produced by a potentially-throwing conversion operator (so that
the overhead of constructing and move-assigning a variant is avoided).
These changes should have no semantic effect, just better codegen.

	PR libstdc++/87431 (again)
	* include/bits/basic_string.h (__variant::_Never_valueless_alt):
	Define partial specialization for basic_string.
	* include/bits/shared_ptr.h (_Never_valueless_alt): Likewise for
	shared_ptr and weak_ptr.
	* include/bits/std_function.h (_Never_valueless_alt): Likewise for
	function.
	* include/bits/stl_vector.h (_Never_valueless_alt): Likewise for
	vector.
	* include/bits/unique_ptr.h (_Never_valueless_alt): Likewise for
	unique_ptr.
	* include/debug/vector (_Never_valueless_alt): Likewise for debug
	vector.
	* include/std/any (_Never_valueless_alt): Define explicit
	specialization for any.
	* include/std/variant (_Never_valueless_alt): Define primary template.
	(__never_valueless): Use _Never_valueless_alt instead of
	is_trivially_copyable.
	(variant::emplace<N>(Args&&...)): Add special case for non-throwing
	initializations to avoid try-catch overhead. Add special case for
	scalars produced by potentially-throwing conversions. Use
	_Never_valueless_alt instead of is_trivially_copyable for the
	remaining strong exception-safety cases.
	(variant::emplace<N>(initializer_list<U>, Args&&...)): Likewise.
	* testsuite/20_util/variant/87431.cc: Run both test functions.
	* testsuite/20_util/variant/exception_safety.cc: New test.
	* testsuite/20_util/variant/run.cc: Use pmr::string instead of string,
	so the variant becomes valueless.

From-SVN: r270170
2019-04-05 17:56:09 +01:00
François Dumont
c0cb38c28e re PR libstdc++/89477 (Incorrect CTAD deduction guides for set and multiset)
2019-03-08  François Dumont  <fdumont@gcc.gnu.org>

	PR libstdc++/89477
	* include/debug/map.h (map): Use _RequireNotAllocator to constrain
	parameters in deduction guides.
	* include/debug/multimap.h (multimap): Likewise.
	* include/debug/set.h (multimap): Likewise.
	* include/debug/multiset.h (multimap): Likewise.
	* include/debug/unordered_map (unordered_map): Likewise.
	(unordered_multimap): Likewise.
	* include/debug/unordered_set (unordered_set): Likewise.
	(unordered_multiset): Likewise.

From-SVN: r269479
2019-03-08 05:53:09 +00:00
François Dumont
20a4550ce0 re PR libstdc++/89608 (Undetected iterator invalidations on unordered containers in debug mode)
2019-03-08  François Dumont  <fdumont@gcc.gnu.org>

	PR libstdc++/89608
	* include/debug/unordered_map (unordered_map<>::_M_check_rehashed):
	Invalidate all iterators in case of rehash.
	(unordered_multimap<>::_M_check_rehashed): Likewise.
	* include/debug/unordered_set
	(unordered_set<>::_M_check_rehashed): Likewise.
	(unordered_multiset<>::_M_check_rehashed): Likewise.
	* testsuite/23_containers/unordered_set/debug/89608_neg.cc: New.

From-SVN: r269478
2019-03-08 05:37:50 +00:00
Ulrich Drepper
d715f55431 Fix after P0600.
gcc/testsuite/ChangeLog
2019-02-20  Ulrich Drepper  <drepper@redhat.com>

	Fix after P0600.
	* g++.dg/init/new39.C: Don't just ignore result of new.

libstdc++/ChangeLog
2019-02-20  Ulrich Drepper  <drepper@redhat.com>

	Implement C++20 P0600r1.
	* include/backward/hash_map: Add nodiscard attribute to empty.
	* include/backward/hash_set: Likewise.
	* backward/hashtable.h: Likewise.
	* include/bits/basic_string.h: Likewise.
	* include/bits/forward_list.h: Likewise.
	* include/bits/hashtable.h: Likewise.
	* include/bits/regex.h: Likewise.
	* include/bits/stl_deque.h: Likewise.
	* include/bits/stl_list.h: Likewise.
	* include/bits/stl_map.h: Likewise.
	* include/bits/stl_multimap.h: Likewise.
	* include/bits/stl_multiset.h: Likewise.
	* include/bits/stl_queue.h: Likewise.
	* include/bits/stl_set.h: Likewise.
	* include/bits/stl_stack.h: Likewise.
	* include/bits/stl_tree.h: Likewise.
	* include/bits/stl_vector.h: Likewise.
	* include/bits/unordered_map.h: Likewise.
	* include/bits/unordered_set.h: Likewise.
	* include/debug/array: Likewise.
	* include/experimental/any: Likewise.
	* include/experimental/bits/fs_path.h: Likewise.
	* include/experimental/internet: Likewise.
	* include/experimental/string_view: Likewise.
	* include/ext/pb_ds/detail/bin_search_tree_/info_fn_imps.hpp:
	Likewise.
	* include/ext/pb_ds/detail/binary_heap_/binary_heap_.hpp:
	Likewise.
	* include/ext/pb_ds/detail/binary_heap_/info_fn_imps.hpp:
	Likewise.
	* include/ext/pb_ds/detail/cc_hash_table_map_/cc_ht_map_.hpp:
	Likewise.
	* include/ext/pb_ds/detail/cc_hash_table_map_/info_fn_imps.hpp:
	Likewise.
	* include/ext/pb_ds/detail/cc_hash_table_map_/size_fn_imps.hpp:
	Likewise.
	* include/ext/pb_ds/detail/gp_hash_table_map_/gp_ht_map_.hpp:
	Likewise.
	* include/ext/pb_ds/detail/gp_hash_table_map_/info_fn_imps.hpp:
	Likewise.
	* include/ext/pb_ds/detail/left_child_next_sibling_heap_/info_fn_imps.hpp:
	Likewise.
	*
include/ext/pb_ds/detail/left_child_next_sibling_heap_/left_child_next_sibling_heap_.hpp:
	Likewise.
	* include/ext/pb_ds/detail/list_update_map_/info_fn_imps.hpp:
	Likewise.
	* include/ext/pb_ds/detail/list_update_map_/lu_map_.hpp:
	Likewise.
	* include/ext/pb_ds/detail/ov_tree_map_/info_fn_imps.hpp:
	Likewise.
	* include/ext/pb_ds/detail/ov_tree_map_/ov_tree_map_.hp:
	Likewise.
	* include/ext/pb_ds/detail/pat_trie_/info_fn_imps.hpp:
	Likewise.
	* include/ext/pb_ds/detail/pat_trie_/pat_trie_.hpp:
	Likewise.
	* include/ext/pb_ds/detail/rc_binomial_heap_/rc.hpp:
	Likewise.
	* include/ext/pb_ds/detail/tree_trace_base.hpp: Likewise.
	* include/ext/pb_ds/trie_policy.hpp: Likewise.
	* include/ext/rope: Likewise.
	* include/ext/slist: Likewise.
	* include/ext/vstring.h: Likewise.
	* include/profile/array: Likewise.
	* include/std/array: Likewise.
	* include/tr1/array: Likewise.
	* include/tr1/hashtable.h: Likewise.
	* include/tr1/regex: Likewise.
	* include/tr2/dynamic_bitset: Likewise.
	* include/bits/alloc_traits.h: Add nodiscard attribute to
	allocate.
	* include/experimental/memory_resource: Likewise.
	* include/ext/alloc_traits.h: Likewise.
	* include/ext/array_allocator.h: Likewise.
	* include/ext/bitmap_allocator.h: Likewise.
	* include/ext/debug_allocator.h: Likewise.
	* include/ext/extptr_allocator.h: Likewise.
	* include/ext/mt_allocator.h: Likewise.
	* include/ext/new_allocator.h: Likewise.
	* include/ext/pool_allocator.h: Likewise.
	* include/ext/throw_allocator.h: Likewise.
	* include/std/scoped_allocator: Likewise.
	* libsupc++/eh_alloc.cc: Likewise.
	* include/std/future: Add nodiscard attribute to async.
	* libsupc++/new: Add nodiscard attribute to new.

From-SVN: r268111
2019-01-21 11:47:30 +00:00
Jonathan Wakely
3c732e6fe8 PR libstdc++/88607 replace or remove unnecessary UTF-8 characters
There are a number of UTF-8 characters in comments which add no value
and can be replaced with ASCII equivalents, or removed entirely for the
section sign (U+00A7).

	PR libstdc++/88607
	* include/bits/forward_list.h: Replace UTF-8 "ligature fi" character.
	* include/debug/forward_list: Likewise.
	* include/experimental/bits/shared_ptr.h: Remove UTF-8 "section sign"
	character.
	* include/experimental/chrono: Likewise.
	* include/experimental/functional: Likewise.
	* include/experimental/ratio: Likewise.
	* include/experimental/system_error: Likewise.
	* include/experimental/tuple: Likewise.
	* include/experimental/type_traits: Likewise.
	* include/parallel/workstealing.h: Replace UTF-8 "en dash" character.
	* include/parallel/multiseq_selection.h: Likewise.

From-SVN: r267564
2019-01-03 20:38:11 +00:00
Jakub Jelinek
a554497024 Update copyright years.
From-SVN: r267494
2019-01-01 13:31:55 +01:00
John Bytheway
cdc71993cf re PR libstdc++/87872 (debug list::splice should not call _M_transfer_from_if on self-splices)
2018-11-06  John Bytheway  <jbytheway@gmail.com>

	PR libstdc++/87872
	* include/debug/safe_sequence.tcc
	(_Safe_sequence<>::_M_transfer_from_if): Skip transfer to self.

From-SVN: r265851
2018-11-06 20:20:06 +00:00
François Dumont
4b763deedb 2018-10-24 François Dumont <fdumont@gcc.gnu.org>
* include/debug/safe_unordered_container.h
	(_Safe_unordered_container<>::_M_invalidate_locals): Take lambda
	parameter type from local end variable.
	(_Safe_unordered_container<>::_M_invalidate_all): Likewise.
	* include/debug/unordered_map
	(unordered_map<>::begin()): Use C++11 direct initialization.
	(unordered_map<>::end()): Likewise.
	(unordered_map<>::cbegin()): Likewise.
	(unordered_map<>::cend()): Likewise.
	(unordered_map<>::begin(size_type)): Likewise.
	(unordered_map<>::end(size_type)): Likewise.
	(unordered_map<>::cbegin(size_type)): Likewise.
	(unordered_map<>::cend(size_type)): Likewise.
	(unordered_map<>::emplace<>(_Args&&...)): Likewise.
	(unordered_map<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
	(unordered_map<>::insert(const value_type&)): Likewise.
	(unordered_map<>::insert(value_type&&)): Likewise.
	(unordered_map<>::insert<>(_Pair&&)): Likewise.
	(unordered_map<>::insert(const_iterator, const value_type&)): Likewise.
	(unordered_map<>::insert(const_iterator, value_type&&)): Likewise.
	(unordered_map<>::insert<>(const_iterator, _Pair&&)): Likewise.
	(unordered_map<>::try_emplace<>(const key_type&, _Args&&...)): Likewise.
	(unordered_map<>::try_emplace<>(key_type&&, _Args&&...)): Likewise.
	(unordered_map<>::try_emplace<>(const_iterator, const key_type&,
	_Args&&...)): Likewise.
	(unordered_map<>::try_emplace<>(const_iterator, key_type&&,
	_Args&&...)): Likewise.
	(unordered_map<>::insert_or_assign<>(const key_type&, _Obj&&)): Likewise.
	(unordered_map<>::insert_or_assign<>(key_type&&, _Obj&&)): Likewise.
	(unordered_map<>::insert_or_assign<>(const_iterator, const key_type&,
	_Obj&&)): Likewise.
	(unordered_map<>::insert_or_assign<>(const_iterator, key_type&&,
	_Obj&&)): Likewise.
	(unordered_map<>::insert(note_type&&)): Likewise.
	(unordered_map<>::find(const key_type&)): Likewise.
	(unordered_map<>::equal_range(const key_type&)): Likewise.
	(unordered_map<>::_M_extract): New.
	(unordered_map<>::extract(const_iterator)): Use latter.
	(unordered_map<>::extract(const key_type&)): Likewise.
	(unordered_map<>::_M_erase): New.
	(unordered_map<>::erase(const key_type&)): Use latter.
	(unordered_map<>::erase(const_iterator)): Likewise.
	(unordered_map<>::erase(iterator)): Likewise.
	(unordered_map<>::_M_invalidate): New.
	(unordered_map<>::erase(const_iterator, const_iterator)): Use latter.
	(unordered_multimap<>::begin()): Use C++11 direct initialization.
	(unordered_multimap<>::end()): Likewise.
	(unordered_multimap<>::cbegin()): Likewise.
	(unordered_multimap<>::cend()): Likewise.
	(unordered_multimap<>::begin(size_type)): Likewise.
	(unordered_multimap<>::end(size_type)): Likewise.
	(unordered_multimap<>::cbegin(size_type)): Likewise.
	(unordered_multimap<>::cend(size_type)): Likewise.
	(unordered_multimap<>::emplace<>(_Args&&...)): Likewise.
	(unordered_multimap<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
	(unordered_multimap<>::insert(const value_type&)): Likewise.
	(unordered_multimap<>::insert(const_iterator, const value_type&)): Likewise.
	(unordered_multimap<>::insert(const_iterator, value_type&&)): Likewise.
	(unordered_multimap<>::insert<>(_Pair&&)): Likewise.
	(unordered_multimap<>::insert<>(const_iterator, _Pair&&)): Likewise.
	(unordered_multimap<>::insert(note_type&&)): Likewise.
	(unordered_multimap<>::insert(const_iterator, note_type&&)): Likewise.
	(unordered_multimap<>::find(const key_type&)): Likewise.
	(unordered_multimap<>::equal_range(const key_type&)): Likewise.
	(unordered_multimap<>::_M_extract): New.
	(unordered_multimap<>::extract(const_iterator)): Use latter.
	(unordered_multimap<>::extract(const key_type&)): Likewise.
	(unordered_multimap<>::_M_erase): New.
	(unordered_multimap<>::erase(const_iterator)): Likewise.
	(unordered_multimap<>::erase(iterator)): Likewise.
	(unordered_multimap<>::_M_invalidate): New.
	(unordered_multimap<>::erase(const key_type&)): Use latter.
	(unordered_multimap<>::erase(const_iterator, const_iterator)): Likewise.
	* include/debug/unordered_set
	(unordered_set<>::begin()): Use C++11 direct initialization.
	(unordered_set<>::end()): Likewise.
	(unordered_set<>::cbegin()): Likewise.
	(unordered_set<>::cend()): Likewise.
	(unordered_set<>::begin(size_type)): Likewise.
	(unordered_set<>::end(size_type)): Likewise.
	(unordered_set<>::cbegin(size_type)): Likewise.
	(unordered_set<>::cend(size_type)): Likewise.
	(unordered_set<>::emplace<>(_Args&&...)): Likewise.
	(unordered_set<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
	(unordered_set<>::insert(const value_type&)): Likewise.
	(unordered_set<>::insert(value_type&&)): Likewise.
	(unordered_set<>::insert(const_iterator, const value_type&)): Likewise.
	(unordered_set<>::insert(const_iterator, value_type&&)): Likewise.
	(unordered_set<>::insert(note_type&&)): Likewise.
	(unordered_set<>::insert(const_iterator, note_type&&)): Likewise.
	(unordered_set<>::find(const key_type&)): Likewise.
	(unordered_set<>::equal_range(const key_type&)): Likewise.
	(unordered_set<>::_M_extract): New.
	(unordered_set<>::extract(const_iterator)): Use latter.
	(unordered_set<>::extract(const key_type&)): Likewise.
	(unordered_set<>::_M_erase): New.
	(unordered_set<>::erase(const key_type&)): Use latter.
	(unordered_set<>::erase(const_iterator)): Likewise.
	(unordered_set<>::erase(iterator)): Likewise.
	(unordered_set<>::_M_invalidate): New.
	(unordered_set<>::erase(const_iterator, const_iterator)): Use latter.
	(unordered_multiset<>::begin()): Use C++11 direct initialization.
	(unordered_multiset<>::end()): Likewise.
	(unordered_multiset<>::cbegin()): Likewise.
	(unordered_multiset<>::cend()): Likewise.
	(unordered_multiset<>::begin(size_type)): Likewise.
	(unordered_multiset<>::end(size_type)): Likewise.
	(unordered_multiset<>::cbegin(size_type)): Likewise.
	(unordered_multiset<>::cend(size_type)): Likewise.
	(unordered_multiset<>::emplace<>(_Args&&...)): Likewise.
	(unordered_multiset<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
	(unordered_multiset<>::insert(const value_type&)): Likewise.
	(unordered_multiset<>::insert(const_iterator, const value_type&)): Likewise.
	(unordered_multiset<>::insert(value_type&&)): Likewise.
	(unordered_multiset<>::insert(const_iterator, value_type&&)): Likewise.
	(unordered_multiset<>::insert(node_type&&)): Likewise.
	(unordered_multiset<>::insert(const_iterator, node_type&&)): Likewise.
	(unordered_multiset<>::find(const key_type&)): Likewise.
	(unordered_multiset<>::equal_range(const key_type&)): Likewise.
	(unordered_multiset<>::_M_extract): New.
	(unordered_multiset<>::extract(const_iterator)): Use latter.
	(unordered_multiset<>::extract(const key_type&)): Likewise.
	(unordered_multiset<>::_M_erase): New.
	(unordered_multiset<>::erase(const_iterator)): Likewise.
	(unordered_multiset<>::erase(iterator)): Likewise.
	(unordered_multiset<>::_M_invalidate): New.
	(unordered_multiset<>::erase(const key_type&)): Use latter.
	(unordered_multiset<>::erase(const_iterator, const_iterator)): Likewise.

From-SVN: r265451
2018-10-24 05:40:25 +00:00
Jonathan Wakely
7b1e8acfae Fix testsuite failures in Debug Mode
This fixes the following testsuite failures on ia32 when compiled with
-D_GLIBCXX_DEBUG:

FAIL: 23_containers/map/modifiers/erase/dr130-linkage-check.cc
FAIL: 23_containers/multimap/modifiers/erase/dr130-linkage-check.cc
FAIL: 23_containers/multiset/modifiers/erase/dr130-linkage-check.cc
FAIL: 23_containers/set/modifiers/erase/dr130-linkage-check.cc

The normal mode containers already use the abi-tag to mangle these
overloads differently, but the debug mode versions weren't fixed.

	* include/debug/map.h (map::erase(iterator)): Add abi-tag so that
	C++11 version mangles differently from incompatible C++98 version.
	* include/debug/multimap.h (multimap::erase(iterator)): Likewise.
	* include/debug/multiset.h (multiset::erase(iterator))
	(multiset::erase(const_iterator, const_iterator)): Likewise.
	* include/debug/set.h (set::erase(iterator))
	(multiset::erase(const_iterator, const_iterator)): Likewise.

From-SVN: r265313
2018-10-19 14:37:05 +01:00
François Dumont
7702ab653a revert: [multiple changes]
2018-10-18  François Dumont  <fdumont@gcc.gnu.org>

	Partial revert.
	2018-10-08  François Dumont  <fdumont@gcc.gnu.org>

	* include/debug/list (list<>::cbegin()): Use C++11 direct
	initialization.
	(list<>::cend()): Likewise.
	(list<>::erase(const_iterator, const_iterator)): Ensure consistent
	iterator comparisons.
	(list<>::splice(const_iterator, list&&, const_iterator,
	const_iterator)): Likewise.

	Partial revert.
	2018-10-15  François Dumont  <fdumont@gcc.gnu.org>

	* include/debug/vector (vector<>::cbegin()): Use C++11 direct
	initialization.
	(vector<>::cend()): Likewise.
	(vector<>::insert(const_iterator, const _Tp&)): Use consistent
	iterator comparison.
	(vector<>::erase(const_iterator)): Likewise.
	(vector<>::erase(const_iterator, const_iterator)): Likewise.

From-SVN: r265259
2018-10-18 05:36:02 +00:00
François Dumont
4b186707ee vector (vector<>::cbegin()): Use C++11 direct initialization.
2018-10-15  François Dumont  <fdumont@gcc.gnu.org>

	* include/debug/vector (vector<>::cbegin()): Use C++11 direct
	initialization.
	(vector<>::cend()): Likewise.
	(vector<>::emplace(const_iterator, _Args&&...)): Likewise and use
	consistent iterator comparison.
	(vector<>::insert(const_iterator, size_type, const _Tp&)): Likewise.
	(vector<>::insert(const_iterator, _InputIterator, _InputIterator)):
	Likewise.
	(vector<>::erase(const_iterator)): Likewise.
	(vector<>::erase(const_iterator, const_iterator)): Likewise.

From-SVN: r265156
2018-10-15 05:24:51 +00:00
François Dumont
3e670ecf0b 2018-10-11 François Dumont <fdumont@gcc.gnu.org>
* include/debug/forward_list
	(forward_list<>::before_begin()): Use C++11 direct initialization.
	(forward_list<>::begin()): Likewise.
	(forward_list<>::end()): Likewise.
	(forward_list<>::cbefore_begin()): Likewise.
	(forward_list<>::cbegin()): Likewise.
	(forward_list<>::cend()): Likewise.
	(forward_list<>::emplace_after<>(const_iterator, _Args&&...)): Likewise.
	(forward_list<>::insert_after(const_iterator, const _Tp&)): Likewise.
	(forward_list<>::insert_after(const_iterator, _Tp&&)): Likewise.
	(forward_list<>::insert_after(const_iterator, size_type, const _Tp&)):
	Likewise.
	(forward_list<>::insert_after(const_iterator, initializer_list<>)):
	Likewise.
	(forward_list<>::erase_after(const_iterator)): Likewise.
	(forward_list<>::erase_after(const_iterator, const_iterator)): Likewise
	and ensure consistent iterator comparison.

From-SVN: r265061
2018-10-11 20:47:13 +00:00
François Dumont
edec2bad9a list (list<>::cbegin()): Use C++11 direct initialization.
2018-10-08  François Dumont  <fdumont@gcc.gnu.org>

	* include/debug/list (list<>::cbegin()): Use C++11 direct
	initialization.
	(list<>::cend()): Likewise.
	(list<>::emplace<>(const_iterator, _Args&&...)): Likewise.
	(list<>::insert(const_iterator, initializer_list<>)): Likewise.
	(list<>::insert(const_iterator, size_type, const _Tp&)): Likewise.
	(list<>::erase(const_iterator, const_iterator)): Ensure consistent
	iterator comparisons.
	(list<>::splice(const_iterator, list&&, const_iterator,
	const_iterator)): Likewise.

From-SVN: r264911
2018-10-08 05:49:12 +00:00
François Dumont
e0b9bc230a 2018-10-05 François Dumont <fdumont@gcc.gnu.org>
* include/bits/stl_tree.h
	(_Rb_tree_iterator<>::operator==): Make inline friend.
	(_Rb_tree_iterator<>::operator!=): Likewise.
	(_Rb_tree_const_iterator<>::operator==): Likewise.
	(_Rb_tree_const_iterator<>::operator!=): Likewise.
	(operator==(const _Rb_tree_iterator<>&,
	const _Rb_tree_const_iterator&)): Remove.
	(operator!=(const _Rb_tree_iterator<>&,
	const _Rb_tree_const_iterator&)): Remove.
	(operator==(const _Rb_tree<>&, const _Rb_tree<>&)): Make inline friend.
	(operator<(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise.
	(operator!=(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise and
	deprecate.
	(operator>(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise.
	(operator<=(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise.
	(operator>=(const _Rb_tree<>&, const _Rb_tree<>&)): Likewise.
	* include/debug/map.h (map<>::erase(const_iterator, const_iterator)):
	Compare __victim with _Base::cend().
	* include/debug/multimap.h
	(multimap<>::erase(const_iterator, const_iterator)): Likewise.
	* include/debug/set.h (set<>::erase(const_iterator, const_iterator)):
	Compare __victim with _Base::cend().
	* include/debug/multiset.h
	(multiset<>::erase(const_iterator, const_iterator)): Likewise.

From-SVN: r264875
2018-10-05 16:01:39 +00:00
François Dumont
784779d471 2018-10-03 François Dumont <fdumont@gcc.gnu.org>
* include/debug/map.h
	(map<>::emplace<>(_Args&&...)): Use C++11 direct initialization.
	(map<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
	(map<>::insert(value_type&&)): Likewise.
	(map<>::insert<>(_Pair&&)): Likewise.
	(map<>::insert<>(const_iterator, _Pair&&)): Likewise.
	(map<>::try_emplace): Likewise.
	(map<>::insert_or_assign): Likewise.
	(map<>::insert(node_type&&)): Likewise.
	(map<>::insert(const_iterator, node_type&&)): Likewise.
	(map<>::erase(const_iterator)): Likewise.
	(map<>::erase(const_iterator, const_iterator)): Likewise.
	* include/debug/multimap.h
	(multimap<>::emplace<>(_Args&&...)): Use C++11 direct initialization.
	(multimap<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
	(multimap<>::insert<>(_Pair&&)): Likewise.
	(multimap<>::insert<>(const_iterator, _Pair&&)): Likewise.
	(multimap<>::insert(node_type&&)): Likewise.
	(multimap<>::insert(const_iterator, node_type&&)): Likewise.
	(multimap<>::erase(const_iterator)): Likewise.
	(multimap<>::erase(const_iterator, const_iterator)): Likewise.
	* include/debug/set.h
	(set<>::emplace<>(_Args&&...)): Use C++11 direct initialization.
	(set<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
	(set<>::insert(value_type&&)): Likewise.
	(set<>::insert<>(const_iterator, value_type&&)): Likewise.
	(set<>::insert(const_iterator, node_type&&)): Likewise.
	(set<>::erase(const_iterator)): Likewise.
	(set<>::erase(const_iterator, const_iterator)): Likewise.
	* include/debug/multiset.h
	(multiset<>::emplace<>(_Args&&...)): Use C++11 direct initialization.
	(multiset<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
	(multiset<>::insert<>(value_type&&)): Likewise.
	(multiset<>::insert<>(const_iterator, value_type&&)): Likewise.
	(multiset<>::insert(node_type&&)): Likewise.
	(multiset<>::insert(const_iterator, node_type&&)): Likewise.
	(multiset<>::erase(const_iterator)): Likewise.
	(multiset<>::erase(const_iterator, const_iterator)): Likewise.

From-SVN: r264805
2018-10-03 05:50:01 +00:00
François Dumont
5c441345a3 functions.h (__foreign_iterator_aux3(const _Safe_iterator<>&, const _InputeIter&, const _InputIter&, __true_type)): Use empty() rather than begin() == end().
2018-09-28  François Dumont  <fdumont@gcc.gnu.org>

	* include/debug/functions.h
	(__foreign_iterator_aux3(const _Safe_iterator<>&, const _InputeIter&,
	const _InputIter&, __true_type)): Use empty() rather than begin() ==
	end().

From-SVN: r264699
2018-09-28 20:26:29 +00:00
François Dumont
b101633fa6 2018-09-02 François Dumont <fdumont@gcc.gnu.org>
* include/debug/safe_iterator.h
	(_Safe_iterator<_It, _Seq, _Cat>::_Self): New.
	(_Safe_iterator<_It, _Seq, std::random_access_iterator_tag>::_Self):
	New.
	(_Safe_iterator<_It, _Seq, std::random_access_iterator_tag>
	::_OtherSelf): New.
	(_GLIBCXX_DEBUG_VERIFY_OPERANDS, _GLIBCXX_DEBUG_VERIFY_EQ_OPERANDS)
	(_GLIBCXX_DEBUG_VERIFY_REL_OPERANDS)
	(_GLIBCXX_DEBUG_VERIFY_DIST_OPERANDS): Define macros.
	(_Safe_iterator<_It, _Seq, std::random_access_iterator_tag>
	::operator+(difference_type)): Use latters, inline as friend.
	(_Safe_iterator<_It, _Seq, std::random_access_iterator_tag>
	::operator-(difference_type)): Likewise.
	(operator==(const _Safe_iterator<>&, const _Safe_iterator<>&)):
	Likewise.
	(operator!=(const _Safe_iterator<>&, const _Safe_iterator<>&)):
	Likewise.
	(operator<(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise.
	(operator<=(const _Safe_iterator<>&, const _Safe_iterator<>&)):
	Likewise.
	(operator>(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise.
	(operator>=(const _Safe_iterator<>&, const _Safe_iterator<>&)):
	Likewise.
	(operator-(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise.
	(operator+(difference_type, const _Safe_iterator<>&)): Likewise.
	(operator-(const _Safe_iterator<>&, difference_type)): Likewise.
	* include/debug/safe_iterator.tcc
	(_Safe_iterator<>::_M_can_advance(difference_type)): Take parameter by
	copy.
	* include/debug/safe_local_iterator.h
	(_Safe_local_iterator<_It, _Seq>::_Self): New.
	(_Safe_local_iterator<_It, _Seq>::_OtherSelf): New.
	(_GLIBCXX_DEBUG_VERIFY_OPERANDS): Define macro.
	(operator==(const _Safe_local_iterator<>&,
	const _Safe_local_iterator<>&)): Use latter, inline as friend.
	(operator!=(const _Safe_local_iterator<>&,
	const _Safe_local_iterator<>&)): Likewise.
	* testsuite/util/testsuite_containers.h: Include utility.
	(struct forward_members_unordered<_Tp, bool>): Remove 2nd template
	parameter.
	(forward_members_unordered<>::forward_members_unordered(value_type&)):
	Add using namespace std::rel_ops.
	Add iterator_concept_checks on local_iterator and const_local_iterator.
	Add asserts on comparison between const_local_iterator and
	local_iterator.
	(struct forward_members_unordered<_Tp, false>): Remove partial
	specialization.
	* testsuite/23_containers/forward_list/types/1.cc: New.
	* testsuite/23_containers/list/types/1.cc: New.

From-SVN: r264039
2018-09-02 10:20:57 +00:00
Jonathan Wakely
9ca2ac699a Forward declare debug containers so std::pmr aliases work
Prior to this change, including a <debug/xxx> header when _GLIBCXX_DEBUG
is also defined would fail to compile in C++17 or later. The <debug/xxx>
header would include the standard <xxx> header which defined
std::pmr::xxx as an alias for std::xxx. But in Debug Mode std::xxx
refers to std::__debug::xxx which has not been defined yet (because it
is in <debug/xxx> after the inclusion of <xxx>).

This adds declarations of the debug containers before including the
non-Debug Mode <xxx> header, so that the std::pmr::xxx aliases work.

	* include/debug/deque (std::__debug::deque): Declare.
	* include/debug/forward_list (std::__debug::forward_list): Declare.
	* include/debug/list (std::__debug::list): Declare.
	* include/debug/map (std::__debug::map): Declare.
	* include/debug/set (std::__debug::set): Declare.
	* include/debug/unordered_map (std::__debug::unordered_map): Declare.
	* include/debug/unordered_set (std::__debug::unordered_set): Declare.
	* include/debug/vector (std::__debug::vector): Declare.
	* testsuite/23_containers/deque/types/pmr_typedefs_debug.cc: New test.
	* testsuite/23_containers/forward_list/pmr_typedefs_debug.cc: New
	test.
	* testsuite/23_containers/list/pmr_typedefs_debug.cc: New test.
	* testsuite/23_containers/map/pmr_typedefs_debug.cc: New test.
	* testsuite/23_containers/multimap/pmr_typedefs_debug.cc: New test.
	* testsuite/23_containers/multiset/pmr_typedefs_debug.cc: New test.
	* testsuite/23_containers/set/pmr_typedefs_debug.cc: New test.
	* testsuite/23_containers/unordered_map/pmr_typedefs_debug.cc: New
	test.
	* testsuite/23_containers/unordered_multimap/pmr_typedefs_debug.cc:
	New test.
	* testsuite/23_containers/unordered_multiset/pmr_typedefs_debug.cc:
	New test.
	* testsuite/23_containers/unordered_set/pmr_typedefs_debug.cc: New
	test.
	* testsuite/23_containers/vector/cons/destructible_debug_neg.cc:
	Adjust dg-error lineno.
	* testsuite/23_containers/vector/types/pmr_typedefs_debug.cc: New
	test.

From-SVN: r263839
2018-08-24 18:43:18 +01:00
Jonathan Wakely
568d5ee44d Define debug mode function for C++98
This function is declared unconditionally but was only defined for C++11
and later, leading to linker errors when the testsuite was run with
-std=gnu++98 -D_GLIBCXX_DEBUG added to the flags.

	* include/debug/vector (__niter_base): Define for C++98.

From-SVN: r263816
2018-08-23 16:23:31 +01:00
Jonathan Wakely
21bf6b2a93 Fix C++11-ism in C++98 member function
* include/debug/string (insert(__const_iterator, _InIter, _InIter)):
	[!_GLIBCXX_USE_CXX11_ABI]: Replace use of C++11-only cbegin() with
	begin(), for C++98 compatibility.

From-SVN: r263809
2018-08-23 12:21:17 +01:00
Jonathan Wakely
3eb1eda1c8 Fix testsuite failures for __gnu_debug::string with old ABI
The __gnu_debug string (mostly) implements the C++11 API, but when it
wraps the old COW string many of the member functions in the base class
have the wrong parameter types or return types. This makes the
__gnu_debug::string type adapt itself to the base class API. This
actually makes the debug string slightly more conforming than the
underlying string type when using the old ABI.

	* include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI]
	(basic_string::__const_iterator): Change access to protected.
	[!_GLIBCXX_USE_CXX11_ABI] (basic_string::__const_iterator): Define
	as typedef for iterator.
	* include/debug/string (__const_iterator): Use typedef from base.
	(insert(const_iterator, _CharT))
	(replace(const_iterator, const_iterator, const basic_string&))
	(replace(const_iterator, const_iterator, const _CharT*, size_type))
	(replace(const_iterator, const_iterator, const CharT*))
	(replace(const_iterator, const_iterator, size_type, _CharT))
	(replace(const_iterator, const_iterator, _InputIter, _InputIter))
	(replace(const_iterator, const_iterator, initializer_list<_CharT>)):
	Change const_iterator parameters to __const_iterator.
	(insert(iterator, size_type, _CharT)): Add C++98 overload.
	(insert(const_iterator, _InputIterator, _InputIterator)): Change
	const_iterator parameter to __const_iterator.
	[!_GLIBCXX_USE_CXX11_ABI]: Add workaround for incorrect return type
	of base's member function.
	(insert(const_iterator, size_type, _CharT)) [!_GLIBCXX_USE_CXX11_ABI]:
	Likewise.
	(insert(const_iterator, initializer_list<_CharT>))
	[!_GLIBCXX_USE_CXX11_ABI]: Likewise.
	* testsuite/21_strings/basic_string/init-list.cc: Remove effective
	target directive.

From-SVN: r263808
2018-08-23 11:51:52 +01:00
François Dumont
e9afbed0d6 re PR libstdc++/68222 (_Safe_iterator provides operators the wrapped iterator can't actually support)
2018-08-22  François Dumont  <fdumont@gcc.gnu.org>

	PR libstdc++/68222
	* include/debug/safe_iterator.h
	(_Safe_iterator<_It, _Sq, _Cat>): Add category template parameter.
	(_Safe_iterator<>::_Const_iterator): Remove.
	(_Safe_iterator<>::_IsConstant): New.
	(_Safe_iterator<>::_OtherIterator): New.
	(_Safe_iterator<_It, _Sq, _Cat>::_Safe_iterator<_MutIte>(
	const _Safe_iterator<_MutIte, _Sq, _Cat>&)): Add _IsConstant::__value in
	__gnu_cxx::__enable_if condition.
	(_Safe_iterator<_It, _Sq, _Cat>::_M_get_distance_to): New.
	(_Safe_iterator<_It, _Sq, _Cat>::_M_get_distance_from_begin): New.
	(_Safe_iterator<_It, _Sq, _Cat>::_M_get_distance_to_end): New.
	(_Safe_iterator<_It, _Sq, std::bidirectional_iterator_tag>): New.
	(_Safe_iterator<_It, _Sq, _Cat>::operator--()): Move...
	(_Safe_iterator<_It, _Sq, std::bidirectional_iterator_tag>
	::operator--()): ...here.
	(_Safe_iterator<_It, _Sq, _Cat>::operator--(int)): Move...
	(_Safe_iterator<_It, _Sq, std::bidirectional_iterator_tag>
	::operator--(int)): ...here.
	(_Safe_iterator<_It, _Sq, _Cat>::_M_decrementable()): Move...
	(_Safe_iterator<_It, _Sq, std::bidirectional_iterator_tag>
	::_M_decrementable()): ...here.
	(_Safe_iterator<_It, _Sq, std::random_access_iterator_tag>): New.
	(_Safe_iterator<_It, _Sq, _Cat>::operator[](const difference_type&)):
	Move...
	(_Safe_iterator<_It, _Sq, std::random_access_iterator_tag>
	::operator[](const difference_type&)): ...here.
	(_Safe_iterator<_It, _Sq, _Cat>::operator+=(const difference_type&)):
	Move...
	(_Safe_iterator<_It, _Sq, std::random_access_iterator_tag>
	::operator+=(const difference_type&)): ...here.
	(_Safe_iterator<_It, _Sq, _Cat>::operator+(const difference_type&)):
	Move...
	(_Safe_iterator<_It, _Sq, std::random_access_iterator_tag>
	::operator+(const difference_type&)): ...here.
	(_Safe_iterator<_It, _Sq, _Cat>::operator-=(const difference_type&)):
	Move...
	(_Safe_iterator<_It, _Sq, std::random_access_iterator_tag>
	::operator-=(const difference_type&)): ...here.
	(_Safe_iterator<_It, _Sq, _Cat>::operator-(const difference_type&)):
	Move...
	(_Safe_iterator<_It, _Sq, std::random_access_iterator_tag>
	::operator-(const difference_type&)): ...here.
	(operator<(const _Safe_iterator<>&, const _Safe_iterator<>&)):
	Constraint to random access iterators.
	(operator<=(const _Safe_iterator<>&, const _Safe_iterator<>&)):
	Likewise.
	(operator>(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise.
	(operator>=(const _Safe_iterator<>&, const _Safe_iterator<>&)):
	Likewise.
	(operator-(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise.
	(operator+(const difference_type&, const _Safe_iterator<>&)): Likewise.
	(__check_dereferenceable(const _Safe_iterator<>&)): Remove.
	(__get_distance): Remove.
	(__get_distance_from_begin): Remove.
	(__get_distance_to_end): Remove.
	(struct __is_safe_random_iterator<_Safe_iterator<>>): Remove partial
	specialization.
	(__base(const _Safe_iterator<>&, std::input_iterator_tag)): Remove.
	(__base(const _Safe_iterator<>&, std::random_access_iterator_tag)): Remove.
	(__base(const _Safe_iterator<>&)): Constraint to random access iterator.
	* include/debug/safe_iterator.tcc
	(_Safe_iterator<>::_M_get_distance_from_begin()): New.
	(_Safe_iterator<>::_M_get_distance_to_end()): New.
	(_Safe_iterator<>::_M_get_distance_to(const _Safe_iterator<>&)): New.
	(_Safe_iterator<_It, _Seq, std::random_access_iterator_tag>
	::_M_valid_range): New.
	* include/debug/safe_local_iterator.h
	(_Safe_local_iterator<>::_Const_local_iterator): Remove.
	(_Safe_local_iterator<>::_IsConstant): New.
	(_Safe_local_iterator<>::_OtherIterator): New.
	(_Safe_local_iterator<_It, _Cont>::_Safe_local_iterator<_MutIte, _Cont>(
	const _Safe_local_iterator<_MutIte, _Seq>&)): Add _IsConstant::__value
	in __gnu_cxx::__enable_if condition. If singular compare base iterator
	with _MutIte rather than _It.
	(_Safe_local_iterator<>::_S_constant): Make constexpr.
	(_Safe_local_iterator<>::_M_get_distance_to): New.
	(__check_dereferenceable(const _Safe_local_iterator<>&)): Remove.
	(__get_distance(const _Safe_local_iterator<>&,
	const _Safe_local_iterator<>&, std::input_iterator_tag)): Remove.
	(__valid_range(const _Safe_local_iterator<>&,
	const _Safe_local_iterator<>&)): New.
	* include/debug/safe_local_iterator.tcc
	(_Safe_local_iterator<>::_M_get_distance_to): New.
	* include/debug/deque (std::__debug::deque<>): Add
	::__gnu_debug::_Safe_iterator<> friend declaration.
	* include/debug/forward_list (std::__debug::forward_list<>): Likewise.
	* include/debug/list (std::__debug::list<>): Likewise.
	* include/debug/map.h (std::__debug::map<>): Likewise.
	* include/debug/multimap.h (std::__debug::multimap<>): Likewise.
	* include/debug/set.h (std::__debug::set<>): Likewise.
	* include/debug/multiset.h (std::__debug::multiset<>): Likewise.
	* include/debug/string (std::__debug::basic_string<>): Likewise.
	* include/debug/unordered_map (std::__debug::unordered_map<>): Likewise
	and add ::__gnu_debug::_Safe_local_iterator<> friend declaration.
	(std::__debug::unordered_multimap<>): Likewise.
	* include/debug/unordered_set (std::__debug::unordered_set<>): Likewise.
	(std::__debug::unordered_multiset<>): Likewise.
	* include/debug/formatter.h: Adapt.
	* include/debug/helper_functions.h
	(__gnu_debug::_Safe_local_iterator<>): Add declaration.
	(__get_distance<_Ite>(_Ite, _Ite, std::random_access_iterator_tag):
	Pass parameter by copy.
	(__get_distance<_Ite>(_Ite, _Ite, std::input_iterator_tag): Likewise.
	(__get_distance<_Ite>(_Ite, _Ite): Likewise.
	(__valid_range_aux<_Integral>): Pass _Integral by copy.
	(__valid_range<_InputIterator>): Pass _InputIterator by copy.
	(__valid_range<>(const _Safe_iterator<>&,
	const _Safe_iterator<>&, typename _Distance_traits<>::__type&)):
	Declare.
	(__valid_range(const _Safe_local_iterator<>&,
	const _Safe_local_iterator<>&, typename _Distance_traits<>::__type&)):
	Declare.
	(__valid_range<>(const _Safe_iterator<>&, const _Safe_iterator<>&)):
	Declare.
	(__valid_range(const _Safe_local_iterator<>&, const _Safe_local_iterator<>&)):
	Declare.
	(__can_advance): Adapt.
	(struct __is_safe_random_iterator<>): Remove.
	(struct _SIter_base<>): Remove.
	* include/debug/functions.h: Include <bits/stl_iterator.h>.
	(__check_dereferenceable): Remove.
	(__foreign_iterator_aux4, __foreign_iterator_aux3): Adapt.
	(__foreign_iterator_aux2, __foreign_iterator_aux): Adapt.
	(__foreign_iterator): Adapt.
	* include/debug/stl_iterator.h
	(__is_safe_random_iterator<std::reverse_iterator<>>): Remove.
	(__base(const std::reverse_iterator<_Safe_iterator<_It, _Sq>)):
	Constraint for random access iterators.
	(__niter_base): Adapt.
	* testsuite/util/testsuite_containers.h:
	Include <bits/boost_concept_check.h>.
	(iterator_concept_checks<_It, _Mutable, _Category>): New.
	(citerator<_Cont>::forward_members::forward_members()): Instantiate
	latter for container iterator and const_iterator.
	* testsuite/23_containers/list/68222_neg.cc: New.
	* testsuite/23_containers/vector/cons/destructible_debug_neg.cc: Adapt
	line number.
	* testsuite/23_containers/unordered_set/debug/debug_functions.cc:
	(test01): Remove.
	* testsuite/23_containers/vector/debug/debug_functions.cc (test01):
	Remove.

From-SVN: r263786
2018-08-22 18:51:25 +00:00
François Dumont
f7191a37ee P0646R1 Improving the Return Value of Erase-Like Algorithms I
2018-08-21  François Dumont  <fdumont@gcc.gnu.org>

	P0646R1 Improving the Return Value of Erase-Like Algorithms I
	* include/debug/forward_list (forward_list::__remove_return_type):
	Define typedef as size_type or void, according to __cplusplus value.
	(_GLIBCXX_FWDLIST_REMOVE_RETURN_TYPE_TAG): Define macro as abi-tag or
	empty, according to __cplusplus value.
	(_GLIBCXX20_ONLY): Define macro.
	(forward_list::remove, forward_list::unique): Use typedef and macro
	to change return type and add abi-tag for C++2a. Return number of
	removed elements for C++2a.
	(forward_list::remove_if<Pred>, forward_list::unique<BinPred>): Use
	typedef to change return type for C++2a. Return number of removed
	elements for C++2a.
	* include/debug/list (list::__remove_return_type): Define typedef as
	size_type or void, according to __cplusplus value.
	(_GLIBCXX_LIST_REMOVE_RETURN_TYPE_TAG): Define macro as abi-tag or
	empty, according to __cplusplus value.
	(_GLIBCXX20_ONLY): Define macro.
	(list::remove, list::unique): Use typedef and macro to change return
	type and add abi-tag for C++2a. Return number of removed elements for
	C++2a.
	(list::remove_if<Predicate>, list::unique<BinaryPredicate>): Use typedef
	to change return type for C++2a. Return number of removed elements for
	C++2a.

From-SVN: r263752
2018-08-21 19:44:41 +00:00
François Dumont
1e736a9531 functions.h (__gnu_debug::__check_string): Move...
2018-07-06  François Dumont  <fdumont@gcc.gnu.org>

	* include/debug/functions.h (__gnu_debug::__check_string): Move...
	* include/debug/string (__gnu_debug::__check_string): ... here.
	(_GLIBCXX_DEBUG_VERIFY_STR_COND_AT): New.
	(__glibcxx_check_string_n_constructor): New.
	(__gnu_debug::basic_string<>(const _CharT*, size_type, const _Alloc&)):
	Use latter.
	(__glibcxx_check_string_constructor): New.
	(__gnu_debug::basic_string<>(const _CharT*, const _Alloc&)):
	Use latter.
	* testsuite/21_strings/basic_string/debug/1_neg.cc: New.
	* testsuite/21_strings/basic_string/debug/2_neg.cc: New.

From-SVN: r262480
2018-07-06 17:02:33 +00:00
François Dumont
96eb9df619 re PR libstdc++/86272 (__gnu_debug::string uses undefined __glibcxx_check_insert_range2)
2018-07-04  François Dumont  <fdumont@gcc.gnu.org>

	PR libstdc++/86272
	* include/debug/string
	(__gnu_debug::basic_string<>::insert<_Ite>(const_iterator, _Ite, _Ite)):
	Use __glibcxx_check_insert_range.
	* 21_strings/basic_string/cons/char/1.cc: Adapt test to use
	__gnu_debug::string when _GLIBCXX_DEBUG.
	* 21_strings/basic_string/init-list.cc: Likewise.
	* 21_strings/basic_string/modifiers/insert/char/1.cc: Likewise.
	* 21_strings/basic_string/modifiers/insert/char/2.cc: Likewise.
	* 21_strings/basic_string/modifiers/insert/char/83328.cc: Likewise.
	* 21_strings/basic_string/types/1.cc: Likewise.

From-SVN: r262417
2018-07-04 18:13:11 +00:00
François Dumont
315aadc864 stl_algobase.h (__niter_wrap): New.
2018-07-03  François Dumont  <fdumont@gcc.gnu.org>

	* include/bits/stl_algobase.h (__niter_wrap): New.
	(__copy_move_a2(_II, _II, _OI)): Use latter.
	(__copy_move_backward_a2(_BI1, _BI1, _BI2)): Likewise.
	(fill_n(_OI, _Size, const _Tp&)): Likewise.
	(equal(_II1, _II1, _II2)): Use __glibcxx_requires_can_increment.
	* include/debug/stl_iterator.h
	(std::__niter_base(const __gnu_cxx::_Safe_iterator<
	__gnu_cxx::__normal_iterator<>, _Sequence>&)): New declaration.
	* include/debug/vector (__niter_base(const __gnu_cxx::_Safe_iterator<
	__gnu_cxx::__normal_iterator<>, _Sequence>&)): New.

From-SVN: r262349
2018-07-03 15:50:12 +00:00
François Dumont
e6cad9872b stl_vector.h (struct _Vector_base<>::_Vector_impl_data): New.
2018-06-27  François Dumont  <fdumont@gcc.gnu.org>

	* include/bits/stl_vector.h
	(struct _Vector_base<>::_Vector_impl_data): New.
	(struct _Vector_base<>::_Vector_impl): Inherit from latter.
	(_Vector_base<>::_Vector_impl::_M_swap_data): Move...
	(_Vector_base<>::_Vector_impl_data::_M_swap_data): ...here.
	(_Vector_base<>::_Vector_impl()): Add noexcept qualification.
	(_Vector_base<>::_Vector_impl(_Vector_impl&&)): New.
	(_Vector_base<>::_Vector_impl(_Tp_alloc_type&&, _Vector_impl&&)): New.
	(_Vector_base(const allocator_type&, _Vector_base&&)): New, use latter.
	(_Vector_base()): Default.
	(_Vector_base(_Vector_base&&)): Default.
	(_Vector_base(size_t)) [_GLIBCXX_INLINE_VERSION]: Delete.
	(_Vector_base(_Tp_alloc_type&&)) [_GLIBCXX_INLINE_VERSION]: Delete.
	(_Vector_base::_M_create_storage(size_t)): Make protected.
	(vector()): Default.
	(vector(vector&&)): Default.
	(vector(vector&&, const allocator_type&, true_type)): New.
	(vector(vector&&, const allocator_type&, false_type)): New.
	(vector(vector&&, const allocator_type&)): Use latters.
	(vector(_InputIte, _InputIte, const allocator_type&)): Call
	_M_range_initialize directly.
	* include/debug/vector
	(vector(vector&&, const allocator_type&)): Add noexcept qualification.
	* testsuite/23_containers/vector/allocator/default_init.cc: New.
	* testsuite/23_containers/vector/cons/noexcept_move_construct.cc: Add
	static assertions.

From-SVN: r262194
2018-06-27 20:23:20 +00:00
Jonathan Wakely
cda121ac7a PR libstdc++/83328 add correct basic_string::insert for initializer_list
The SSO basic_string has a non-standard insert(iterator, initializer_list)
overload, from a C++0x draft. This adds the correct overload, while also
preserving the old one so that the old symbol is still exported from the
library.

The COW basic_string doesn't have any of the C++11 changes to the insert
overloads (they all still have non-const iterator parameters and the
ones that should return an iterator still return void). This doesn't
make any change to the COW string.

	PR libstdc++/83328
	* acinclude.m4 (libtool_VERSION): Bump to 6:26:0.
	* config/abi/pre/gnu.ver: Add GLIBCXX_3.4.26 and export new symbol.
	* configure: Regenerate.
	* include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI]
	(basic_string::insert(const_iterator, initializer_list<C>)): Add.
	[_GLIBCXX_USE_CXX11_ABI && !_GLIBCXX_DEFINING_STRING_INSTANTIATIONS]
	(basic_string::insert(iterator, initializer_list<C>)): Suppress
	definition.
	* include/debug/string (basic_string::insert(iterator, C)): Change
	first parameter to const_iterator.
	(basic_string::insert(iterator, size_type, C)): Likewise. Change
	return type to iterator.
	(basic_string::insert(iterator, InputIterator, InputIterator)):
	Likewise.
	(basic_string::insert(iterator, initializer_list<C>)): Change first
	parameter to const_iterator and return type to iterator.
	* src/c++11/string-inst.cc: Extend comment.
	* testsuite/21_strings/basic_string/modifiers/insert/char/83328.cc:
	New.
	* testsuite/21_strings/basic_string/modifiers/insert/wchar_t/83328.cc:
	New.
	* testsuite/util/testsuite_abi.cc: Add new symbol version.

From-SVN: r261866
2018-06-21 23:01:25 +01:00
François Dumont
802743baca debug.h (_Safe_iterator<>(const _Safe_iterator<_MutableIterator,>& __x)): Compare __x base iterator with a default initialized iterator of the same type.
2018-06-21  François Dumont  <fdumont@gcc.gnu.org>

	* include/debug/debug.h
	(_Safe_iterator<>(const _Safe_iterator<_MutableIterator,>& __x)):
	Compare __x base iterator with a default initialized iterator of the
	same type.

From-SVN: r261831
2018-06-21 05:36:48 +00:00