Make sure the compiler actually panics on delay_span_bug

Even if that is just happening because of `abort_if_errors`
This commit is contained in:
Oliver Schneider 2018-07-19 17:53:44 +02:00
parent 0fc4501256
commit 56c90774a9
5 changed files with 36 additions and 7 deletions

View File

@ -1193,6 +1193,8 @@ fn parse_cross_lang_lto(slot: &mut CrossLangLto, v: Option<&str>) -> bool {
"run all passes except codegen; no output"), "run all passes except codegen; no output"),
treat_err_as_bug: bool = (false, parse_bool, [TRACKED], treat_err_as_bug: bool = (false, parse_bool, [TRACKED],
"treat all errors that occur as bugs"), "treat all errors that occur as bugs"),
report_delayed_bugs: bool = (false, parse_bool, [TRACKED],
"immediately print bugs registered with `delay_span_bug`"),
external_macro_backtrace: bool = (false, parse_bool, [UNTRACKED], external_macro_backtrace: bool = (false, parse_bool, [UNTRACKED],
"show macro backtraces even for non-local macros"), "show macro backtraces even for non-local macros"),
teach: bool = (false, parse_bool, [TRACKED], teach: bool = (false, parse_bool, [TRACKED],
@ -3133,6 +3135,10 @@ fn test_debugging_options_tracking_hash() {
opts.debugging_opts.treat_err_as_bug = true; opts.debugging_opts.treat_err_as_bug = true;
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
opts = reference.clone();
opts.debugging_opts.report_delayed_bugs = true;
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
opts = reference.clone(); opts = reference.clone();
opts.debugging_opts.continue_parse_after_error = true; opts.debugging_opts.continue_parse_after_error = true;
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());

View File

@ -1000,6 +1000,7 @@ pub fn build_session_with_codemap(
let can_emit_warnings = !(warnings_allow || cap_lints_allow); let can_emit_warnings = !(warnings_allow || cap_lints_allow);
let treat_err_as_bug = sopts.debugging_opts.treat_err_as_bug; let treat_err_as_bug = sopts.debugging_opts.treat_err_as_bug;
let report_delayed_bugs = sopts.debugging_opts.report_delayed_bugs;
let external_macro_backtrace = sopts.debugging_opts.external_macro_backtrace; let external_macro_backtrace = sopts.debugging_opts.external_macro_backtrace;
@ -1045,6 +1046,7 @@ pub fn build_session_with_codemap(
errors::HandlerFlags { errors::HandlerFlags {
can_emit_warnings, can_emit_warnings,
treat_err_as_bug, treat_err_as_bug,
report_delayed_bugs,
external_macro_backtrace, external_macro_backtrace,
..Default::default() ..Default::default()
}, },

View File

@ -132,7 +132,7 @@ pub fn sub<S: Into<MultiSpan>>(
/// locally in whichever way makes the most sense. /// locally in whichever way makes the most sense.
pub fn delay_as_bug(&mut self) { pub fn delay_as_bug(&mut self) {
self.level = Level::Bug; self.level = Level::Bug;
*self.handler.delayed_span_bug.borrow_mut() = Some(self.diagnostic.clone()); self.handler.delay_as_bug(self.diagnostic.clone());
self.cancel(); self.cancel();
} }

View File

@ -274,7 +274,7 @@ pub struct Handler {
err_count: AtomicUsize, err_count: AtomicUsize,
emitter: Lock<Box<dyn Emitter + sync::Send>>, emitter: Lock<Box<dyn Emitter + sync::Send>>,
continue_after_error: LockCell<bool>, continue_after_error: LockCell<bool>,
delayed_span_bug: Lock<Option<Diagnostic>>, delayed_span_bug: Lock<Vec<Diagnostic>>,
// This set contains the `DiagnosticId` of all emitted diagnostics to avoid // This set contains the `DiagnosticId` of all emitted diagnostics to avoid
// emitting the same diagnostic with extended help (`--teach`) twice, which // emitting the same diagnostic with extended help (`--teach`) twice, which
@ -299,9 +299,25 @@ fn default_track_diagnostic(_: &Diagnostic) {}
pub struct HandlerFlags { pub struct HandlerFlags {
pub can_emit_warnings: bool, pub can_emit_warnings: bool,
pub treat_err_as_bug: bool, pub treat_err_as_bug: bool,
pub report_delayed_bugs: bool,
pub external_macro_backtrace: bool, pub external_macro_backtrace: bool,
} }
impl Drop for Handler {
fn drop(&mut self) {
if self.err_count() == 0 {
let mut bugs = self.delayed_span_bug.borrow_mut();
let has_bugs = !bugs.is_empty();
for bug in bugs.drain(..) {
DiagnosticBuilder::new_diagnostic(self, bug).emit();
}
if has_bugs {
panic!("no errors encountered even though `delay_span_bug` issued");
}
}
}
}
impl Handler { impl Handler {
pub fn with_tty_emitter(color_config: ColorConfig, pub fn with_tty_emitter(color_config: ColorConfig,
can_emit_warnings: bool, can_emit_warnings: bool,
@ -346,7 +362,7 @@ pub fn with_emitter_and_flags(e: Box<dyn Emitter + sync::Send>, flags: HandlerFl
err_count: AtomicUsize::new(0), err_count: AtomicUsize::new(0),
emitter: Lock::new(e), emitter: Lock::new(e),
continue_after_error: LockCell::new(true), continue_after_error: LockCell::new(true),
delayed_span_bug: Lock::new(None), delayed_span_bug: Lock::new(Vec::new()),
taught_diagnostics: Lock::new(FxHashSet()), taught_diagnostics: Lock::new(FxHashSet()),
emitted_diagnostic_codes: Lock::new(FxHashSet()), emitted_diagnostic_codes: Lock::new(FxHashSet()),
emitted_diagnostics: Lock::new(FxHashSet()), emitted_diagnostics: Lock::new(FxHashSet()),
@ -503,11 +519,18 @@ pub fn span_bug<S: Into<MultiSpan>>(&self, sp: S, msg: &str) -> ! {
} }
pub fn delay_span_bug<S: Into<MultiSpan>>(&self, sp: S, msg: &str) { pub fn delay_span_bug<S: Into<MultiSpan>>(&self, sp: S, msg: &str) {
if self.flags.treat_err_as_bug { if self.flags.treat_err_as_bug {
// FIXME: don't abort here if report_delayed_bugs is off
self.span_bug(sp, msg); self.span_bug(sp, msg);
} }
let mut diagnostic = Diagnostic::new(Level::Bug, msg); let mut diagnostic = Diagnostic::new(Level::Bug, msg);
diagnostic.set_span(sp.into()); diagnostic.set_span(sp.into());
*self.delayed_span_bug.borrow_mut() = Some(diagnostic); self.delay_as_bug(diagnostic);
}
fn delay_as_bug(&self, diagnostic: Diagnostic) {
if self.flags.report_delayed_bugs {
DiagnosticBuilder::new_diagnostic(self, diagnostic.clone()).emit();
}
self.delayed_span_bug.borrow_mut().push(diagnostic);
} }
pub fn span_bug_no_panic<S: Into<MultiSpan>>(&self, sp: S, msg: &str) { pub fn span_bug_no_panic<S: Into<MultiSpan>>(&self, sp: S, msg: &str) {
self.emit(&sp.into(), msg, Bug); self.emit(&sp.into(), msg, Bug);
@ -615,9 +638,6 @@ pub fn print_error_count(&self) {
pub fn abort_if_errors(&self) { pub fn abort_if_errors(&self) {
if self.err_count() == 0 { if self.err_count() == 0 {
if let Some(bug) = self.delayed_span_bug.borrow_mut().take() {
DiagnosticBuilder::new_diagnostic(self, bug).emit();
}
return; return;
} }
FatalError.raise(); FatalError.raise();

View File

@ -161,6 +161,7 @@ pub fn new_handler(error_format: ErrorOutputType, codemap: Option<Lrc<codemap::C
errors::HandlerFlags { errors::HandlerFlags {
can_emit_warnings: true, can_emit_warnings: true,
treat_err_as_bug: false, treat_err_as_bug: false,
report_delayed_bugs: false,
external_macro_backtrace: false, external_macro_backtrace: false,
..Default::default() ..Default::default()
}, },