On Wed, 15 Oct 2025 at 15:05, Tomasz Kaminski <[email protected]> wrote:
>
>
>
> On Wed, Oct 15, 2025 at 3:01 PM Tomasz Kaminski <[email protected]> wrote:
>>
>>
>>
>> On Wed, Oct 15, 2025 at 2:17 PM Jonathan Wakely <[email protected]> wrote:
>>>
>>> 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:
>>>
>>> * 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.
>>> ---
>>>
>>> Bootstrapped arm-eabi, testing on powerpc64le-linux now.
>>
>> Do we need to even try to ifdef this function, it's template and would not
>> be instantiated.
>> Except ::timespec, there seems to be nothing that it would depend on that
>> wouldn't be generally available.
>
> From out of list discussion: These conditions are meant to replicate
> situations, when we require that timespec
> to be defined. It is included in c++17 or later. so for C++11 we aim to
> require it only when it was already used.
Yeah, ::timespec is the concern. It's not in the C++ standard until
C++17, so a strict C library might not expose it unless __cplusplus >=
201703L, but this function wants timespec in C++11 for
std::timed_mutex etc.
Or a non-gthreads target with no usable sleep functions might not
define timespec at all, for any value of __cplusplus.
So rather than requiring timespec unconditionally, I wanted to only
use it if we have gthreads, or a usable sleep function, or are on
linux and using futexes. Any target supporting one of those things
should be able to provide timespec.We're still making a bit of an
assumption there, but less than just assuming that all targets provide
timespec.
I realised we need another fix though, it should only be defined for
_GLIBCXX_HOSTED.
>
> LGTM.
>>
>>
>> libstdc++-v3/include/bits/chrono.h | 4 ++--
>> libstdc++-v3/include/bits/this_thread_sleep.h | 1 -
>> 2 files changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/libstdc++-v3/include/bits/chrono.h
>> b/libstdc++-v3/include/bits/chrono.h
>> index 7f505aa0f0ff..2b0550b15f76 100644
>> --- a/libstdc++-v3/include/bits/chrono.h
>> +++ b/libstdc++-v3/include/bits/chrono.h
>> @@ -1515,8 +1515,8 @@ _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 \
>> + || _GLIBCXX_HAVE_LINUX_FUTEX
>> namespace chrono
>> {
>> /// @cond undocumented
>> 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 <bits/chrono.h> // std::chrono::*
>> -#include <ext/numeric_traits.h> // __int_traits
>>
>> #ifdef _GLIBCXX_USE_NANOSLEEP
>> # include <cerrno> // errno, EINTR
>> --
>> 2.51.0
>>