https://gcc.gnu.org/g:6e9ab669b584496dd628700d0d69bd20c5c12ca7
commit r16-4432-g6e9ab669b584496dd628700d0d69bd20c5c12ca7 Author: Mike Crowe <[email protected]> Date: Sun Sep 21 17:15:52 2025 +0100 libstdc++: Add negative this_thread::sleep tests [PR116586] Add tests to ensure that std::this_thread::sleep_for() and std::this_thread::sleep_until() cope with being passed negative times correctly. These tests prove that the functions don't suffer from libstdc++/PR116586, and will stay that way. libstdc++-v3/ChangeLog: PR libstdc++/116586 * testsuite/30_threads/this_thread/sleep_for.cc: Add test_negative() test. * testsuite/30_threads/this_thread/sleep_until.cc: Make existing test use both system_clock and steady_clock. Add test_negative() test. Signed-off-by: Mike Crowe <[email protected]> Diff: --- .../testsuite/30_threads/this_thread/sleep_for.cc | 13 +++++++++++ .../30_threads/this_thread/sleep_until.cc | 26 ++++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/libstdc++-v3/testsuite/30_threads/this_thread/sleep_for.cc b/libstdc++-v3/testsuite/30_threads/this_thread/sleep_for.cc index 3f55ccc12aa5..5b0518d6bb9f 100644 --- a/libstdc++-v3/testsuite/30_threads/this_thread/sleep_for.cc +++ b/libstdc++-v3/testsuite/30_threads/this_thread/sleep_for.cc @@ -37,7 +37,20 @@ test01() VERIFY( (chr::system_clock::now() - begin) >= ms ); } +void +test_negative() +{ + chr::system_clock::time_point begin = chr::system_clock::now(); + + std::this_thread::sleep_for(-chr::hours(8)); + + // That should have completed immediately, but be generous because we don't + // want spurious failures on busy machines. + VERIFY( (chr::system_clock::now() - begin) < chr::seconds(10) ); +} + int main() { test01(); + test_negative(); } diff --git a/libstdc++-v3/testsuite/30_threads/this_thread/sleep_until.cc b/libstdc++-v3/testsuite/30_threads/this_thread/sleep_until.cc index 1fb82b671772..8c70c2ee78fd 100644 --- a/libstdc++-v3/testsuite/30_threads/this_thread/sleep_until.cc +++ b/libstdc++-v3/testsuite/30_threads/this_thread/sleep_until.cc @@ -26,18 +26,36 @@ namespace chr = std::chrono; +template <typename Clock> void test01() { - chr::system_clock::time_point begin = chr::system_clock::now(); + typename Clock::time_point begin = Clock::now(); chr::microseconds ms(500); - std::this_thread::sleep_until(chr::system_clock::now() + ms); + std::this_thread::sleep_until(Clock::now() + ms); - VERIFY( (chr::system_clock::now() - begin) >= ms ); + VERIFY( (Clock::now() - begin) >= ms ); +} + +template <typename Clock> +void +test_negative() +{ + typename Clock::time_point begin = Clock::now(); + + typename Clock::time_point tp(-chr::hours(8)); + std::this_thread::sleep_until(tp); + + // That should have completed immediately, but be generous because we don't + // want spurious failures on busy machines. + VERIFY( (Clock::now() - begin) < chr::seconds(10) ); } int main() { - test01(); + test01<chr::steady_clock>(); + test01<chr::system_clock>(); + test_negative<chr::steady_clock>(); + test_negative<chr::system_clock>(); }
