From 524bca2e33b56077b1ffe9e7526857afdbccce16 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 15 Oct 2025 12:52:27 +0100 Subject: [PATCH] libstdc++: Fix missing __to_timeout_timespec for targets using POSIX sleep [PR122293] The preprocessor condition for defining the new __to_timeout_timespec function templates did not match all the conditions under which it's needed. std::this_thread::sleep_for is defined #if ! defined _GLIBCXX_NO_SLEEP but it relies on __to_timeout_timespec which was only being defined for targets that use nanosleep, or clock_gettime, or use gthreads. For a non-gthreads target that uses POSIX sleep to implement std::this_thread::sleep_for, the build fails with: include/bits/this_thread_sleep.h:71:40: error: '__to_timeout_timespec' is not a member of 'std::chrono' [-Wtemplate-body] 71 | struct timespec __ts = chrono::__to_timeout_timespec(__rtime); | ^~~~~~~~~~~~~~~~~~~~~ Presumably the same would happen for mingw-w64 if configured with --disable-threads (as that would be a non-gthreads target that doesn't use nanosleep or clock_gettime). libstdc++-v3/ChangeLog: PR libstdc++/122293 * include/bits/chrono.h (__to_timeout_timespec): Fix preprocessor condition to match the conditions under which callers of this function are defined. * include/bits/this_thread_sleep.h: Remove unused include. --- libstdc++-v3/include/bits/chrono.h | 8 +++++--- libstdc++-v3/include/bits/this_thread_sleep.h | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/libstdc++-v3/include/bits/chrono.h b/libstdc++-v3/include/bits/chrono.h index 7f505aa0f0ff..4dc399855165 100644 --- a/libstdc++-v3/include/bits/chrono.h +++ b/libstdc++-v3/include/bits/chrono.h @@ -1515,8 +1515,9 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2) } // namespace filesystem #endif // C++17 && HOSTED -#if defined _GLIBCXX_USE_NANOSLEEP || defined _GLIBCXX_USE_CLOCK_REALTIME \ - || defined _GLIBCXX_HAS_GTHREADS +#if _GLIBCXX_HOSTED +#if ! defined _GLIBCXX_NO_SLEEP || defined _GLIBCXX_HAS_GTHREADS \ + || _GLIBCXX_HAVE_LINUX_FUTEX namespace chrono { /// @cond undocumented @@ -1585,7 +1586,8 @@ namespace chrono /// @endcond } // namespace chrono -#endif // USE_NANOSLEEP || USE_CLOCK_REALTIME || HAS_GTHREADS +#endif // !NO_SLEEP || HAS_GTHREADS || HAVE_LINUX_FUTEX +#endif // HOSTED _GLIBCXX_END_NAMESPACE_VERSION } // namespace std diff --git a/libstdc++-v3/include/bits/this_thread_sleep.h b/libstdc++-v3/include/bits/this_thread_sleep.h index 01f25dda2af0..7c9d573d86d8 100644 --- a/libstdc++-v3/include/bits/this_thread_sleep.h +++ b/libstdc++-v3/include/bits/this_thread_sleep.h @@ -36,7 +36,6 @@ #if __cplusplus >= 201103L #include // std::chrono::* -#include // __int_traits #ifdef _GLIBCXX_USE_NANOSLEEP # include // errno, EINTR