[libcxx-commits] [libcxx] 7583c73 - [libc++][format] Fixes an off by one error.

Mark de Wever via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jul 17 09:01:25 PDT 2023


Author: Mark de Wever
Date: 2023-07-17T18:01:19+02:00
New Revision: 7583c73bc4faf2b37f6c75ec64eddaa99f058b65

URL: https://github.com/llvm/llvm-project/commit/7583c73bc4faf2b37f6c75ec64eddaa99f058b65
DIFF: https://github.com/llvm/llvm-project/commit/7583c73bc4faf2b37f6c75ec64eddaa99f058b65.diff

LOG: [libc++][format] Fixes an off by one error.

The post-condition on the functions is that the buffer is not full.
This post-conditon is used as pre-condition of the push_back function.
When a copy, fill, of transform function exactly fit in the buffer this
post-condition was validated.

Reviewed By: #libc, ldionne

Differential Revision: https://reviews.llvm.org/D155397

Added: 
    

Modified: 
    libcxx/include/__format/buffer.h
    libcxx/test/std/utilities/format/format.functions/format_tests.h

Removed: 
    


################################################################################
diff  --git a/libcxx/include/__format/buffer.h b/libcxx/include/__format/buffer.h
index 3203853b12fe32..f43fd13d6a9cae 100644
--- a/libcxx/include/__format/buffer.h
+++ b/libcxx/include/__format/buffer.h
@@ -107,7 +107,7 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
     size_t __n = __str.size();
 
     __flush_on_overflow(__n);
-    if (__n <= __capacity_) {
+    if (__n < __capacity_) { //  push_back requires the buffer to have room for at least one character (so use <).
       _VSTD::copy_n(__str.data(), __n, _VSTD::addressof(__ptr_[__size_]));
       __size_ += __n;
       return;
@@ -136,7 +136,7 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
 
     size_t __n = static_cast<size_t>(__last - __first);
     __flush_on_overflow(__n);
-    if (__n <= __capacity_) {
+    if (__n < __capacity_) { //  push_back requires the buffer to have room for at least one character (so use <).
       _VSTD::transform(__first, __last, _VSTD::addressof(__ptr_[__size_]), _VSTD::move(__operation));
       __size_ += __n;
       return;
@@ -158,7 +158,7 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
   /// A \c fill_n wrapper.
   _LIBCPP_HIDE_FROM_ABI void __fill(size_t __n, _CharT __value) {
     __flush_on_overflow(__n);
-    if (__n <= __capacity_) {
+    if (__n < __capacity_) { //  push_back requires the buffer to have room for at least one character (so use <).
       _VSTD::fill_n(_VSTD::addressof(__ptr_[__size_]), __n, __value);
       __size_ += __n;
       return;

diff  --git a/libcxx/test/std/utilities/format/format.functions/format_tests.h b/libcxx/test/std/utilities/format/format.functions/format_tests.h
index f55ed367037d06..02734352143182 100644
--- a/libcxx/test/std/utilities/format/format.functions/format_tests.h
+++ b/libcxx/test/std/utilities/format/format.functions/format_tests.h
@@ -77,6 +77,397 @@ case #T[0]:
   return result;
 }
 
+template <class CharT, class TestFunction>
+void format_test_buffer_copy(TestFunction check) {
+  // *** copy ***
+  check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+        SV("{}"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+        SV("{}"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+        SV("{}"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+        SV("{}"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(
+      SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+      SV("{}"),
+      SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  // *** copy + push_back ***
+
+  check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "X"),
+        SV("{}X"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "X"),
+        SV("{}X"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "X"),
+        SV("{}X"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "X"),
+        SV("{}X"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(
+      SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "X"),
+      SV("{}X"),
+      SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  // ***  push_back + copy ***
+
+  check(SV("X"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+        SV("X{}"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(SV("X"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+        SV("X{}"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(SV("X"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+        SV("X{}"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(SV("X"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+        SV("X{}"),
+        SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+           "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+
+  check(
+      SV("X"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
+      SV("X{}"),
+      SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+         "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
+}
+
+template <class CharT, class TestFunction>
+void format_test_buffer_full(TestFunction check) {
+  // *** fill ***
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"), SV("{:|<64}"), SV(""));
+
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
+        SV("{:|<128}"),
+        SV(""));
+
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
+        SV("{:|<256}"),
+        SV(""));
+
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
+        SV("{:|<512}"),
+        SV(""));
+
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
+        SV("{:|<1024}"),
+        SV(""));
+
+  // *** fill + push_back ***
+
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "X"),
+        SV("{:|<64}X"),
+        SV(""));
+
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "X"),
+        SV("{:|<128}X"),
+        SV(""));
+
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "X"),
+        SV("{:|<256}X"),
+        SV(""));
+
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "X"),
+        SV("{:|<512}X"),
+        SV(""));
+
+  check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "X"),
+        SV("{:|<1024}X"),
+        SV(""));
+
+  // *** push_back + fill ***
+
+  check(SV("X"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
+        SV("X{:|<64}"),
+        SV(""));
+
+  check(SV("X"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
+        SV("X{:|<128}"),
+        SV(""));
+
+  check(SV("X"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
+        SV("X{:|<256}"),
+        SV(""));
+
+  check(SV("X"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
+        SV("X{:|<512}"),
+        SV(""));
+
+  check(SV("X"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
+           "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
+        SV("X{:|<1024}"),
+        SV(""));
+}
+
 // Using a const ref for world and universe so a string literal will be a character array.
 // When passed as character array W and U have 
diff erent types.
 template <class CharT, class W, class U, class TestFunction, class ExceptionTest>
@@ -2727,6 +3118,12 @@ void format_tests(TestFunction check, ExceptionTest check_exception) {
       9,
       0);
 
+  // *** Test buffer boundaries format strings ***
+  if constexpr (modus == execution_modus::full) {
+    format_test_buffer_copy<CharT>(check);
+    format_test_buffer_full<CharT>(check);
+  }
+
   // *** Test invalid format strings ***
   check_exception("The format string terminates at a '{'", SV("{"));
   check_exception("The replacement field misses a terminating '}'", SV("{:"), 42);


        


More information about the libcxx-commits mailing list