about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-12-04 21:01:03 +0000
committerbors <bors@rust-lang.org>2015-12-04 21:01:03 +0000
commit55a4e050921a8f72cff28b0ab6e58376382daf32 (patch)
tree451ea4e9ca08a7f6898dfa40c01997f060bcba3f
parent68c15be8b5a28297ae58ea030adf49f265e41127 (diff)
parent07471423a29bd4508a0552d4b9cfb104ca2a5928 (diff)
downloadrust-55a4e050921a8f72cff28b0ab6e58376382daf32.tar.gz
rust-55a4e050921a8f72cff28b0ab6e58376382daf32.zip
Auto merge of #30173 - sgrif:sg-fix-time-bug, r=alexcrichton
Currently if you add a duration which should lead to 0 nanos and 1
additional second, we end up with no additional seconds, and 1000000000
nanos.
-rw-r--r--src/libstd/sys/unix/time.rs4
-rw-r--r--src/libstd/time/mod.rs5
2 files changed, 7 insertions, 2 deletions
diff --git a/src/libstd/sys/unix/time.rs b/src/libstd/sys/unix/time.rs
index 75319ce962c..a07c30d9648 100644
--- a/src/libstd/sys/unix/time.rs
+++ b/src/libstd/sys/unix/time.rs
@@ -111,7 +111,7 @@ mod inner {
             // Nano calculations can't overflow because nanos are <1B which fit
             // in a u32.
             let mut usec = (other.subsec_nanos() / 1000) + self.t.tv_usec as u32;
-            if usec > USEC_PER_SEC as u32 {
+            if usec >= USEC_PER_SEC as u32 {
                 usec -= USEC_PER_SEC as u32;
                 secs = secs.checked_add(1).expect("overflow when adding \
                                                    duration to time");
@@ -330,7 +330,7 @@ mod inner {
             // Nano calculations can't overflow because nanos are <1B which fit
             // in a u32.
             let mut nsec = other.subsec_nanos() + self.t.tv_nsec as u32;
-            if nsec > NSEC_PER_SEC as u32 {
+            if nsec >= NSEC_PER_SEC as u32 {
                 nsec -= NSEC_PER_SEC as u32;
                 secs = secs.checked_add(1).expect("overflow when adding \
                                                    duration to time");
diff --git a/src/libstd/time/mod.rs b/src/libstd/time/mod.rs
index d400d12e23f..e3ce8e0de4b 100644
--- a/src/libstd/time/mod.rs
+++ b/src/libstd/time/mod.rs
@@ -303,6 +303,11 @@ mod tests {
         let eighty_years = second * 60 * 60 * 24 * 365 * 80;
         assert_almost_eq!(a - eighty_years + eighty_years, a);
         assert_almost_eq!(a - (eighty_years * 10) + (eighty_years * 10), a);
+
+        let one_second_from_epoch = UNIX_EPOCH + Duration::new(1, 0);
+        let one_second_from_epoch2 = UNIX_EPOCH + Duration::new(0, 500_000_000)
+            + Duration::new(0, 500_000_000);
+        assert_eq!(one_second_from_epoch, one_second_from_epoch2);
     }
 
     #[test]