diff options
| author | Tomasz Kamiński <tkaminsk@redhat.com> | 2025-10-02 16:17:05 +0200 |
|---|---|---|
| committer | Tomasz Kamiński <tkaminsk@redhat.com> | 2025-10-10 09:13:00 +0200 |
| commit | c8b388a94890b06d58a290dd39b9023cc4383c80 (patch) | |
| tree | 7bd576e55de324e36ea9c4b41c8dfc1704361cd5 /libstdc++-v3/testsuite/std/format | |
| parent | 8bd872f1ea74143aed0bd5148804a25dc6a9caf0 (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.cc | 10 | ||||
| -rw-r--r-- | libstdc++-v3/testsuite/std/format/ranges/formatter.cc | 14 | ||||
| -rw-r--r-- | libstdc++-v3/testsuite/std/format/tuple.cc | 37 |
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>(); } |
