diff options
author | Mark de Wever <koraq@xs4all.nl> | 2023-07-07 18:32:20 +0200 |
---|---|---|
committer | Mark de Wever <koraq@xs4all.nl> | 2023-07-17 18:01:19 +0200 |
commit | 7583c73bc4faf2b37f6c75ec64eddaa99f058b65 (patch) | |
tree | c0b21399cfbb9e26b214535488e2bc970e9d0ffe /libcxx | |
parent | 27245077643ae8b94a0511ee1c3a39d6f4ca8076 (diff) | |
download | llvm-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.h | 6 | ||||
-rw-r--r-- | libcxx/test/std/utilities/format/format.functions/format_tests.h | 397 |
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); |