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

Reply via email to