gcc/libstdc++-v3/include/bits
Patrick Palka a73051a0ea libstdc++: Fix some ranges algos optimizations [PR95578]
ranges::copy and a number of other ranges algorithms have unwrapping
optimizations for iterators of type __normal_iterator, move_iterator and
reverse_iterator.  But in the checks that guard these optimizations we
currently only test that the iterator of the iterator/sentinel pair has
the appropriate type before proceeding with the corresponding
optimization, and do not also test the sentinel type.

This breaks the testcase in this PR because this testcase constructs via
range adaptors a range whose begin() is a __normal_iterator and whose
end() is a custom sentinel type, and then performs ranges::copy on it.
From there we bogusly perform the __normal_iterator unwrapping
optimization on this iterator/sentinel pair, which immediately leads to
a constraint failure since the custom sentinel type does not model
sentinel_for<int*>.

This patch fixes this issue by refining each of the problematic checks
to also test that the iterator and sentinel types are the same before
applying the corresponding unwrapping optimization.  Along the way, some
code simplifications are made.

libstdc++-v3/ChangeLog:

	PR libstdc++/95578
	* include/bits/ranges_algo.h (__lexicographical_compare_fn):
	Also check that the iterator and sentinel have the same type before
	applying the unwrapping optimization for __normal_iterator.
	Split the check into two, one for the first iterator/sentinel
	pair and another for second iterator/sentinel pair.  Remove uses
	of __niter_base, and remove uses of std::move on a
	__normal_iterator.
	* include/bits/ranges_algobase.h (__equal_fn): Likewise.
	(__copy_or_move): Likewise.  Perform similar adjustments for
	the reverse_iterator and move_iterator optimizations.  Inline
	the checks into the if-constexprs, and use using-declarations to
	make them less visually noisy.  Remove uses of __niter_wrap.
	(__copy_or_move_backward): Likewise.
	* testsuite/25_algorithms/copy/95578.cc: New test.
	* testsuite/25_algorithms/copy_backward/95578.cc: New test.
	* testsuite/25_algorithms/equal/95578.cc: New test.
	* testsuite/25_algorithms/lexicographical_compare/95578.cc: New test.
	* testsuite/25_algorithms/move/95578.cc: New test.
	* testsuite/25_algorithms/move_backward/95578.cc: New test.
