diff --git a/libstdc++-v3/src/c++11/futex.cc b/libstdc++-v3/src/c++11/futex.cc index 15959cebee57..c008798318c9 100644 --- a/libstdc++-v3/src/c++11/futex.cc +++ b/libstdc++-v3/src/c++11/futex.cc @@ -73,21 +73,23 @@ namespace return rt; } - auto rel_s = abs_s.count() - now_s; + const auto rel_s = abs_s.count() - now_s; - // Avoid overflows + // Convert the absolute timeout to a relative timeout, without overflow. if (rel_s > __int_traits::__max) [[unlikely]] - rel_s = __int_traits::__max; - else if (rel_s < __int_traits::__min) [[unlikely]] - rel_s = __int_traits::__min; - - // Convert the absolute timeout value to a relative timeout - rt.tv_sec = rel_s; - rt.tv_nsec = abs_ns.count() - now_ns; - if (rt.tv_nsec < 0) { - rt.tv_nsec += 1000000000; - --rt.tv_sec; + rt.tv_sec = __int_traits::__max; + rt.tv_nsec = 999999999; + } + else + { + rt.tv_sec = rel_s; + rt.tv_nsec = abs_ns.count() - now_ns; + if (rt.tv_nsec < 0) + { + rt.tv_nsec += 1000000000; + --rt.tv_sec; + } } return rt; diff --git a/libstdc++-v3/testsuite/30_threads/future/members/wait_until_overflow.cc b/libstdc++-v3/testsuite/30_threads/future/members/93456.cc similarity index 100% rename from libstdc++-v3/testsuite/30_threads/future/members/wait_until_overflow.cc rename to libstdc++-v3/testsuite/30_threads/future/members/93456.cc