[libcxx-commits] [libcxx] [libc++] Fix {deque, vector}::append_range assuming too much about the types (PR #162438)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Oct 9 06:41:25 PDT 2025
================
@@ -643,6 +643,62 @@ constexpr void test_sequence_assign_range_move_only() {
c.assign_range(in);
}
+struct InPlaceOnly {
+ constexpr InPlaceOnly() {}
+ InPlaceOnly(const InPlaceOnly&) = delete;
+ InPlaceOnly(InPlaceOnly&&) = delete;
+ InPlaceOnly& operator=(const InPlaceOnly&) = delete;
+ InPlaceOnly& operator=(InPlaceOnly&&) = delete;
+};
+
+struct EmplaceConstructible {
+ EmplaceConstructible(const EmplaceConstructible&) = delete;
+ EmplaceConstructible& operator=(const EmplaceConstructible&) = delete;
+ EmplaceConstructible& operator=(EmplaceConstructible&&) = delete;
+ EmplaceConstructible(EmplaceConstructible&&) = delete;
+ constexpr EmplaceConstructible(const InPlaceOnly&) {}
+};
+
+template <template <class...> class Container>
+constexpr void test_sequence_append_range_emplace_constructible() {
+ InPlaceOnly input[5];
+ types::for_each(types::cpp20_input_iterator_list<InPlaceOnly*>{}, [&]<class Iter> {
+ std::ranges::subrange in(Iter(input), sentinel_wrapper<Iter>(Iter(input + 5)));
+ Container<EmplaceConstructible> c;
+ c.append_range(in);
+ });
+}
+
+template <template <class...> class Container>
+constexpr void test_sequence_prepend_range_emplace_constructible() {
+ InPlaceOnly input[5];
+ types::for_each(types::cpp20_input_iterator_list<InPlaceOnly*>{}, [&]<class Iter> {
+ std::ranges::subrange in(Iter(input), sentinel_wrapper<Iter>(Iter(input + 5)));
+ Container<EmplaceConstructible> c;
+ c.prepend_range(in);
+ });
+}
+
+// vector has a special requirement that the type also has to be Cpp17MoveInsertable
+
----------------
ldionne wrote:
```suggestion
```
https://github.com/llvm/llvm-project/pull/162438
More information about the libcxx-commits
mailing list