[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