From 877139495d4c572493f2440cff038283a3ba4e5e Mon Sep 17 00:00:00 2001
From: Alex Crichton <alex@alexcrichton.com>
Date: Thu, 13 Nov 2014 08:48:38 -0800
Subject: [PATCH] std: Fix the return value of Duration::span

The subtraction was erroneously backwards, returning negative durations!

Closes #18925
---
 src/librustc/util/common.rs | 2 +-
 src/libstd/time/duration.rs | 9 ++++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/librustc/util/common.rs b/src/librustc/util/common.rs
index b845e507fd333..06154f68613e7 100644
--- a/src/librustc/util/common.rs
+++ b/src/librustc/util/common.rs
@@ -35,7 +35,7 @@ pub fn time<T, U>(do_it: bool, what: &str, u: U, f: |U| -> T) -> T {
     let rv = rv.unwrap();
 
     println!("{}time: {}.{:03} \t{}", "  ".repeat(old),
-             dur.num_seconds(), dur.num_milliseconds(), what);
+             dur.num_seconds(), dur.num_milliseconds() % 1000, what);
     depth.replace(Some(old));
 
     rv
diff --git a/src/libstd/time/duration.rs b/src/libstd/time/duration.rs
index c2d4afeb9add3..8892884045ac7 100644
--- a/src/libstd/time/duration.rs
+++ b/src/libstd/time/duration.rs
@@ -140,7 +140,7 @@ impl Duration {
     pub fn span(f: ||) -> Duration {
         let before = super::precise_time_ns();
         f();
-        Duration::nanoseconds((before - super::precise_time_ns()) as i64)
+        Duration::nanoseconds((super::precise_time_ns() - before) as i64)
     }
 
     /// Returns the total number of whole weeks in the duration.
@@ -565,4 +565,11 @@ mod tests {
         assert_eq!(format!("{:30}", Duration::days(1) + Duration::milliseconds(2345)),
                    "P1DT2.345S".to_string());
     }
+
+    #[test]
+    fn span() {
+        use io::timer::sleep;
+        let dur = Duration::span(|| sleep(Duration::milliseconds(5)));
+        assert!(dur > Duration::milliseconds(1));
+    }
 }