On Wed, 15 Oct 2025 at 11:38, Andreas Schwab <[email protected]> wrote:
>
> On Okt 09 2025, Jonathan Wakely wrote:
>
> > diff --git a/libstdc++-v3/include/bits/this_thread_sleep.h
> > b/libstdc++-v3/include/bits/this_thread_sleep.h
> > index 57f89f858952..01f25dda2af0 100644
> > --- a/libstdc++-v3/include/bits/this_thread_sleep.h
> > +++ b/libstdc++-v3/include/bits/this_thread_sleep.h
> > @@ -36,6 +36,7 @@
> >
> > #if __cplusplus >= 201103L
> > #include <bits/chrono.h> // std::chrono::*
> > +#include <ext/numeric_traits.h> // __int_traits
> >
> > #ifdef _GLIBCXX_USE_NANOSLEEP
> > # include <cerrno> // errno, EINTR
> > @@ -59,11 +60,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> > {
> > #ifndef _GLIBCXX_NO_SLEEP
> >
> > -#ifndef _GLIBCXX_USE_NANOSLEEP
> > - void
> > - __sleep_for(chrono::seconds, chrono::nanoseconds);
> > -#endif
> > -
> > /// this_thread::sleep_for
> > template<typename _Rep, typename _Period>
> > inline void
> > @@ -71,18 +67,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> > {
> > if (__rtime <= __rtime.zero())
> > return;
> > - auto __s = chrono::duration_cast<chrono::seconds>(__rtime);
> > - auto __ns = chrono::duration_cast<chrono::nanoseconds>(__rtime - __s);
> > +
> > + struct timespec __ts = chrono::__to_timeout_timespec(__rtime);
>
> This breaks *-elf targets like riscv64-elf and rx-elf and also arm-eabi
> where defined _GLIBCXX_USE_NANOSLEEP || defined
> _GLIBCXX_USE_CLOCK_REALTIME || defined _GLIBCXX_HAS_GTHREADS is false,
> thus chrono::__to_timeout_timespec is not defined.
>
> In file included from
> /home/abuild/rpmbuild/BUILD/cross-riscv64-elf-gcc16-16.0.0+git4435-build/gcc-16.0.0+git4435/obj-x86_64-suse-linux/riscv64-elf/libstdc++-v3/include/thread:48,
> from ../../../../../libstdc++-v3/src/c++11/thread.cc:29:
> /home/abuild/rpmbuild/BUILD/cross-riscv64-elf-gcc16-16.0.0+git4435-build/gcc-16.0.0+git4435/obj-x86_64-suse-linux/riscv64-elf/libstdc++-v3/include/bits/this_thread_sleep.h:
> In function 'void std::this_thread::sleep_for(const
> std::chrono::duration<_Rep1, _Period1>&)':
> /home/abuild/rpmbuild/BUILD/cross-riscv64-elf-gcc16-16.0.0+git4435-build/gcc-16.0.0+git4435/obj-x86_64-suse-linux/riscv64-elf/libstdc++-v3/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);
> | ^~~~~~~~~~~~~~~~~~~~~
> make[5]: *** [Makefile:685: thread.lo] Error 1
Yes, I'm testing this fix:
--- a/libstdc++-v3/include/bits/chrono.h
+++ b/libstdc++-v3/include/bits/chrono.h
@@ -1515,8 +1515,7 @@ _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 ! defined _GLIBCXX_NO_SLEEP || defined _GLIBCXX_HAS_GTHREADS
namespace chrono
{
/// @cond undocumented