Merge pull request #301 from ktopley-apple/dispatch-time-overflows

Fix overflow traps in DispatchTime/DispatchWallTime/DispatchTimeInterval
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0b7e55e..379a095 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -201,21 +201,19 @@
 endif()
 
 if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
-  add_custom_command(OUTPUT
-                       "${CMAKE_SOURCE_DIR}/dispatch/module.modulemap"
-                       "${CMAKE_SOURCE_DIR}/private/module.modulemap"
-                     COMMAND
-                       ${CMAKE_COMMAND} -E create_symlink "${CMAKE_SOURCE_DIR}/darwin/module.modulemap" "${CMAKE_SOURCE_DIR}/dispatch/module.modulemap"
-                     COMMAND
-                       ${CMAKE_COMMAND} -E create_symlink "${CMAKE_SOURCE_DIR}/darwin/module.modulemap" "${CMAKE_SOURCE_DIR}/private/module.modulemap")
+  add_custom_target(module-map-symlinks
+                    ALL
+                    COMMAND
+                      ${CMAKE_COMMAND} -E create_symlink "${CMAKE_SOURCE_DIR}/dispatch/darwin/module.modulemap" "${CMAKE_SOURCE_DIR}/dispatch/module.modulemap"
+                    COMMAND
+                      ${CMAKE_COMMAND} -E create_symlink "${CMAKE_SOURCE_DIR}/private/darwin/module.modulemap" "${CMAKE_SOURCE_DIR}/private/module.modulemap")
 else()
-  add_custom_command(OUTPUT
-                       "${CMAKE_SOURCE_DIR}/dispatch/module.modulemap"
-                       "${CMAKE_SOURCE_DIR}/private/module.modulemap"
-                     COMMAND
-                       ${CMAKE_COMMAND} -E create_symlink "${CMAKE_SOURCE_DIR}/generic/module.modulemap" "${CMAKE_SOURCE_DIR}/dispatch/module.modulemap"
-                     COMMAND
-                       ${CMAKE_COMMAND} -E create_symlink "${CMAKE_SOURCE_DIR}/generic/module.modulemap" "${CMAKE_SOURCE_DIR}/private/module.modulemap")
+  add_custom_target(module-map-symlinks
+                    ALL
+                    COMMAND
+                      ${CMAKE_COMMAND} -E create_symlink "${CMAKE_SOURCE_DIR}/dispatch/generic/module.modulemap" "${CMAKE_SOURCE_DIR}/dispatch/module.modulemap"
+                    COMMAND
+                      ${CMAKE_COMMAND} -E create_symlink "${CMAKE_SOURCE_DIR}/private/generic/module.modulemap" "${CMAKE_SOURCE_DIR}/private/module.modulemap")
 endif()
 configure_file("${CMAKE_SOURCE_DIR}/cmake/config.h.in"
                "${CMAKE_BINARY_DIR}/config/config_ac.h")
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2ec2691..e6f265e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -99,6 +99,8 @@
                     SWIFT_FLAGS
                       -I ${CMAKE_SOURCE_DIR}
                       ${swift_optimization_flags})
+  add_dependencies(swiftDispatch
+                     module-map-symlinks)
   target_sources(dispatch
                  PRIVATE
                    swift/DispatchStubs.cc
diff --git a/src/swift/Time.swift b/src/swift/Time.swift
index f044d59..b6cd33c 100644
--- a/src/swift/Time.swift
+++ b/src/swift/Time.swift
@@ -2,7 +2,7 @@
 //
 // This source file is part of the Swift.org open source project
 //
-// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
+// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
 // Licensed under Apache License v2.0 with Runtime Library Exception
 //
 // See http://swift.org/LICENSE.txt for license information
@@ -78,13 +78,14 @@
 	}
 }
 
-public func <(a: DispatchTime, b: DispatchTime) -> Bool {
-	if a.rawValue == ~0 || b.rawValue == ~0 { return false }
-	return a.rawValue < b.rawValue
-}
+extension DispatchTime {
+	public static func < (a: DispatchTime, b: DispatchTime) -> Bool {
+		return a.rawValue < b.rawValue
+	}
 
-public func ==(a: DispatchTime, b: DispatchTime) -> Bool {
-	return a.rawValue == b.rawValue
+	public static func ==(a: DispatchTime, b: DispatchTime) -> Bool {
+		return a.rawValue == b.rawValue
+	}
 }
 
 public struct DispatchWallTime : Comparable {
@@ -106,17 +107,20 @@
 	}
 }
 
-public func <(a: DispatchWallTime, b: DispatchWallTime) -> Bool {
-	if b.rawValue == ~0 {
-		return a.rawValue != ~0
-	} else if a.rawValue == ~0 {
-		return false
+extension DispatchWallTime {
+	public static func <(a: DispatchWallTime, b: DispatchWallTime) -> Bool {
+		let negativeOne: dispatch_time_t = ~0
+		if b.rawValue == negativeOne {
+			return a.rawValue != negativeOne
+		} else if a.rawValue == negativeOne {
+			return false
+		}
+		return -Int64(bitPattern: a.rawValue) < -Int64(bitPattern: b.rawValue)
 	}
-	return -Int64(bitPattern: a.rawValue) < -Int64(bitPattern: b.rawValue)
-}
 
-public func ==(a: DispatchWallTime, b: DispatchWallTime) -> Bool {
-	return a.rawValue == b.rawValue
+	public static func ==(a: DispatchWallTime, b: DispatchWallTime) -> Bool {
+		return a.rawValue == b.rawValue
+	}
 }
 
 // Returns m1 * m2, clamped to the range [Int64.min, Int64.max].