[libcxx-commits] [libcxx] [libc++] Implement LWG3662 basic_string::append/assign(NTBS, pos, n) suboptimal (PR #206320)

A. Jiang via libcxx-commits libcxx-commits at lists.llvm.org
Sun Jun 28 09:22:45 PDT 2026


================
@@ -0,0 +1,84 @@
+//===----------------------------------------------------------------------===//
+//
+// 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>
+
+// constexpr basic_string& assign(const charT* s, size_type pos, size_type n);
+
+#include <string>
+#include <stdexcept>
+#include <cassert>
+
+#include "test_macros.h"
+#include "min_allocator.h"
+#include "asan_testing.h"
+
+template <class S>
+TEST_CONSTEXPR_CXX20 void
+test(S s, const typename S::value_type* str, typename S::size_type pos, typename S::size_type n, S expected) {
+  typename S::size_type str_len = S::traits_type::length(str);
+  if (pos <= str_len) {
+    s.assign(str, pos, n);
+    LIBCPP_ASSERT(s.__invariants());
+    assert(s == expected);
+    LIBCPP_ASSERT(is_string_asan_correct(s));
+  }
+#ifndef TEST_HAS_NO_EXCEPTIONS
+  else if (!TEST_IS_CONSTANT_EVALUATED) {
+    try {
+      s.assign(str, pos, n);
+      assert(false);
+    } catch (std::out_of_range&) {
+      assert(pos > str_len);
+    }
+  }
+#endif
+}
+
+template <class S>
+TEST_CONSTEXPR_CXX20 void test_string() {
+  test(S(), "", 0, 0, S());
+  test(S(), "", 1, 0, S("not happening"));
+  test(S(), "12345", 0, 3, S("123"));
+  test(S(), "12345", 1, 4, S("2345"));
+  test(S(), "12345", 3, 15, S("45"));
+  test(S(), "12345", 5, 15, S(""));
+  test(S(), "12345", 6, 15, S("not happening"));
+  test(S(), "12345678901234567890", 0, 0, S());
+  test(S(), "12345678901234567890", 1, 1, S("2"));
+  test(S(), "12345678901234567890", 2, 3, S("345"));
+  test(S(), "12345678901234567890", 12, 13, S("34567890"));
+  test(S(), "12345678901234567890", 21, 13, S("not happening"));
+
+  test(S("12345"), "", 0, 0, S());
+  test(S("12345"), "12345", 2, 2, S("34"));
+  test(S("12345"), "1234567890", 0, 100, S("1234567890"));
+
+  test(S("12345678901234567890"), "", 0, 0, S());
+  test(S("12345678901234567890"), "12345", 1, 3, S("234"));
+  test(S("12345678901234567890"), "12345678901234567890", 5, 10, S("6789012345"));
+}
----------------
frederick-vs-ja wrote:

Similarly, we should test absence of reallocation, possibly with `limited_allocator`.

https://github.com/llvm/llvm-project/pull/206320


More information about the libcxx-commits mailing list