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:
parent
0fc4501256
commit
56c90774a9
@ -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());
|
||||||
|
@ -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()
|
||||||
},
|
},
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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()
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user