aboutsummaryrefslogtreecommitdiff
path: root/libcxx
diff options
context:
space:
mode:
authorMark de Wever <koraq@xs4all.nl>2023-07-07 18:32:20 +0200
committerMark de Wever <koraq@xs4all.nl>2023-07-17 18:01:19 +0200
commit7583c73bc4faf2b37f6c75ec64eddaa99f058b65 (patch)
treec0b21399cfbb9e26b214535488e2bc970e9d0ffe /libcxx
parent27245077643ae8b94a0511ee1c3a39d6f4ca8076 (diff)
downloadllvm-7583c73bc4faf2b37f6c75ec64eddaa99f058b65.zip
llvm-7583c73bc4faf2b37f6c75ec64eddaa99f058b65.tar.gz
llvm-7583c73bc4faf2b37f6c75ec64eddaa99f058b65.tar.bz2
[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
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/__format/buffer.h6
-rw-r--r--libcxx/test/std/utilities/format/format.functions/format_tests.h397
2 files changed, 400 insertions, 3 deletions
diff --git a/libcxx/include/__format/buffer.h b/libcxx/include/__format/buffer.h
index 3203853..f43fd13 100644
--- a/libcxx/include/__format/buffer.h
+++ b/libcxx/include/__format/buffer.h
@@ -107,7 +107,7 @@ public:
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 @@ public:
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 @@ public:
/// 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 f55ed36..0273435 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 different 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);