xref: /llvm-project/libcxx/test/std/strings/basic.string/string.ops/string_substr/substr_rvalue.pass.cpp (revision 9ed20568e7de53dce85f1631d7d8c1415e7930ae)
129378ab2SNikolas Klauser //===----------------------------------------------------------------------===//
229378ab2SNikolas Klauser //
329378ab2SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
429378ab2SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
529378ab2SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
629378ab2SNikolas Klauser //
729378ab2SNikolas Klauser //===----------------------------------------------------------------------===//
829378ab2SNikolas Klauser 
929378ab2SNikolas Klauser // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
1029378ab2SNikolas Klauser 
1129378ab2SNikolas Klauser // <string>
1229378ab2SNikolas Klauser 
1329378ab2SNikolas Klauser // constexpr basic_string substr(size_type pos = 0, size_type n = npos) &&;
1429378ab2SNikolas Klauser 
1529378ab2SNikolas Klauser #include <algorithm>
166b90f674SCasey Carter #include <stdexcept>
1729378ab2SNikolas Klauser #include <string>
1829378ab2SNikolas Klauser 
1929378ab2SNikolas Klauser #include "constexpr_char_traits.h"
2029378ab2SNikolas Klauser #include "make_string.h"
2129378ab2SNikolas Klauser #include "min_allocator.h"
2229378ab2SNikolas Klauser #include "test_allocator.h"
23*9ed20568STacet #include "asan_testing.h"
2429378ab2SNikolas Klauser 
2529378ab2SNikolas Klauser #define STR(string) MAKE_CSTRING(typename S::value_type, string)
2629378ab2SNikolas Klauser 
2729378ab2SNikolas Klauser constexpr struct should_throw_exception_t {
2829378ab2SNikolas Klauser } should_throw_exception;
2929378ab2SNikolas Klauser 
3029378ab2SNikolas Klauser template <class S>
test(S orig,typename S::size_type pos,typename S::size_type n,const S expected)316b90f674SCasey Carter constexpr void test(S orig, typename S::size_type pos, typename S::size_type n, const S expected) {
3229378ab2SNikolas Klauser   S str = std::move(orig).substr(pos, n);
3329378ab2SNikolas Klauser   LIBCPP_ASSERT(orig.__invariants());
3429378ab2SNikolas Klauser   LIBCPP_ASSERT(str.__invariants());
3529378ab2SNikolas Klauser   assert(str == expected);
36*9ed20568STacet   LIBCPP_ASSERT(is_string_asan_correct(orig));
37*9ed20568STacet   LIBCPP_ASSERT(is_string_asan_correct(str));
3829378ab2SNikolas Klauser }
3929378ab2SNikolas Klauser 
4029378ab2SNikolas Klauser template <class S>
test(S orig,typename S::size_type pos,typename S::size_type n,should_throw_exception_t)416b90f674SCasey Carter constexpr void test(S orig, typename S::size_type pos, typename S::size_type n, should_throw_exception_t) {
4229378ab2SNikolas Klauser #ifndef TEST_HAS_NO_EXCEPTIONS
4329378ab2SNikolas Klauser   if (!std::is_constant_evaluated()) {
4429378ab2SNikolas Klauser     try {
4529378ab2SNikolas Klauser       S str = std::move(orig).substr(pos, n);
4629378ab2SNikolas Klauser       assert(false);
4729378ab2SNikolas Klauser     } catch (const std::out_of_range&) {
4829378ab2SNikolas Klauser     }
4929378ab2SNikolas Klauser   }
5029378ab2SNikolas Klauser #else
5129378ab2SNikolas Klauser   (void)orig;
5229378ab2SNikolas Klauser   (void)pos;
5329378ab2SNikolas Klauser   (void)n;
5429378ab2SNikolas Klauser #endif
5529378ab2SNikolas Klauser }
5629378ab2SNikolas Klauser 
5729378ab2SNikolas Klauser template <class S>
test_string()5829378ab2SNikolas Klauser constexpr void test_string() {
5929378ab2SNikolas Klauser   test<S>(STR(""), 0, 0, STR(""));
6029378ab2SNikolas Klauser   test<S>(STR(""), 0, 1, STR(""));
6129378ab2SNikolas Klauser   test<S>(STR(""), 1, 0, should_throw_exception);
6229378ab2SNikolas Klauser   test<S>(STR(""), 1, 1, should_throw_exception);
6329378ab2SNikolas Klauser   test<S>(STR("short string"), 0, 1, STR("s"));
6429378ab2SNikolas Klauser   test<S>(STR("short string"), 5, 5, STR(" stri"));
6529378ab2SNikolas Klauser   test<S>(STR("short string"), 12, 5, STR(""));
6629378ab2SNikolas Klauser   test<S>(STR("short string"), 13, 5, should_throw_exception);
6729378ab2SNikolas Klauser   test<S>(STR("long long string so no SSO"), 0, 0, STR(""));
6829378ab2SNikolas Klauser   test<S>(STR("long long string so no SSO"), 0, 10, STR("long long "));
6929378ab2SNikolas Klauser   test<S>(STR("long long string so no SSO"), 10, 10, STR("string so "));
7029378ab2SNikolas Klauser   test<S>(STR("long long string so no SSO"), 20, 10, STR("no SSO"));
7129378ab2SNikolas Klauser   test<S>(STR("long long string so no SSO"), 26, 10, STR(""));
7229378ab2SNikolas Klauser   test<S>(STR("long long string so no SSO"), 27, 0, should_throw_exception);
7329378ab2SNikolas Klauser }
7429378ab2SNikolas Klauser 
7529378ab2SNikolas Klauser template <class CharT, class CharTraits>
test_allocators()7629378ab2SNikolas Klauser constexpr void test_allocators() {
7729378ab2SNikolas Klauser   test_string<std::basic_string<CharT, CharTraits, std::allocator<CharT>>>();
7829378ab2SNikolas Klauser   test_string<std::basic_string<CharT, CharTraits, min_allocator<CharT>>>();
7929378ab2SNikolas Klauser   test_string<std::basic_string<CharT, CharTraits, test_allocator<CharT>>>();
8029378ab2SNikolas Klauser }
8129378ab2SNikolas Klauser 
8229378ab2SNikolas Klauser template <class CharT>
test_char_traits()8329378ab2SNikolas Klauser constexpr void test_char_traits() {
8429378ab2SNikolas Klauser   test_allocators<CharT, std::char_traits<CharT>>();
8529378ab2SNikolas Klauser   test_allocators<CharT, constexpr_char_traits<CharT>>();
8629378ab2SNikolas Klauser }
8729378ab2SNikolas Klauser 
test()8829378ab2SNikolas Klauser constexpr bool test() {
8929378ab2SNikolas Klauser   test_char_traits<char>();
9029378ab2SNikolas Klauser   test_char_traits<char16_t>();
9129378ab2SNikolas Klauser   test_char_traits<char32_t>();
9229378ab2SNikolas Klauser #ifndef TEST_HAS_NO_WIDE_CHARACTERS
9329378ab2SNikolas Klauser   test_char_traits<wchar_t>();
9429378ab2SNikolas Klauser #endif
9529378ab2SNikolas Klauser #ifndef TEST_HAS_NO_CHAR8_T
9629378ab2SNikolas Klauser   test_char_traits<char8_t>();
9729378ab2SNikolas Klauser #endif
9829378ab2SNikolas Klauser 
9929378ab2SNikolas Klauser   return true;
10029378ab2SNikolas Klauser }
10129378ab2SNikolas Klauser 
main(int,char **)10229378ab2SNikolas Klauser int main(int, char**) {
10329378ab2SNikolas Klauser   test();
10429378ab2SNikolas Klauser   static_assert(test());
10529378ab2SNikolas Klauser 
10629378ab2SNikolas Klauser   return 0;
10729378ab2SNikolas Klauser }
108