| // { dg-do compile { target c++23 } } |
| |
| #include <format> |
| #include <chrono> |
| #include "custom_rep.h" |
| |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::day>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::month>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::year>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::weekday>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::weekday_indexed>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::weekday_last>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::month_day>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::month_day_last>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::month_weekday>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::month_weekday_last>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::year_month>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::year_month_day>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::year_month_day_last>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::year_month_weekday>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::year_month_weekday_last>); |
| |
| #if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::local_info>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::sys_info>); |
| #endif |
| |
| template<typename Duration> |
| using local_time_fmt |
| = decltype(std::chrono::local_time_format(std::chrono::local_time<Duration>{})); |
| |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::seconds>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::duration<float>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::duration<long long, std::mega>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::local_time<std::chrono::seconds>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::sys_time<std::chrono::seconds>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::utc_time<std::chrono::seconds>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::gps_time<std::chrono::seconds>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::tai_time<std::chrono::seconds>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::file_time<std::chrono::seconds>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| local_time_fmt<std::chrono::seconds>>); |
| |
| using BufferedDuration = std::chrono::duration<Rep<void, int>>; |
| |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| BufferedDuration>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::local_time<BufferedDuration>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::sys_time<BufferedDuration>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::utc_time<BufferedDuration>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::gps_time<BufferedDuration>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::tai_time<BufferedDuration>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::file_time<BufferedDuration>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| local_time_fmt<BufferedDuration>>); |
| |
| template<> |
| inline constexpr bool |
| std::enable_nonlocking_formatter_optimization<Rep<void, long>> = true; |
| |
| using NonBufferedRep = std::chrono::duration<Rep<void, long>>; |
| |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| NonBufferedRep>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::local_time<NonBufferedRep>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::sys_time<NonBufferedRep>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::utc_time<NonBufferedRep>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::gps_time<NonBufferedRep>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::tai_time<NonBufferedRep>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::file_time<NonBufferedRep>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| local_time_fmt<NonBufferedRep>>); |
| |
| using NonBufferedDuration = std::chrono::duration<Rep<void, short>>; |
| |
| template<> |
| inline constexpr bool |
| std::enable_nonlocking_formatter_optimization<NonBufferedDuration> = true; |
| |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| NonBufferedDuration>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::local_time<NonBufferedDuration>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::sys_time<NonBufferedDuration>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::utc_time<NonBufferedDuration>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::gps_time<NonBufferedDuration>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::tai_time<NonBufferedDuration>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::file_time<NonBufferedDuration>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| local_time_fmt<NonBufferedDuration>>); |
| |
| #if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::zoned_time<std::chrono::seconds>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::zoned_time<BufferedDuration>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::zoned_time<NonBufferedRep>>); |
| static_assert(std::enable_nonlocking_formatter_optimization< |
| std::chrono::zoned_time<NonBufferedDuration>>); |
| |
| struct MyTimeZone : std::chrono::time_zone |
| {}; |
| |
| template<> |
| struct std::chrono::zoned_traits<MyTimeZone> |
| { |
| static const MyTimeZone* default_zone(); |
| static const MyTimeZone* locate_zone(std::string_view name); |
| }; |
| |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::zoned_time<std::chrono::seconds, MyTimeZone>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::zoned_time<BufferedDuration, MyTimeZone>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::zoned_time<NonBufferedRep, MyTimeZone>>); |
| static_assert(!std::enable_nonlocking_formatter_optimization< |
| std::chrono::zoned_time<NonBufferedDuration, MyTimeZone>>); |
| #endif |
| |