about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2015-06-20 19:54:15 -0700
committerSteven Fackler <sfackler@gmail.com>2015-06-20 19:54:15 -0700
commit8193133f3548390559936fdaf377f5ef951ffd29 (patch)
treea0975a4809a2988f844b18e0d88e4e4f32d310e6 /src/libstd
parent9ad0063a1772edca3299e2dc76187bbfa74e8b16 (diff)
downloadrust-8193133f3548390559936fdaf377f5ef951ffd29.tar.gz
rust-8193133f3548390559936fdaf377f5ef951ffd29.zip
Fix logic in panic printing with no stderr
If a local stderr is present but the normal stderr is missing, we still
want to print.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/panicking.rs23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/libstd/panicking.rs b/src/libstd/panicking.rs
index b584658fb07..bb4375c1b88 100644
--- a/src/libstd/panicking.rs
+++ b/src/libstd/panicking.rs
@@ -31,15 +31,12 @@ pub fn on_panic(obj: &(Any+Send), file: &'static str, line: u32) {
             None => "Box<Any>",
         }
     };
-    let mut err = match Stderr::new() {
-        Ok(err) => err,
-        _ => return,
-    };
+    let mut err = Stderr::new().ok();
     let thread = thread_info::current_thread();
     let name = thread.as_ref().and_then(|t| t.name()).unwrap_or("<unnamed>");
     let prev = LOCAL_STDERR.with(|s| s.borrow_mut().take());
-    match prev {
-        Some(mut stderr) => {
+    match (prev, err.as_mut()) {
+        (Some(mut stderr), _) => {
             // FIXME: what to do when the thread printing panics?
             let _ = writeln!(stderr,
                              "thread '{}' panicked at '{}', {}:{}\n",
@@ -52,18 +49,22 @@ pub fn on_panic(obj: &(Any+Send), file: &'static str, line: u32) {
                 *slot.borrow_mut() = s.take();
             });
         }
-        None => {
-            let _ = writeln!(&mut err, "thread '{}' panicked at '{}', {}:{}",
+        (None, Some(ref mut err)) => {
+            let _ = writeln!(err, "thread '{}' panicked at '{}', {}:{}",
                              name, msg, file, line);
             if backtrace::log_enabled() {
-                let _ = backtrace::write(&mut err);
+                let _ = backtrace::write(err);
             }
         }
+        _ => {}
     }
 
     // If this is a double panic, make sure that we printed a backtrace
     // for this panic.
-    if unwind::panicking() && !backtrace::log_enabled() {
-        let _ = backtrace::write(&mut err);
+    match err {
+        Some(ref mut err) if unwind::panicking() && !backtrace::log_enabled() => {
+            let _ = backtrace::write(err);
+        }
+        _ => {}
     }
 }