bool __equal, memory_order __mo,
const chrono::time_point<std::chrono::system_clock, _Dur>& __atime)
{
- auto __s = chrono::time_point_cast<chrono::seconds>(__atime);
- auto __ns = chrono::duration_cast<chrono::nanoseconds>(__atime - __s);
- // XXX correct?
+ auto __d = __atime.time_since_epoch();
+ if (__d < __d.zero()) [[__unlikely__]]
+ return false;
+ auto __s = chrono::duration_cast<chrono::seconds>(__d);
+ auto __ns = chrono::duration_cast<chrono::nanoseconds>(__d - __s);
return _M_load_and_test_until(__assumed, __operand, __equal, __mo,
- true, __s.time_since_epoch(), __ns);
+ true, __s, __ns);
}
template<typename _Dur>
bool __equal, memory_order __mo,
const chrono::time_point<std::chrono::steady_clock, _Dur>& __atime)
{
- auto __s = chrono::time_point_cast<chrono::seconds>(__atime);
- auto __ns = chrono::duration_cast<chrono::nanoseconds>(__atime - __s);
- // XXX correct?
+ auto __d = __atime.time_since_epoch();
+ if (__d < __d.zero()) [[__unlikely__]]
+ return false;
+ auto __s = chrono::duration_cast<chrono::seconds>(__d);
+ auto __ns = chrono::duration_cast<chrono::nanoseconds>(__d - __s);
return _M_load_and_test_until_steady(__assumed, __operand, __equal, __mo,
- true, __s.time_since_epoch(), __ns);
+ true, __s, __ns);
}
public:
if (!futex_clock_realtime_unavailable.load(std::memory_order_relaxed))
{
// futex sets errno=EINVAL for absolute timeouts before the epoch.
- if (__s.count() < 0)
+ if (__s.count() < 0 || __ns.count() < 0) [[unlikely]]
return false;
syscall_timespec rt;
if (!futex_clock_monotonic_unavailable.load(std::memory_order_relaxed))
{
// futex sets errno=EINVAL for absolute timeouts before the epoch.
- if (__s.count() < 0) [[unlikely]]
+ if (__s.count() < 0 || __ns.count() < 0) [[unlikely]]
return false;
syscall_timespec rt;
--- /dev/null
+// { dg-do run { target c++11 } }
+
+#include <chrono>
+#include <future>
+
+void
+test_sys()
+{
+ std::promise<void> p;
+ std::chrono::system_clock::time_point tp(std::chrono::milliseconds{-10});
+ (void) p.get_future().wait_until(tp);
+}
+
+void
+test_steady()
+{
+ std::promise<void> p;
+ std::chrono::steady_clock::time_point tp(std::chrono::milliseconds{-10});
+ (void) p.get_future().wait_until(tp);
+}
+
+int main()
+{
+ test_sys();
+ test_steady();
+}