summaryrefslogtreecommitdiff
path: root/libcxx/test/std/strings/basic.string/string.cons/from_range_deduction.pass.cpp
diff options
context:
space:
mode:
authorvarconst <varconsteq@gmail.com>2023-06-30 17:04:33 -0700
committervarconst <varconsteq@gmail.com>2023-07-05 14:50:59 -0700
commitbaf6f91851edcdd72e3a6214299f295ec58337f6 (patch)
treeb8a5a4f7665bfecfee4bf6a9bb566320526866e3 /libcxx/test/std/strings/basic.string/string.cons/from_range_deduction.pass.cpp
parent99dcc9ff0e545e5061635a1ef24a6a9f71a0e4b6 (diff)
[libc++][ranges] Implement the changes to `basic_string` from P1206 (`ranges::to`):
- add the `from_range_t` constructors and the related deduction guides; - add the `insert_range`/`assign_range`/etc. member functions. (Note: this patch is split from https://reviews.llvm.org/D142335) Differential Revision: https://reviews.llvm.org/D149832
Diffstat (limited to 'libcxx/test/std/strings/basic.string/string.cons/from_range_deduction.pass.cpp')
-rw-r--r--libcxx/test/std/strings/basic.string/string.cons/from_range_deduction.pass.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/libcxx/test/std/strings/basic.string/string.cons/from_range_deduction.pass.cpp b/libcxx/test/std/strings/basic.string/string.cons/from_range_deduction.pass.cpp
new file mode 100644
index 000000000000..4df4d39c2355
--- /dev/null
+++ b/libcxx/test/std/strings/basic.string/string.cons/from_range_deduction.pass.cpp
@@ -0,0 +1,50 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// <string>
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
+// To silence a GCC warning-turned-error re. `BadAlloc::value_type`.
+// ADDITIONAL_COMPILE_FLAGS: -Wno-unused-local-typedefs
+
+// template<ranges::input_range R,
+// class Allocator = allocator<ranges::range_value_t<R>>>
+// basic_string(from_range_t, R&&, Allocator = Allocator())
+// -> basic_string<ranges::range_value_t<R>, char_traits<ranges::range_value_t<R>>,
+// Allocator>; // C++23
+//
+// The deduction guide shall not participate in overload resolution if Allocator
+// is a type that does not qualify as an allocator (in addition to the `input_range` concept being satisfied by `R`).
+
+#include <array>
+#include <string>
+
+#include "deduction_guides_sfinae_checks.h"
+#include "test_allocator.h"
+
+int main(int, char**) {
+ using Char = char16_t;
+
+ {
+ std::basic_string c(std::from_range, std::array<Char, 0>());
+ static_assert(std::is_same_v<decltype(c), std::basic_string<Char>>);
+ }
+
+ {
+ using Alloc = test_allocator<Char>;
+ std::basic_string c(std::from_range, std::array<Char, 0>(), Alloc());
+ static_assert(std::is_same_v<decltype(c), std::basic_string<Char, std::char_traits<Char>, Alloc>>);
+ }
+
+ // Note: defining `value_type` is a workaround because one of the deduction guides will end up instantiating
+ // `basic_string`, and that would fail with a hard error if the given allocator doesn't define `value_type`.
+ struct BadAlloc { using value_type = char; };
+ SequenceContainerDeductionGuidesSfinaeAway<std::basic_string, std::basic_string<char>, BadAlloc>();
+
+ return 0;
+}