[libcxx-commits] [libcxx] [libc++][C++03] Split libc++-specific tests for the frozen headers (PR #144093)
via libcxx-commits
libcxx-commits at lists.llvm.org
Sat Jun 14 09:39:30 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxx
Author: Nikolas Klauser (philnik777)
<details>
<summary>Changes</summary>
The C++03 headers are essentially a separate implementation, so it doesn't make a ton of sense to try to test two implementations with a single set of implementation-specific tests.
Most of the tests will be removed in a follow-up, since they don't run in C++03 mode. This patch adds them to make as few changes to the copy as possible. The most notable changes are that `lit.local.cfg` files are touched to change the path from `libcxx/test/libcxx` to `libcxx/test/libcxx-03` in a few places.
This also modifies `lit.local.cfg` files to run `libcxx/test/libcxx-03` only when using the frozen headers and `lbcxx/test/libcxx` tests only when _not_ using the frozen headers.
This is part of https://discourse.llvm.org/t/rfc-freezing-c-03-headers-in-libc.
---
Patch is 2.92 MiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/144093.diff
921 Files Affected:
- (added) libcxx/test/libcxx-03/Wnon_modular_include_in_module.compile.pass.cpp (+21)
- (added) libcxx/test/libcxx-03/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.cxx1z.pass.cpp (+51)
- (added) libcxx/test/libcxx-03/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.depr_in_cxx14.verify.cpp (+43)
- (added) libcxx/test/libcxx-03/algorithms/alg.modifying.operations/copy_move_nontrivial.pass.cpp (+331)
- (added) libcxx/test/libcxx-03/algorithms/alg.modifying.operations/copy_move_trivial.pass.cpp (+334)
- (added) libcxx/test/libcxx-03/algorithms/alg.modifying.operations/copy_move_unwrap_reverse.pass.cpp (+141)
- (added) libcxx/test/libcxx-03/algorithms/alg.sorting/alg.heap.operations/make.heap/complexity.pass.cpp (+75)
- (added) libcxx/test/libcxx-03/algorithms/alg.sorting/assert.min.max.pass.cpp (+30)
- (added) libcxx/test/libcxx-03/algorithms/alg.sorting/assert.sort.invalid_comparator/assert.sort.invalid_comparator.oob.pass.cpp (+72)
- (added) libcxx/test/libcxx-03/algorithms/alg.sorting/assert.sort.invalid_comparator/assert.sort.invalid_comparator.pass.cpp (+195)
- (added) libcxx/test/libcxx-03/algorithms/alg.sorting/assert.sort.invalid_comparator/bad_comparator_values.h (+3565)
- (added) libcxx/test/libcxx-03/algorithms/alg.sorting/assert.sort.invalid_comparator/invalid_comparator_utilities.h (+85)
- (added) libcxx/test/libcxx-03/algorithms/alg.sorting/pstl.is_partitioned.pass.cpp (+31)
- (added) libcxx/test/libcxx-03/algorithms/bad_iterator_traits.verify.cpp (+61)
- (added) libcxx/test/libcxx-03/algorithms/callable-requirements-rvalue.compile.pass.cpp (+46)
- (added) libcxx/test/libcxx-03/algorithms/callable-requirements.verify.cpp (+118)
- (added) libcxx/test/libcxx-03/algorithms/cpp17_iterator_concepts.verify.cpp (+425)
- (added) libcxx/test/libcxx-03/algorithms/debug_less.inconsistent.pass.cpp (+52)
- (added) libcxx/test/libcxx-03/algorithms/debug_less.pass.cpp (+260)
- (added) libcxx/test/libcxx-03/algorithms/debug_three_way_comp.inconsistent.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/algorithms/half_positive.pass.cpp (+59)
- (added) libcxx/test/libcxx-03/algorithms/lifetimebound.verify.cpp (+81)
- (added) libcxx/test/libcxx-03/algorithms/no_specializations.verify.cpp (+28)
- (added) libcxx/test/libcxx-03/algorithms/nth_element_stability.pass.cpp (+101)
- (added) libcxx/test/libcxx-03/algorithms/partial_sort_stability.pass.cpp (+102)
- (added) libcxx/test/libcxx-03/algorithms/pstl.iterator-requirements.verify.cpp (+193)
- (added) libcxx/test/libcxx-03/algorithms/pstl.libdispatch.chunk_partitions.pass.cpp (+41)
- (added) libcxx/test/libcxx-03/algorithms/ranges_robust_against_copying_comparators.pass.cpp (+264)
- (added) libcxx/test/libcxx-03/algorithms/ranges_robust_against_copying_projections.pass.cpp (+278)
- (added) libcxx/test/libcxx-03/algorithms/robust_against_copying_comparators.pass.cpp (+323)
- (added) libcxx/test/libcxx-03/algorithms/robust_against_cpp20_hostile_iterators.compile.pass.cpp (+225)
- (added) libcxx/test/libcxx-03/algorithms/robust_against_using_non_transparent_comparators.pass.cpp (+80)
- (added) libcxx/test/libcxx-03/algorithms/sort_stability.pass.cpp (+100)
- (added) libcxx/test/libcxx-03/algorithms/specialized.algorithms/special.mem.concepts/nothrow_forward_iterator.compile.pass.cpp (+27)
- (added) libcxx/test/libcxx-03/algorithms/specialized.algorithms/special.mem.concepts/nothrow_forward_range.compile.pass.cpp (+29)
- (added) libcxx/test/libcxx-03/algorithms/specialized.algorithms/special.mem.concepts/nothrow_input_iterator.compile.pass.cpp (+30)
- (added) libcxx/test/libcxx-03/algorithms/specialized.algorithms/special.mem.concepts/nothrow_input_range.compile.pass.cpp (+32)
- (added) libcxx/test/libcxx-03/algorithms/specialized.algorithms/special.mem.concepts/nothrow_sentinel_for.compile.pass.cpp (+35)
- (added) libcxx/test/libcxx-03/algorithms/vectorization.compile.pass.cpp (+34)
- (added) libcxx/test/libcxx-03/assertions/customize_verbose_abort.compile-time.pass.cpp (+27)
- (added) libcxx/test/libcxx-03/assertions/customize_verbose_abort.link-time.pass.cpp (+25)
- (added) libcxx/test/libcxx-03/assertions/default_verbose_abort.pass.cpp (+28)
- (added) libcxx/test/libcxx-03/assertions/modes/debug.pass.cpp (+26)
- (added) libcxx/test/libcxx-03/assertions/modes/extensive.pass.cpp (+26)
- (added) libcxx/test/libcxx-03/assertions/modes/fast.pass.cpp (+26)
- (added) libcxx/test/libcxx-03/assertions/modes/hardening_mode_incorrect_value.sh.cpp (+26)
- (added) libcxx/test/libcxx-03/assertions/modes/none.pass.cpp (+32)
- (added) libcxx/test/libcxx-03/assertions/modes/override_with_debug_mode.pass.cpp (+27)
- (added) libcxx/test/libcxx-03/assertions/modes/override_with_extensive_mode.pass.cpp (+32)
- (added) libcxx/test/libcxx-03/assertions/modes/override_with_fast_mode.pass.cpp (+31)
- (added) libcxx/test/libcxx-03/assertions/modes/override_with_unchecked_mode.pass.cpp (+24)
- (added) libcxx/test/libcxx-03/assertions/single_expression.pass.cpp (+34)
- (added) libcxx/test/libcxx-03/atomics/atomics.align/align.pass.cpp (+113)
- (added) libcxx/test/libcxx-03/atomics/atomics.flag/init_bool.pass.cpp (+43)
- (added) libcxx/test/libcxx-03/atomics/atomics.order/memory_order.underlying_type.pass.cpp (+34)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/assert.compare_exchange_strong.pass.cpp (+59)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/assert.compare_exchange_weak.pass.cpp (+59)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/assert.ctor.pass.cpp (+41)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/assert.load.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/assert.store.pass.cpp (+64)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/assert.wait.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/compare_exchange_strong.verify.cpp (+39)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/compare_exchange_weak.verify.cpp (+39)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/load.verify.cpp (+34)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/store.verify.cpp (+36)
- (added) libcxx/test/libcxx-03/atomics/atomics.ref/wait.verify.cpp (+36)
- (added) libcxx/test/libcxx-03/atomics/atomics.syn/compatible_with_stdatomic.compile.pass.cpp (+23)
- (added) libcxx/test/libcxx-03/atomics/atomics.syn/incompatible_with_stdatomic.verify.cpp (+25)
- (added) libcxx/test/libcxx-03/atomics/atomics.syn/wait.issue_85107.pass.cpp (+54)
- (added) libcxx/test/libcxx-03/atomics/atomics.types.generic/atomics.types.float/lockfree.pass.cpp (+51)
- (added) libcxx/test/libcxx-03/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.verify.cpp (+76)
- (added) libcxx/test/libcxx-03/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.verify.cpp (+79)
- (added) libcxx/test/libcxx-03/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.verify.cpp (+76)
- (added) libcxx/test/libcxx-03/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.verify.cpp (+79)
- (added) libcxx/test/libcxx-03/atomics/bit-int.verify.cpp (+22)
- (added) libcxx/test/libcxx-03/atomics/diagnose_invalid_memory_order.verify.cpp (+122)
- (added) libcxx/test/libcxx-03/atomics/stdatomic.h.syn/dont_hijack_header.compile.pass.cpp (+24)
- (added) libcxx/test/libcxx-03/atomics/stdatomic.h.syn/dont_hijack_header.cxx23.compile.pass.cpp (+28)
- (added) libcxx/test/libcxx-03/clang_modules_include.gen.py (+97)
- (added) libcxx/test/libcxx-03/clang_tidy.gen.py (+40)
- (added) libcxx/test/libcxx-03/clang_tidy.sh.py (+11)
- (added) libcxx/test/libcxx-03/concepts/concepts.arithmetic/__libcpp_integer.compile.pass.cpp (+63)
- (added) libcxx/test/libcxx-03/concepts/concepts.arithmetic/__libcpp_signed_integer.compile.pass.cpp (+63)
- (added) libcxx/test/libcxx-03/concepts/concepts.arithmetic/__libcpp_unsigned_integer.compile.pass.cpp (+63)
- (added) libcxx/test/libcxx-03/containers/associative/map/at.abort.pass.cpp (+33)
- (added) libcxx/test/libcxx-03/containers/associative/map/at.const.abort.pass.cpp (+33)
- (added) libcxx/test/libcxx-03/containers/associative/map/find.modules.compile.pass.mm (+16)
- (added) libcxx/test/libcxx-03/containers/associative/map/scary.compile.pass.cpp (+26)
- (added) libcxx/test/libcxx-03/containers/associative/non_const_comparator.incomplete.verify.cpp (+56)
- (added) libcxx/test/libcxx-03/containers/associative/non_const_comparator.verify.cpp (+48)
- (added) libcxx/test/libcxx-03/containers/associative/reference_comparator_abi.compile.pass.cpp (+57)
- (added) libcxx/test/libcxx-03/containers/associative/set/scary.compile.pass.cpp (+26)
- (added) libcxx/test/libcxx-03/containers/associative/tree_balance_after_insert.pass.cpp (+1612)
- (added) libcxx/test/libcxx-03/containers/associative/tree_key_value_traits.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/containers/associative/tree_left_rotate.pass.cpp (+100)
- (added) libcxx/test/libcxx-03/containers/associative/tree_remove.pass.cpp (+1646)
- (added) libcxx/test/libcxx-03/containers/associative/tree_right_rotate.pass.cpp (+100)
- (added) libcxx/test/libcxx-03/containers/associative/unord.map/abi.compile.pass.cpp (+141)
- (added) libcxx/test/libcxx-03/containers/associative/unord.map/scary.compile.pass.cpp (+28)
- (added) libcxx/test/libcxx-03/containers/associative/unord.set/abi.compile.pass.cpp (+139)
- (added) libcxx/test/libcxx-03/containers/associative/unord.set/scary.compile.pass.cpp (+28)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.map/assert.input_range.pass.cpp (+66)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.map/assert.sorted_unique.pass.cpp (+225)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.map/scary.compile.pass.cpp (+33)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.multimap/assert.input_range.pass.cpp (+66)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.multimap/assert.sorted_equivalent.pass.cpp (+225)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.multiset/assert.sorted_unique.pass.cpp (+131)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.multiset/insert.temporary.pass.cpp (+48)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.multiset/insert_range.pass.cpp (+46)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.multiset/iterator.compile.pass.cpp (+42)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.set/assert.sorted_unique.pass.cpp (+226)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.set/insert.temporary.pass.cpp (+48)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.set/insert_range.pass.cpp (+46)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.set/iterator.compile.pass.cpp (+42)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat.set/scary.compile.pass.cpp (+33)
- (added) libcxx/test/libcxx-03/containers/container.adaptors/flat_helpers.h (+48)
- (added) libcxx/test/libcxx-03/containers/container_traits.compile.pass.cpp (+165)
- (added) libcxx/test/libcxx-03/containers/gnu_cxx/hash_map.pass.cpp (+36)
- (added) libcxx/test/libcxx-03/containers/gnu_cxx/hash_map_name_lookup.pass.cpp (+36)
- (added) libcxx/test/libcxx-03/containers/gnu_cxx/hash_set.pass.cpp (+36)
- (added) libcxx/test/libcxx-03/containers/gnu_cxx/hash_set_name_lookup.pass.cpp (+36)
- (added) libcxx/test/libcxx-03/containers/sequences/array/triviality.pass.cpp (+51)
- (added) libcxx/test/libcxx-03/containers/sequences/deque/abi.compile.pass.cpp (+117)
- (added) libcxx/test/libcxx-03/containers/sequences/deque/asan.pass.cpp (+68)
- (added) libcxx/test/libcxx-03/containers/sequences/deque/asan_caterpillar.pass.cpp (+53)
- (added) libcxx/test/libcxx-03/containers/sequences/deque/asan_turning_off.pass.cpp (+77)
- (added) libcxx/test/libcxx-03/containers/sequences/deque/assert.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/containers/sequences/deque/assert.pop_back.empty.pass.cpp (+29)
- (added) libcxx/test/libcxx-03/containers/sequences/deque/incomplete.pass.cpp (+34)
- (added) libcxx/test/libcxx-03/containers/sequences/deque/segmented_iterator.compile.pass.cpp (+12)
- (added) libcxx/test/libcxx-03/containers/sequences/deque/spare_block_handling.pass.cpp (+288)
- (added) libcxx/test/libcxx-03/containers/sequences/forwardlist/assert.pass.cpp (+47)
- (added) libcxx/test/libcxx-03/containers/sequences/forwardlist/bool-conversion.pass.cpp (+37)
- (added) libcxx/test/libcxx-03/containers/sequences/list/abi.compile.pass.cpp (+87)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.cons/debug.copy.pass.cpp (+30)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/assert.erase_iter.end.pass.cpp (+29)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/assert.pop_back.empty.pass.cpp (+35)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/bool-conversion.pass.cpp (+37)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/debug.emplace.pass.cpp (+34)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/debug.erase.iter.pass.cpp (+28)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/debug.erase.iter_iter.pass.cpp (+57)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/debug.insert.iter_iter_iter.pass.cpp (+29)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/debug.insert.iter_rvalue.pass.cpp (+27)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/debug.insert.iter_size_value.pass.cpp (+27)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.modifiers/debug.insert.iter_value.pass.cpp (+28)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.ops/debug.splice.pos_list.pass.cpp (+26)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.ops/debug.splice.pos_list_iter.pass.cpp (+28)
- (added) libcxx/test/libcxx-03/containers/sequences/list/list.ops/debug.splice.pos_list_iter_iter.pass.cpp (+28)
- (added) libcxx/test/libcxx-03/containers/sequences/vector.bool/abi.compile.pass.cpp (+69)
- (added) libcxx/test/libcxx-03/containers/sequences/vector.bool/assert.pass.cpp (+63)
- (added) libcxx/test/libcxx-03/containers/sequences/vector.bool/trivial_for_purposes_of_call.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/abi.compile.pass.cpp (+95)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/asan.pass.cpp (+76)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/asan_throw.pass.cpp (+233)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/asan_turning_off.pass.cpp (+77)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.back.empty.pass.cpp (+43)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.cback.empty.pass.cpp (+39)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.cfront.empty.pass.cpp (+39)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.cindex.oob.pass.cpp (+42)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.front.empty.pass.cpp (+44)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.index.oob.pass.cpp (+42)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.iterator.add.pass.cpp (+49)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.iterator.decrement.pass.cpp (+44)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.iterator.dereference.pass.cpp (+42)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.iterator.increment.pass.cpp (+47)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.iterator.index.pass.cpp (+51)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/assert.pop_back.empty.pass.cpp (+29)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/debug.iterator.compare.pass.cpp (+39)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/debug.iterator.subtract.pass.cpp (+39)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/erase.modules.compile.pass.mm (+16)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/exception_safety_exceptions_disabled.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/fill_to_capacity.h (+24)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/invalid_allocator.verify.cpp (+29)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/robust_against_adl.pass.cpp (+54)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp (+59)
- (added) libcxx/test/libcxx-03/containers/strings/basic.string/asan.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/containers/strings/basic.string/asan_deque_integration.pass.cpp (+182)
- (added) libcxx/test/libcxx-03/containers/strings/basic.string/asan_short.pass.cpp (+56)
- (added) libcxx/test/libcxx-03/containers/strings/basic.string/asan_turning_off.pass.cpp (+102)
- (added) libcxx/test/libcxx-03/containers/strings/basic.string/asan_vector_integration.pass.cpp (+182)
- (added) libcxx/test/libcxx-03/containers/unord/key_value_traits.pass.cpp (+60)
- (added) libcxx/test/libcxx-03/containers/unord/next_pow2.pass.cpp (+78)
- (added) libcxx/test/libcxx-03/containers/unord/next_prime.pass.cpp (+51)
- (added) libcxx/test/libcxx-03/containers/unord/non_const_comparator.incomplete.verify.cpp (+58)
- (added) libcxx/test/libcxx-03/containers/unord/non_const_comparator.verify.cpp (+58)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/assert.bucket.pass.cpp (+29)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/assert.bucket_size.pass.cpp (+33)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/assert.iterator.dereference.pass.cpp (+52)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/assert.iterator.increment.pass.cpp (+59)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/assert.local_iterator.dereference.pass.cpp (+50)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/assert.local_iterator.increment.pass.cpp (+66)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/assert.max_load_factor.pass.cpp (+34)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/at.abort.pass.cpp (+32)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/at.const.abort.pass.cpp (+32)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/debug.insert.hint_const_lvalue.pass.cpp (+41)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/debug.insert.hint_rvalue.pass.cpp (+35)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/debug.swap.pass.cpp (+38)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/unord.map.modifiers/debug.erase.iter.pass.cpp (+43)
- (added) libcxx/test/libcxx-03/containers/unord/unord.map/unord.map.modifiers/debug.erase.iter_iter.pass.cpp (+64)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/assert.bucket.pass.cpp (+33)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/assert.bucket_size.pass.cpp (+33)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/assert.iterator.dereference.pass.cpp (+52)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/assert.iterator.increment.pass.cpp (+59)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/assert.local_iterator.dereference.pass.cpp (+50)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/assert.local_iterator.increment.pass.cpp (+67)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/assert.max_load_factor.pass.cpp (+34)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/debug.insert.hint_const_lvalue.pass.cpp (+33)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/debug.insert.hint_rvalue.pass.cpp (+34)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/debug.swap.pass.cpp (+38)
- (added) libcxx/test/libcxx-03/containers/unord/unord.multimap/unord.multimap.modifiers/debug.erase.iter.pass.cpp (+43)
``````````diff
diff --git a/libcxx/test/libcxx-03/Wnon_modular_include_in_module.compile.pass.cpp b/libcxx/test/libcxx-03/Wnon_modular_include_in_module.compile.pass.cpp
new file mode 100644
index 0000000000000..aa7a6d98d7d68
--- /dev/null
+++ b/libcxx/test/libcxx-03/Wnon_modular_include_in_module.compile.pass.cpp
@@ -0,0 +1,21 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: target={{.*}}-apple-{{.*}}
+// UNSUPPORTED: c++03
+
+// This test ensures that libc++ supports being compiled with modules enabled and with
+// -Wnon-modular-include-in-module. This effectively checks that we don't include any
+// non-modular header from the library.
+//
+// Since most underlying platforms are not modularized properly, this test currently only
+// works on Apple platforms.
+
+// ADDITIONAL_COMPILE_FLAGS: -Wnon-modular-include-in-module -Wsystem-headers-in-module=std -fmodules -fcxx-modules
+
+#include <vector>
diff --git a/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.cxx1z.pass.cpp b/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.cxx1z.pass.cpp
new file mode 100644
index 0000000000000..4e51014f20b18
--- /dev/null
+++ b/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.cxx1z.pass.cpp
@@ -0,0 +1,51 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <algorithm>
+
+// template <class RandomAccessIterator>
+// void
+// random_shuffle(RandomAccessIterator first, RandomAccessIterator last);
+//
+// template <class RandomAccessIterator, class RandomNumberGenerator>
+// void
+// random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
+// RandomNumberGenerator& rand);
+
+//
+// In C++17, random_shuffle has been removed.
+// However, for backwards compatibility, if _LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE
+// is defined before including <algorithm>, then random_shuffle will be restored.
+
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+
+#include <algorithm>
+#include <cstddef>
+#include <vector>
+
+#include "test_macros.h"
+
+struct gen
+{
+ std::ptrdiff_t operator()(std::ptrdiff_t n)
+ {
+ return n-1;
+ }
+};
+
+
+int main(int, char**)
+{
+ std::vector<int> v;
+ std::random_shuffle(v.begin(), v.end());
+ gen r;
+ std::random_shuffle(v.begin(), v.end(), r);
+
+ return 0;
+}
diff --git a/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.depr_in_cxx14.verify.cpp b/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.depr_in_cxx14.verify.cpp
new file mode 100644
index 0000000000000..057f126a93cfe
--- /dev/null
+++ b/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.depr_in_cxx14.verify.cpp
@@ -0,0 +1,43 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <algorithm>
+
+// template <class RandomAccessIterator>
+// void
+// random_shuffle(RandomAccessIterator first, RandomAccessIterator last);
+//
+// template <class RandomAccessIterator, class RandomNumberGenerator>
+// void
+// random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
+// RandomNumberGenerator& rand);
+
+// UNSUPPORTED: c++03, c++11
+
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE
+
+#include <algorithm>
+#include <cstddef>
+
+#include "test_macros.h"
+
+struct gen
+{
+ std::ptrdiff_t operator()(std::ptrdiff_t n)
+ {
+ return n-1;
+ }
+};
+
+
+void f() {
+ int v[1] = {1};
+ std::random_shuffle(&v[0], &v[1]); // expected-warning {{'random_shuffle<int *>' is deprecated}}
+ gen r;
+ std::random_shuffle(&v[0], &v[1], r); // expected-warning {{'random_shuffle<int *, gen &>' is deprecated}}
+}
diff --git a/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/copy_move_nontrivial.pass.cpp b/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/copy_move_nontrivial.pass.cpp
new file mode 100644
index 0000000000000..0c5ae84d97700
--- /dev/null
+++ b/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/copy_move_nontrivial.pass.cpp
@@ -0,0 +1,331 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// In the modules build, adding another overload of `memmove` doesn't work.
+// UNSUPPORTED: clang-modules-build
+// GCC complains about "ambiguating" `__builtin_memmove`.
+// UNSUPPORTED: gcc
+
+// <algorithm>
+
+#include <cassert>
+#include <cstddef>
+
+// These tests check that `std::copy` and `std::move` (including their variations like `copy_n`) don't forward to
+// `std::memmove` when doing so would be observable.
+
+// This template is a better match than the actual `builtin_memmove` (it can match the pointer type exactly, without an
+// implicit conversion to `void*`), so it should hijack the call inside `std::copy` and similar algorithms if it's made.
+template <class Dst, class Src>
+constexpr void* __builtin_memmove(Dst*, Src*, std::size_t) {
+ assert(false);
+ return nullptr;
+}
+
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <iterator>
+#include <ranges>
+#include <type_traits>
+
+#include "test_iterators.h"
+#include "test_macros.h"
+
+// S1 and S2 are simple structs that are convertible to each other and have the same bit representation.
+struct S1 {
+ int x;
+
+ constexpr S1() = default;
+ constexpr S1(int set_x) : x(set_x) {}
+
+ friend constexpr bool operator==(const S1& lhs, const S1& rhs) { return lhs.x == rhs.x; }
+};
+
+struct S2 {
+ int x;
+
+ constexpr S2() = default;
+ constexpr S2(int set_x) : x(set_x) {}
+ constexpr S2(S1 from) : x(from.x) {}
+
+ friend constexpr bool operator==(const S1& lhs, const S2& rhs) { return lhs.x == rhs.x; }
+ friend constexpr bool operator==(const S2& lhs, const S2& rhs) { return lhs.x == rhs.x; }
+};
+
+// U1 and U2 are simple unions that are convertible to each other and have the same bit representation.
+union U1 {
+ int x;
+
+ constexpr U1() = default;
+ constexpr U1(int set_x) : x(set_x) {}
+
+ friend constexpr bool operator==(const U1& lhs, const U1& rhs) { return lhs.x == rhs.x; }
+};
+
+union U2 {
+ int x;
+
+ constexpr U2() = default;
+ constexpr U2(int set_x) : x(set_x) {}
+ constexpr U2(U1 from) : x(from.x) {}
+
+ friend constexpr bool operator==(const U1& lhs, const U2& rhs) { return lhs.x == rhs.x; }
+ friend constexpr bool operator==(const U2& lhs, const U2& rhs) { return lhs.x == rhs.x; }
+};
+
+struct NonTrivialMoveAssignment {
+ int i;
+
+ constexpr NonTrivialMoveAssignment() = default;
+ constexpr NonTrivialMoveAssignment(int set_i) : i(set_i) {}
+
+ constexpr NonTrivialMoveAssignment(NonTrivialMoveAssignment&& rhs) = default;
+ constexpr NonTrivialMoveAssignment& operator=(NonTrivialMoveAssignment&& rhs) noexcept {
+ i = rhs.i;
+ return *this;
+ }
+
+ constexpr friend bool operator==(const NonTrivialMoveAssignment&, const NonTrivialMoveAssignment&) = default;
+};
+
+static_assert(!std::is_trivially_move_assignable_v<NonTrivialMoveAssignment>);
+static_assert(!std::is_trivially_assignable<NonTrivialMoveAssignment&, NonTrivialMoveAssignment&>::value);
+
+struct NonTrivialMoveCtr {
+ int i;
+
+ constexpr NonTrivialMoveCtr() = default;
+ constexpr NonTrivialMoveCtr(int set_i) : i(set_i) {}
+
+ constexpr NonTrivialMoveCtr(NonTrivialMoveCtr&& rhs) noexcept : i(rhs.i) {}
+ constexpr NonTrivialMoveCtr& operator=(NonTrivialMoveCtr&& rhs) = default;
+
+ constexpr friend bool operator==(const NonTrivialMoveCtr&, const NonTrivialMoveCtr&) = default;
+};
+
+static_assert(std::is_trivially_move_assignable_v<NonTrivialMoveCtr>);
+static_assert(!std::is_trivially_copyable_v<NonTrivialMoveCtr>);
+
+struct NonTrivialCopyAssignment {
+ int i;
+
+ constexpr NonTrivialCopyAssignment() = default;
+ constexpr NonTrivialCopyAssignment(int set_i) : i(set_i) {}
+
+ constexpr NonTrivialCopyAssignment(const NonTrivialCopyAssignment& rhs) = default;
+ constexpr NonTrivialCopyAssignment& operator=(const NonTrivialCopyAssignment& rhs) {
+ i = rhs.i;
+ return *this;
+ }
+
+ constexpr friend bool operator==(const NonTrivialCopyAssignment&, const NonTrivialCopyAssignment&) = default;
+};
+
+static_assert(!std::is_trivially_copy_assignable_v<NonTrivialCopyAssignment>);
+
+struct NonTrivialCopyCtr {
+ int i;
+
+ constexpr NonTrivialCopyCtr() = default;
+ constexpr NonTrivialCopyCtr(int set_i) : i(set_i) {}
+
+ constexpr NonTrivialCopyCtr(const NonTrivialCopyCtr& rhs) : i(rhs.i) {}
+ constexpr NonTrivialCopyCtr& operator=(const NonTrivialCopyCtr& rhs) = default;
+
+ constexpr friend bool operator==(const NonTrivialCopyCtr&, const NonTrivialCopyCtr&) = default;
+};
+
+static_assert(std::is_trivially_copy_assignable_v<NonTrivialCopyCtr>);
+static_assert(!std::is_trivially_copyable_v<NonTrivialCopyCtr>);
+
+template <class T>
+constexpr T make(int from) {
+ return T(from);
+}
+
+template <typename PtrT, typename T = std::remove_pointer_t<PtrT>>
+static T make_internal_array[5] = {T(), T(), T(), T(), T()};
+
+template <class T>
+requires std::is_pointer_v<T>
+constexpr T make(int i) {
+ if constexpr (!std::same_as<std::remove_pointer_t<T>, void>) {
+ return make_internal_array<T> + i;
+ } else {
+ return make_internal_array<int> + i;
+ }
+}
+
+template <class InIter, template <class> class SentWrapper, class OutIter, class Func>
+constexpr void test_one(Func func) {
+ using From = typename std::iterator_traits<InIter>::value_type;
+ using To = typename std::iterator_traits<OutIter>::value_type;
+
+ {
+ const std::size_t N = 5;
+
+ From input[N] = {make<From>(0), make<From>(1), make<From>(2), make<From>(3), make<From>(4)};
+ To output[N];
+
+ auto in = InIter(input);
+ auto in_end = InIter(input + N);
+ auto sent = SentWrapper<decltype(in_end)>(in_end);
+ auto out = OutIter(output);
+
+ func(in, sent, out, N);
+ if constexpr (!std::same_as<To, bool>) {
+ assert(std::equal(input, input + N, output));
+ } else {
+ bool expected[N] = {false, true, true, true, true};
+ assert(std::equal(output, output + N, expected));
+ }
+ }
+
+ {
+ const std::size_t N = 0;
+
+ From input[1] = {make<From>(1)};
+ To output[1] = {make<To>(2)};
+
+ auto in = InIter(input);
+ auto in_end = InIter(input + N);
+ auto sent = SentWrapper<decltype(in_end)>(in_end);
+ auto out = OutIter(output);
+
+ func(in, sent, out, N);
+ assert(output[0] == make<To>(2));
+ }
+}
+
+template <class InIter, template <class> class SentWrapper, class OutIter>
+constexpr void test_copy() {
+ // Classic.
+ if constexpr (std::same_as<InIter, SentWrapper<InIter>>) {
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto last, auto out, std::size_t) {
+ std::copy(first, last, out);
+ });
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto last, auto out, std::size_t n) {
+ std::copy_backward(first, last, out + n);
+ });
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto, auto out, std::size_t n) {
+ std::copy_n(first, n, out);
+ });
+ }
+
+ // Ranges.
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto last, auto out, std::size_t) {
+ std::ranges::copy(first, last, out);
+ });
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto last, auto out, std::size_t n) {
+ std::ranges::copy_backward(first, last, out + n);
+ });
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto, auto out, std::size_t n) {
+ std::ranges::copy_n(first, n, out);
+ });
+}
+
+template <class InIter, template <class> class SentWrapper, class OutIter>
+constexpr void test_move() {
+ if constexpr (std::same_as<InIter, SentWrapper<InIter>>) {
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto last, auto out, std::size_t) {
+ std::move(first, last, out);
+ });
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto last, auto out, std::size_t n) {
+ std::move_backward(first, last, out + n);
+ });
+ }
+
+ // Ranges.
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto last, auto out, std::size_t) {
+ std::ranges::move(first, last, out);
+ });
+ test_one<InIter, SentWrapper, OutIter>([](auto first, auto last, auto out, std::size_t n) {
+ std::ranges::move_backward(first, last, out + n);
+ });
+}
+
+template <class From, class To = From>
+constexpr void test_copy_with_type() {
+ using FromIter = contiguous_iterator<From*>;
+ using ToIter = contiguous_iterator<To*>;
+
+ test_copy<FromIter, std::type_identity_t, ToIter>();
+ test_copy<FromIter, sized_sentinel, ToIter>();
+ test_copy<FromIter, std::type_identity_t, To*>();
+ test_copy<From*, std::type_identity_t, To*>();
+ test_copy<From*, std::type_identity_t, ToIter>();
+}
+
+template <class From, class To = From>
+constexpr void test_move_with_type() {
+ using FromIter = contiguous_iterator<From*>;
+ using ToIter = contiguous_iterator<To*>;
+
+ test_move<FromIter, std::type_identity_t, ToIter>();
+ test_move<FromIter, sized_sentinel, ToIter>();
+ test_move<FromIter, std::type_identity_t, To*>();
+ test_move<From*, std::type_identity_t, To*>();
+ test_move<From*, std::type_identity_t, ToIter>();
+}
+
+template <class From, class To>
+constexpr void test_copy_and_move() {
+ test_copy_with_type<From, To>();
+ test_move_with_type<From, To>();
+}
+
+template <class From, class To>
+constexpr void test_both_directions() {
+ test_copy_and_move<From, To>();
+ if (!std::same_as<From, To>) {
+ test_copy_and_move<To, From>();
+ }
+}
+
+constexpr bool test() {
+ test_copy_with_type<NonTrivialCopyAssignment>();
+ test_move_with_type<NonTrivialMoveAssignment>();
+
+ // Copying from a smaller type into a larger type and vice versa.
+ test_both_directions<char, int>();
+ test_both_directions<std::int32_t, std::int64_t>();
+
+ // Copying between types with different representations.
+ test_both_directions<int, float>();
+ // Copying from `bool` to `char` will invoke the optimization, so only check one direction.
+ test_copy_and_move<char, bool>();
+
+ // Copying between different structs with the same representation (there is no way to guarantee the representation is
+ // the same).
+ test_copy_and_move<S1, S2>();
+ // Copying between different unions with the same representation.
+ test_copy_and_move<U1, U2>();
+
+ // Copying from a regular pointer to a void pointer (these are not considered trivially copyable).
+ test_copy_and_move<int*, void*>();
+ // Copying from a non-const pointer to a const pointer (these are not considered trivially copyable).
+ test_copy_and_move<int*, const int*>();
+
+ // `memmove` does not support volatile pointers.
+ // (See also https://github.com/llvm/llvm-project/issues/28901).
+ if (!std::is_constant_evaluated()) {
+ test_both_directions<volatile int, int>();
+ test_both_directions<volatile int, volatile int>();
+ }
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/copy_move_trivial.pass.cpp b/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/copy_move_trivial.pass.cpp
new file mode 100644
index 0000000000000..ff10c7919200d
--- /dev/null
+++ b/libcxx/test/libcxx-03/algorithms/alg.modifying.operations/copy_move_trivial.pass.cpp
@@ -0,0 +1,334 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// In the modules build, adding another overload of `memmove` doesn't work.
+// UNSUPPORTED: clang-modules-build
+// GCC complains about "ambiguating" `__builtin_memmove`.
+// UNSUPPORTED: gcc
+
+// <algorithm>
+
+// These tests check that `std::copy` and `std::move` (including their variations like `copy_n`) forward to
+// `memmove` when possible.
+
+#include <cstddef>
+
+struct Foo {
+ int i = 0;
+
+ Foo() = default;
+ Foo(int set_i) : i(set_i) {}
+
+ friend bool operator==(const Foo&, const Foo&) = default;
+};
+
+static bool memmove_called = false;
+
+// This template is a better match than the actual `builtin_memmove` (it can match the pointer type exactly, without an
+// implicit conversion to `void*`), so it should hijack the call inside `std::copy` and similar algorithms if it's made.
+template <class Dst, class Src>
+constexpr void* __builtin_memmove(Dst* dst, Src* src, std::size_t count) {
+ memmove_called = true;
+ return __builtin_memmove(static_cast<void*>(dst), static_cast<const void*>(src), count);
+}
+
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <iterator>
+#include <limits>
+#include <ranges>
+#include <type_traits>
+
+#include "test_iterators.h"
+
+static_assert(std::is_trivially_copyable_v<Foo>);
+
+// To test pointers to functions.
+void Func() {}
+using FuncPtr = decltype(&Func);
+
+// To test pointers to members.
+struct S {
+ int mem_obj = 0;
+ void MemFunc() {}
+};
+using MemObjPtr = decltype(&S::mem_obj);
+using MemFuncPtr = decltype(&S::MemFunc);
+
+// To test bitfields.
+struct BitfieldS {
+ unsigned char b1 : 3;
+ unsigned char : 2;
+ unsigned char b2 : 5;
+ friend bool operator==(const BitfieldS&, const BitfieldS&) = default;
+};
+
+// To test non-default alignment.
+struct AlignedS {
+ alignas(64) int x;
+ alignas(8) int y;
+ friend bool operator==(const AlignedS&, const AlignedS&) = default;
+};
+
+template <class T>
+T make(int from) {
+ return T(from);
+}
+
+template <class T>
+requires (std::is_pointer_v<T> && !std::is_function_v<std::remove_pointer_t<T>>)
+T make(int i) {
+ static std::remove_pointer_t<T> arr[8];
+ return arr + i;
+}
+
+template <class T>
+requires std::same_as<T, FuncPtr>
+FuncPtr make(int) {
+ return &Func;
+}
+
+template <class T>
+requires std::same_as<T, MemObjPtr>
+MemObjPtr make(int) {
+ return &S::mem_obj;
+}
+
+template <class T>
+requires std::same_as<T, MemFuncPtr>
+MemFuncPtr make(int) {
+ return &S::MemFunc;
+}
+
+template <class T>
+requires std::same_as<T, BitfieldS>
+BitfieldS make(int x) {
+ BitfieldS result = {};
+ result.b1 = x;
+ result.b2 = x;
+ return result;
+}
+
+template <class T>
+requires std::same_as<T, AlignedS>
+AlignedS make(int x) {
+ AlignedS result;
+ result.x = x;
+ result.y = x;
+ return result;
+}
+
+template <class InIter, template <class> class SentWrapper, class OutIter, class Func>
+void test_one(Func func) {
+ using From = std::iter_value_t<InIter>;
+ using To = std::iter_value_t<OutIter>;
+
+ // Normal case.
+ {
+ const std::size_t N = 4;
+
+ From input[N] = {make<From>(1), make<From>(2), make<From>(3), make<From>(4)...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/144093
More information about the libcxx-commits
mailing list