libstdc++: Define and use chrono::is_clock for C++20
authorJonathan Wakely <jwakely@redhat.com>
Wed, 25 Mar 2020 22:07:02 +0000 (22:07 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 25 Mar 2020 22:07:02 +0000 (22:07 +0000)
commitbf1fc37bb4a3cab851e2acec811427d5243a22e9
treebaa9ab1b47e7c91a5a682057b4e89197c3bd7feb
parentfe4b53b2e7e58d3bcf476a0a319b51a5a8c668a2
libstdc++: Define and use chrono::is_clock for C++20

For C++20 the wait_until members of mutexes and condition variables are
required to be ill-formed if given a clock that doesn't meet the
requirements for a clock type. To implement that requirement this patch
adds static assertions using the chrono::is_clock trait, and defines
that trait.

To avoid expensive checks for the common cases, the trait (and
associated variable template) are explicitly specialized for the
standard clock types.

This also moves the filesystem::__file_clock type from <filesystem> to
<chrono>, so that chrono::file_clock and chrono::file_time can be
defined in <chrono> as required.

* include/bits/fs_fwd.h (filesystem::__file_clock): Move to ...
* include/std/chrono (filesystem::__file_clock): Here.
(filesystem::__file_clock::from_sys, filesystem::__file_clock::to_sys):
Define public member functions for C++20.
(is_clock, is_clock_v): Define traits for C++20.
* include/std/condition_variable (condition_variable::wait_until): Add
check for valid clock.
* include/std/future (_State_baseV2::wait_until): Likewise.
* include/std/mutex (__timed_mutex_impl::_M_try_lock_until): Likewise.
* include/std/shared_mutex (shared_timed_mutex::try_lock_shared_until):
Likewise.
* include/std/thread (this_thread::sleep_until): Likewise.
* testsuite/30_threads/condition_variable/members/2.cc: Qualify
slow_clock with new namespace.
* testsuite/30_threads/condition_variable/members/clock_neg.cc: New
test.
* testsuite/30_threads/condition_variable_any/members/clock_neg.cc:
New test.
* testsuite/30_threads/future/members/clock_neg.cc: New test.
* testsuite/30_threads/recursive_timed_mutex/try_lock_until/3.cc:
Qualify slow_clock with new namespace.
* testsuite/30_threads/recursive_timed_mutex/try_lock_until/
clock_neg.cc: New test.
* testsuite/30_threads/shared_future/members/clock_neg.cc: New
test.
* testsuite/30_threads/shared_lock/locking/clock_neg.cc: New test.
* testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc:
New test.
* testsuite/30_threads/timed_mutex/try_lock_until/3.cc: Qualify
slow_clock with new namespace.
* testsuite/30_threads/timed_mutex/try_lock_until/4.cc: Likewise.
* testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc: New
test.
* testsuite/30_threads/unique_lock/locking/clock_neg.cc: New test.
* testsuite/std/time/traits/is_clock.cc: New test.
* testsuite/util/slow_clock.h (slow_clock): Move to __gnu_test
namespace.
23 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/fs_fwd.h
libstdc++-v3/include/std/chrono
libstdc++-v3/include/std/condition_variable
libstdc++-v3/include/std/future
libstdc++-v3/include/std/mutex
libstdc++-v3/include/std/shared_mutex
libstdc++-v3/include/std/thread
libstdc++-v3/testsuite/30_threads/condition_variable/members/2.cc
libstdc++-v3/testsuite/30_threads/condition_variable/members/clock_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/30_threads/condition_variable_any/members/clock_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/30_threads/future/members/clock_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/3.cc
libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/30_threads/shared_future/members/clock_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/30_threads/shared_lock/locking/clock_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/3.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/4.cc
libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/30_threads/unique_lock/locking/clock_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/time/traits/is_clock.cc [new file with mode: 0644]
libstdc++-v3/testsuite/util/slow_clock.h