[swift-dev] Strange DispatchTime bug

Guillaume Lessard glessard at tffenterprises.com
Sat Aug 26 14:21:21 CDT 2017

On Linux (Ubuntu 16.04) and swift distributions from 3.0.2 to the latest 4.0 snapshot, I’m seeing incorrect behaviour involving DispatchTime.distantFuture:
(also: https://bugs.swift.org/browse/SR-5706)

import Dispatch

let now = DispatchTime.now()
let future = DispatchTime.distantFuture
assert(now != future, "this is not the distant future")

print(String(now.rawValue, radix: 16))                  // 1c20d6bbd3a (e.g.)
print(String(future.rawValue, radix: 16))               // ffffffffffffffff

print(now < future)                                     // false (incorrect)
print(future < now)                                     // false

print(now > future)                                     // false
print(future > now)                                     // false (incorrect)

extension DispatchTime {
  public static func compare(_ a: DispatchTime, happensBefore b: DispatchTime) -> Bool {
    return a.rawValue < b.rawValue

print(DispatchTime.compare(now, happensBefore: future)) // true
print(DispatchTime.compare(future, happensBefore: now)) // false

Note that the static func I defined above is essentially the same as the less-than operator as defined in the libdispatch overlay: <https://github.com/apple/swift/blob/92f750aa3c3c4dce47eb55068850f3d1127b16bd/stdlib/public/SDK/Dispatch/Time.swift#L73>

Also, there is a test that should catch this problem:<https://github.com/apple/swift/blob/92f750aa3c3c4dce47eb55068850f3d1127b16bd/test/stdlib/Dispatch.swift#L104>

Could this operator func somehow be called correctly during testing, but incorrectly at runtime?
(In other words, I don’t see where the fix needs to be.)

Guillaume Lessard

More information about the swift-dev mailing list