diff options
| author | bors <bors@rust-lang.org> | 2014-03-14 05:26:29 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-03-14 05:26:29 -0700 |
| commit | a1c7ebee1ac65151835f8b82d7140d52402c22c2 (patch) | |
| tree | 248008ed59eb85597d31d5e420994ab602bc1745 /src/libsyntax | |
| parent | d367482491ab82af8cc88f2f822fef725237cfbe (diff) | |
| parent | edb6b025c48205c5084a648c7ef7859adbf5c705 (diff) | |
| download | rust-a1c7ebee1ac65151835f8b82d7140d52402c22c2.tar.gz rust-a1c7ebee1ac65151835f8b82d7140d52402c22c2.zip | |
auto merge of #12874 : huonw/rust/printier-rustc, r=alexcrichton
rustc: make stack traces print for .span_bug/.bug. Previously a call to either of those to diagnostic printers would defer to the `fatal` equivalents, which explicitly silence the stderr printing, including a stack trace from `RUST_LOG=std::rt::backtrace`. This splits the bug printers out to their own diagnostic type so that things work properly. Also, this removes the `Ok(...)` that was being printed around the subtask's stderr output.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/diagnostic.rs | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs index 0cf13cfaba5..2da8b786805 100644 --- a/src/libsyntax/diagnostic.rs +++ b/src/libsyntax/diagnostic.rs @@ -17,8 +17,6 @@ use std::io; use std::iter::range; use term; -static BUG_REPORT_URL: &'static str = - "http://static.rust-lang.org/doc/master/complement-bugreport.html"; // maximum number of lines we will print for each error; arbitrary. static MAX_LINES: uint = 6u; @@ -34,6 +32,10 @@ pub trait Emitter { /// how a rustc task died (if so desired). pub struct FatalError; +/// Signifies that the compiler died with an explicit call to `.bug` +/// or `.span_bug` rather than a failed assertion, etc. +pub struct ExplicitBug; + // a span-handler is like a handler but also // accepts span information for source-location // reporting. @@ -61,7 +63,8 @@ impl SpanHandler { self.handler.custom_emit(&*self.cm, sp, msg, Note); } pub fn span_bug(&self, sp: Span, msg: &str) -> ! { - self.span_fatal(sp, ice_msg(msg)); + self.handler.emit(Some((&*self.cm, sp)), msg, Bug); + fail!(ExplicitBug); } pub fn span_unimpl(&self, sp: Span, msg: &str) -> ! { self.span_bug(sp, ~"unimplemented " + msg); @@ -116,7 +119,8 @@ impl Handler { self.emit.borrow_mut().get().emit(None, msg, Note); } pub fn bug(&self, msg: &str) -> ! { - self.fatal(ice_msg(msg)); + self.emit.borrow_mut().get().emit(None, msg, Bug); + fail!(ExplicitBug); } pub fn unimpl(&self, msg: &str) -> ! { self.bug(~"unimplemented " + msg); @@ -133,11 +137,6 @@ impl Handler { } } -pub fn ice_msg(msg: &str) -> ~str { - format!("internal compiler error: {}\nThis message reflects a bug in the Rust compiler. \ - \nWe would appreciate a bug report: {}", msg, BUG_REPORT_URL) -} - pub fn mk_span_handler(handler: @Handler, cm: @codemap::CodeMap) -> @SpanHandler { @SpanHandler { @@ -159,6 +158,7 @@ pub fn mk_handler(e: ~Emitter) -> @Handler { #[deriving(Eq)] pub enum Level { + Bug, Fatal, Error, Warning, @@ -170,6 +170,7 @@ impl fmt::Show for Level { use std::fmt::Show; match *self { + Bug => "error: internal compiler error".fmt(f), Fatal | Error => "error".fmt(f), Warning => "warning".fmt(f), Note => "note".fmt(f), @@ -180,7 +181,7 @@ impl fmt::Show for Level { impl Level { fn color(self) -> term::color::Color { match self { - Fatal | Error => term::color::BRIGHT_RED, + Bug | Fatal | Error => term::color::BRIGHT_RED, Warning => term::color::BRIGHT_YELLOW, Note => term::color::BRIGHT_GREEN } |