2020-06-10 17:37:53 -04:00
..
algorithmfwd.h Update copyright years. 2020-01-01 12:51:42 +01:00
alloc_traits.h libstdc++: Avoid errors in allocator's noexcept-specifier (PR 89510) 2020-04-30 16:01:43 +01:00
allocated_ptr.h Update copyright years. 2020-01-01 12:51:42 +01:00
allocator.h libstdc++: Avoid errors in allocator's noexcept-specifier (PR 89510) 2020-04-30 16:01:43 +01:00
atomic_base.h libstdc++: Fix atomic<FP>::load (PR 95282) 2020-05-27 22:55:21 +01:00
atomic_futex.h Update copyright years. 2020-01-01 12:51:42 +01:00
basic_ios.h Update copyright years. 2020-01-01 12:51:42 +01:00
basic_ios.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
basic_string.h libstdc++: Add comparison operators for string and regex types 2020-04-17 16:40:11 +01:00
basic_string.tcc libstdc++: Fix outdated comment about std::string instantiations (PR 94854) 2020-04-29 19:00:58 +01:00
boost_concept_check.h libstdc++: Make _GLIBCXX_CONCEPT_CHECKS more constexpr-friendly 2020-02-27 10:52:28 +00:00
c++0x_warning.h Update copyright years. 2020-01-01 12:51:42 +01:00
c++config libstdc++: Fix freestanding build PR 92376) 2020-01-17 17:03:46 +00:00
char_traits.h libstdc++: Add comparison operators for string and regex types 2020-04-17 16:40:11 +01:00
charconv.h Update copyright years. 2020-01-01 12:51:42 +01:00
codecvt.h Update copyright years. 2020-01-01 12:51:42 +01:00
concept_check.h Update copyright years. 2020-01-01 12:51:42 +01:00
cpp_type_traits.h libstdc++: Fix comment on __memcpyable 2020-03-04 15:35:20 +00:00
deque.tcc libstdc++: Extend memcmp optimization in std::lexicographical_compare 2020-06-10 17:48:56 +01:00
enable_special_members.h Update copyright years. 2020-01-01 12:51:42 +01:00
erase_if.h libstdc++: Update __cpp_lib_erase_if macro (P1115R3) 2020-02-15 10:25:23 +00:00
forward_list.h libstdc++: Add comparison operators to sequence containers 2020-04-17 23:41:04 +01:00
forward_list.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
fs_dir.h libstdc++: Add comparison operators to std::filesystem types 2020-04-15 21:01:42 +01:00
fs_fwd.h libstdc++: Add comparison operators to std::filesystem types 2020-04-15 21:01:42 +01:00
fs_ops.h Update copyright years. 2020-01-01 12:51:42 +01:00
fs_path.h libstdc++: Fix filesystem::u8path for mingw targets (PR 95392) 2020-06-02 00:07:05 +01:00
fstream.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
functexcept.h Update copyright years. 2020-01-01 12:51:42 +01:00
functional_hash.h Update copyright years. 2020-01-01 12:51:42 +01:00
gslice_array.h Update copyright years. 2020-01-01 12:51:42 +01:00
gslice.h Update copyright years. 2020-01-01 12:51:42 +01:00
hashtable_policy.h libstdc++: Review unordered_map insert_or_assign/try_emplace (PR 95079) 2020-05-29 13:12:36 +02:00
hashtable.h libstdc++: Add missing std:: qualification of a forward call 2020-02-12 22:09:41 +01:00
indirect_array.h Update copyright years. 2020-01-01 12:51:42 +01:00
int_limits.h libstdc++: Add lightweight replacement for std::numeric_limits (PR 92546) 2020-02-17 15:11:04 +00:00
invoke.h Update copyright years. 2020-01-01 12:51:42 +01:00
ios_base.h Update copyright years. 2020-01-01 12:51:42 +01:00
istream.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
iterator_concepts.h libstdc++: Remove workarounds for constrained nested class templates 2020-06-04 23:20:49 +01:00
list.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
locale_classes.h libstdc++: Add comparison operators to types from Utilities clause 2020-04-15 19:47:48 +01:00
locale_classes.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
locale_conv.h Update copyright years. 2020-01-01 12:51:42 +01:00
locale_facets_nonio.h Update copyright years. 2020-01-01 12:51:42 +01:00
locale_facets_nonio.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
locale_facets.h Update copyright years. 2020-01-01 12:51:42 +01:00
locale_facets.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
localefwd.h Update copyright years. 2020-01-01 12:51:42 +01:00
mask_array.h Update copyright years. 2020-01-01 12:51:42 +01:00
memoryfwd.h Update copyright years. 2020-01-01 12:51:42 +01:00
move.h Update copyright years. 2020-01-01 12:51:42 +01:00
node_handle.h Update copyright years. 2020-01-01 12:51:42 +01:00
ostream_insert.h Update copyright years. 2020-01-01 12:51:42 +01:00
ostream.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
parse_numbers.h libstdc++: Add lightweight replacement for std::numeric_limits (PR 92546) 2020-02-17 15:11:04 +00:00
postypes.h Update copyright years. 2020-01-01 12:51:42 +01:00
predefined_ops.h Update copyright years. 2020-01-01 12:51:42 +01:00
ptr_traits.h libstdc++: Add missing feature test macros 2020-04-22 22:54:34 +01:00
quoted_string.h Update copyright years. 2020-01-01 12:51:42 +01:00
random.h libstdc++: Reduce header dependencies for C++20 (PR 92546) 2020-02-17 15:43:43 +00:00
random.tcc libstdc++: Fix undefined behaviour in random dist serialization (PR93205) 2020-01-09 16:50:51 +00:00
range_access.h libstdc++: Add missing feature test macros 2020-04-22 22:54:34 +01:00
range_cmp.h libstdc++: Define __cpp_lib_ranges macro for C++20 2020-03-27 23:26:03 +00:00
ranges_algo.h libstdc++: Fix some ranges algos optimizations [PR95578] 2020-06-10 17:37:53 -04:00
ranges_algobase.h libstdc++: Fix some ranges algos optimizations [PR95578] 2020-06-10 17:37:53 -04:00
ranges_uninitialized.h libstdc++: Move-only input iterator support in <memory> algorithms (LWG 3355) 2020-03-03 22:44:39 -05:00
refwrap.h libstdc++: Avoid using sizeof with function types (PR 93470) 2020-01-28 13:24:09 +00:00
regex_automaton.h Update copyright years. 2020-01-01 12:51:42 +01:00
regex_automaton.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
regex_compiler.h Update copyright years. 2020-01-01 12:51:42 +01:00
regex_compiler.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
regex_constants.h Update copyright years. 2020-01-01 12:51:42 +01:00
regex_error.h Update copyright years. 2020-01-01 12:51:42 +01:00
regex_executor.h Update copyright years. 2020-01-01 12:51:42 +01:00
regex_executor.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
regex_scanner.h Update copyright years. 2020-01-01 12:51:42 +01:00
regex_scanner.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
regex.h libstdc++: Add comparison operators for string and regex types 2020-04-17 16:40:11 +01:00
regex.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
shared_ptr_atomic.h Update copyright years. 2020-01-01 12:51:42 +01:00
shared_ptr_base.h libstdc++: Add comparison operators to std::shared_ptr (PR 94562) 2020-04-14 21:54:55 +01:00
shared_ptr.h libstdc++: Add comparison operators to std::shared_ptr (PR 94562) 2020-04-14 21:54:55 +01:00
slice_array.h libstdc++: Add comparison operators to types from Numerics clause 2020-04-08 16:51:59 +01:00
specfun.h Update copyright years. 2020-01-01 12:51:42 +01:00
sstream.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
std_abs.h Update copyright years. 2020-01-01 12:51:42 +01:00
std_function.h libstdc++: Add comparison operators to types from Utilities clause 2020-04-15 19:47:48 +01:00
std_mutex.h Update copyright years. 2020-01-01 12:51:42 +01:00
stl_algo.h libstdc++: Specialize copy/copy_n for istreambuf_iterator and deque iterators 2020-06-04 22:27:47 +02:00
stl_algobase.h libstdc++: Extend memcmp optimization in std::lexicographical_compare 2020-06-10 17:48:56 +01:00
stl_bvector.h libstdc++ std::fill overload for std::vector<bool>::iterator 2020-05-06 23:28:22 +02:00
stl_construct.h libstdc++: Fix regression in std::_Construct (PR 94831) 2020-04-28 23:39:38 +01:00
stl_deque.h libstdc++: Add comparison operators to sequence containers 2020-04-17 23:41:04 +01:00
stl_function.h Update copyright years. 2020-01-01 12:51:42 +01:00
stl_heap.h Update copyright years. 2020-01-01 12:51:42 +01:00
stl_iterator_base_funcs.h Update copyright years. 2020-01-01 12:51:42 +01:00
stl_iterator_base_types.h libstdc++: Define __cpp_lib_ranges macro for C++20 2020-03-27 23:26:03 +00:00
stl_iterator.h libstdc++: Define converting assignment operator for std::move_iterator 2020-06-09 22:16:24 +01:00
stl_list.h libstdc++: Add comparison operators to sequence containers 2020-04-17 23:41:04 +01:00
stl_map.h libstdc++: Remove non-standard feature test macros 2020-04-22 22:54:34 +01:00
stl_multimap.h libstdc++: Add comparison operators to associative containers 2020-04-20 17:50:10 +01:00
stl_multiset.h libstdc++: Add comparison operators to associative containers 2020-04-20 17:50:10 +01:00
stl_numeric.h libstdc++: P1645R1 constexpr for <numeric> algorithms 2020-02-26 10:23:17 -05:00
stl_pair.h libstdc++: Fixes for feature test macros (PR 91480) 2020-04-28 23:40:18 +01:00
stl_queue.h libstdc++: Define operator<=> for std::stack and std::queue 2020-04-19 21:30:15 +01:00
stl_raw_storage_iter.h Update copyright years. 2020-01-01 12:51:42 +01:00
stl_relops.h Update copyright years. 2020-01-01 12:51:42 +01:00
stl_set.h libstdc++: Add comparison operators to associative containers 2020-04-20 17:50:10 +01:00
stl_stack.h libstdc++: Define operator<=> for std::stack and std::queue 2020-04-19 21:30:15 +01:00
stl_tempbuf.h Update copyright years. 2020-01-01 12:51:42 +01:00
stl_tree.h libstdc++: Add comparison operators to associative containers 2020-04-20 17:50:10 +01:00
stl_uninitialized.h Update copyright years. 2020-01-01 12:51:42 +01:00
stl_vector.h libstdc++: Add comparison operators to sequence containers 2020-04-17 23:41:04 +01:00
stream_iterator.h libstdc++: Fix compilation with released versions of Clang 2020-03-18 12:55:29 +00:00
streambuf_iterator.h libstdc++: Specialize copy/copy_n for istreambuf_iterator and deque iterators 2020-06-04 22:27:47 +02:00
streambuf.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
string_view.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
stringfwd.h Update copyright years. 2020-01-01 12:51:42 +01:00
uniform_int_dist.h libstdc++: Reduce header dependencies for C++20 (PR 92546) 2020-02-17 15:43:43 +00:00
unique_lock.h Update copyright years. 2020-01-01 12:51:42 +01:00
unique_ptr.h libstdc++: Implement operator<< for std::unique_ptr (LWG 2948) 2020-06-08 21:21:31 +01:00
unordered_map.h libstdc++: Review unordered_map insert_or_assign/try_emplace (PR 95079) 2020-05-29 13:12:36 +02:00
unordered_set.h libstdc++: Remove operator!= overloads for unordered containers 2020-04-19 21:05:32 +01:00
uses_allocator.h Update copyright years. 2020-01-01 12:51:42 +01:00
valarray_after.h Update copyright years. 2020-01-01 12:51:42 +01:00
valarray_array.h Update copyright years. 2020-01-01 12:51:42 +01:00
valarray_array.tcc Update copyright years. 2020-01-01 12:51:42 +01:00
valarray_before.h Update copyright years. 2020-01-01 12:51:42 +01:00
vector.tcc Update copyright years. 2020-01-01 12:51:42 +01:00