summaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/std/format
diff options
context:
space:
mode:
authorTomasz Kamiński <tkaminsk@redhat.com>2025-10-02 16:17:05 +0200
committerTomasz Kamiński <tkaminsk@redhat.com>2025-10-10 09:13:00 +0200
commitc8b388a94890b06d58a290dd39b9023cc4383c80 (patch)
tree7bd576e55de324e36ea9c4b41c8dfc1704361cd5 /libstdc++-v3/testsuite/std/format
parent8bd872f1ea74143aed0bd5148804a25dc6a9caf0 (diff)
libstdc++: Implement P3235R3 optimizations for std::print [PR121790]
This patch implements additional enable_nonlocking_formatter_optimization specializations listed in P3235R3. PR libstdc++/121790 libstdc++-v3/ChangeLog: * include/bits/chrono_io.h (enable_nonlocking_formatter_optimization): Define specializations for chrono types. * include/bits/version.def (print): Bump. * include/bits/version.h: Regenerate. * include/std/format (enable_nonlocking_formatter_optimization): Define specializations for pair, tuple and ranges. * include/std/queue (enable_nonlocking_formatter_optimization): Define specializations for queue and priority_queue. * include/std/stack (enable_nonlocking_formatter_optimization): Define specialization for stack. * include/std/stacktrace (enable_nonlocking_formatter_optimization): Define specialization for basic_stacktrace and stacktrace_entry. * include/std/thread (enable_nonlocking_formatter_optimization): Define specialization for thread::id. * include/std/vector (enable_nonlocking_formatter_optimization): Define specialization for vector<bool>::reference. * testsuite/23_containers/vector/bool/format.cc: Test value of enable_nonlocking_formatter_optimization. * testsuite/30_threads/thread/id/output.cc: Likewise. * testsuite/std/format/ranges/adaptors.cc: Likewise. * testsuite/std/format/ranges/formatter.cc: Likewise. * testsuite/std/format/tuple.cc: Likewise. * testsuite/std/time/format/empty_spec.cc: Extract Rep class to custom_rep.h. * testsuite/std/time/format/custom_rep.h: Extracted from empty_spec.cc. * testsuite/std/time/format/nonlocking.cc: New test. Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Diffstat (limited to 'libstdc++-v3/testsuite/std/format')
-rw-r--r--libstdc++-v3/testsuite/std/format/ranges/adaptors.cc10
-rw-r--r--libstdc++-v3/testsuite/std/format/ranges/formatter.cc14
-rw-r--r--libstdc++-v3/testsuite/std/format/tuple.cc37
3 files changed, 60 insertions, 1 deletions
diff --git a/libstdc++-v3/testsuite/std/format/ranges/adaptors.cc b/libstdc++-v3/testsuite/std/format/ranges/adaptors.cc
index a4e2dfb3321..d9fc01ab893 100644
--- a/libstdc++-v3/testsuite/std/format/ranges/adaptors.cc
+++ b/libstdc++-v3/testsuite/std/format/ranges/adaptors.cc
@@ -121,6 +121,16 @@ test_output()
// Formatter check if container is formattable, not container elements.
static_assert(!std::formattable<Adaptor<int, NotFormattableCont<int>>, CharT>);
+
+ // TODO should be false
+ static_assert(std::enable_nonlocking_formatter_optimization<
+ Adaptor<int>>);
+ static_assert(std::enable_nonlocking_formatter_optimization<
+ Adaptor<MutFormat>>);
+ static_assert(std::enable_nonlocking_formatter_optimization<
+ Adaptor<int, std::deque<int>>>);
+ static_assert(std::enable_nonlocking_formatter_optimization<
+ Adaptor<int, NotFormattableCont<int>>>);
}
template<template<typename Tp, typename Cont = std::vector<Tp>> class Adaptor>
diff --git a/libstdc++-v3/testsuite/std/format/ranges/formatter.cc b/libstdc++-v3/testsuite/std/format/ranges/formatter.cc
index d3e089767bf..a50c5b1033f 100644
--- a/libstdc++-v3/testsuite/std/format/ranges/formatter.cc
+++ b/libstdc++-v3/testsuite/std/format/ranges/formatter.cc
@@ -4,6 +4,7 @@
#include <format>
#include <testsuite_hooks.h>
#include <vector>
+#include <span>
#define WIDEN_(C, S) ::std::__format::_Widen<C>(S, L##S)
#define WIDEN(S) WIDEN_(CharT, S)
@@ -145,7 +146,7 @@ struct MyFlatMap : std::flat_map<int, int>
template<typename CharT>
struct std::formatter<MyFlatMap, CharT>
- // This cannot apply format BitVector const&, because formatted type would
+ // We cannot format MyFlatMap const&, because formatted type would
// be std::pair<int const&, int const&>, and formatter for
// pair<int const&, int> cannot format it.
: std::range_formatter<MyFlatMap::reference>
@@ -161,10 +162,21 @@ void test_const_ref_type_mismatch()
template<typename T, typename CharT>
using VectorFormatter = std::formatter<std::vector<T>, CharT>;
+template<template<typename> typename Range>
+void test_nonblocking()
+{
+ static_assert(!std::enable_nonlocking_formatter_optimization<
+ Range<int>>);
+}
+
int main()
{
test_outputs<std::range_formatter>();
test_outputs<VectorFormatter>();
test_nested();
test_const_ref_type_mismatch();
+
+ test_nonblocking<std::span>();
+ test_nonblocking<std::vector>();
+ test_nonblocking<MyVector>();
}
diff --git a/libstdc++-v3/testsuite/std/format/tuple.cc b/libstdc++-v3/testsuite/std/format/tuple.cc
index ba6dae8935b..001235ba643 100644
--- a/libstdc++-v3/testsuite/std/format/tuple.cc
+++ b/libstdc++-v3/testsuite/std/format/tuple.cc
@@ -341,6 +341,40 @@ void test_padding()
VERIFY( check_elems(resv) );
}
+struct Custom {};
+
+template<typename CharT>
+struct std::formatter<Custom, CharT>
+{
+ constexpr std::basic_format_parse_context<CharT>::iterator
+ parse(const std::basic_format_parse_context<CharT>& pc)
+ { return pc.begin(); }
+
+ template<typename Out>
+ typename std::basic_format_context<Out, CharT>::iterator
+ format(Custom, const std::basic_format_context<Out, CharT>& fc) const
+ { return fc.out(); }
+};
+
+template<template<typename...> typename Tuple>
+void test_nonblocking()
+{
+ static_assert(std::enable_nonlocking_formatter_optimization<
+ Tuple<int, float>>);
+ // TODO missing remove_cv_ref
+ static_assert(!std::enable_nonlocking_formatter_optimization<
+ Tuple<const int, const float>>);
+ static_assert(!std::enable_nonlocking_formatter_optimization<
+ Tuple<int&, float&>>);
+
+ static_assert(!std::enable_nonlocking_formatter_optimization<
+ Tuple<Custom, float>>);
+ static_assert(!std::enable_nonlocking_formatter_optimization<
+ Tuple<const Custom, const float>>);
+ static_assert(!std::enable_nonlocking_formatter_optimization<
+ Tuple<Custom&, float&>>);
+}
+
int main()
{
test_format_string();
@@ -348,4 +382,7 @@ int main()
test_outputs<wchar_t>();
test_nested();
test_padding();
+
+ test_nonblocking<std::pair>();
+ test_nonblocking<std::tuple>();
}