stash_diagnostic: ICE in a different way
This commit is contained in:
parent
62d85849d0
commit
62fc4d36df
1 changed files with 18 additions and 9 deletions
|
@ -466,10 +466,15 @@ impl Handler {
|
||||||
/// Stash a given diagnostic with the given `Span` and `StashKey` as the key for later stealing.
|
/// Stash a given diagnostic with the given `Span` and `StashKey` as the key for later stealing.
|
||||||
/// If the diagnostic with this `(span, key)` already exists, this will result in an ICE.
|
/// If the diagnostic with this `(span, key)` already exists, this will result in an ICE.
|
||||||
pub fn stash_diagnostic(&self, span: Span, key: StashKey, diag: Diagnostic) {
|
pub fn stash_diagnostic(&self, span: Span, key: StashKey, diag: Diagnostic) {
|
||||||
if let Some(old) = self.inner.borrow_mut().stashed_diagnostics.insert((span, key), diag) {
|
let mut inner = self.inner.borrow_mut();
|
||||||
|
if let Some(mut old_diag) = inner.stashed_diagnostics.insert((span, key), diag) {
|
||||||
// We are removing a previously stashed diagnostic which should not happen.
|
// We are removing a previously stashed diagnostic which should not happen.
|
||||||
// Create a builder and drop it on the floor to get an ICE.
|
old_diag.level = Bug;
|
||||||
drop(DiagnosticBuilder::new_diagnostic(self, old));
|
old_diag.note(&format!(
|
||||||
|
"{}:{}: already existing stashed diagnostic with (span = {:?}, key = {:?})",
|
||||||
|
file!(), line!(), span, key
|
||||||
|
));
|
||||||
|
inner.emit_explicit_bug(&old_diag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -676,6 +681,11 @@ impl Handler {
|
||||||
self.inner.borrow_mut().abort_if_errors_and_should_abort()
|
self.inner.borrow_mut().abort_if_errors_and_should_abort()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `true` if we haven't taught a diagnostic with this code already.
|
||||||
|
/// The caller must then teach the user about such a diagnostic.
|
||||||
|
///
|
||||||
|
/// Used to suppress emitting the same error multiple times with extended explanation when
|
||||||
|
/// calling `-Zteach`.
|
||||||
pub fn must_teach(&self, code: &DiagnosticId) -> bool {
|
pub fn must_teach(&self, code: &DiagnosticId) -> bool {
|
||||||
self.inner.borrow_mut().must_teach(code)
|
self.inner.borrow_mut().must_teach(code)
|
||||||
}
|
}
|
||||||
|
@ -698,11 +708,6 @@ impl Handler {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HandlerInner {
|
impl HandlerInner {
|
||||||
/// `true` if we haven't taught a diagnostic with this code already.
|
|
||||||
/// The caller must then teach the user about such a diagnostic.
|
|
||||||
///
|
|
||||||
/// Used to suppress emitting the same error multiple times with extended explanation when
|
|
||||||
/// calling `-Zteach`.
|
|
||||||
fn must_teach(&mut self, code: &DiagnosticId) -> bool {
|
fn must_teach(&mut self, code: &DiagnosticId) -> bool {
|
||||||
self.taught_diagnostics.insert(code.clone())
|
self.taught_diagnostics.insert(code.clone())
|
||||||
}
|
}
|
||||||
|
@ -833,7 +838,11 @@ impl HandlerInner {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn span_bug<S: Into<MultiSpan>>(&mut self, sp: S, msg: &str) -> ! {
|
fn span_bug<S: Into<MultiSpan>>(&mut self, sp: S, msg: &str) -> ! {
|
||||||
self.emit_diagnostic(Diagnostic::new(Bug, msg).set_span(sp));
|
self.emit_explicit_bug(Diagnostic::new(Bug, msg).set_span(sp));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_explicit_bug(&mut self, diag: &Diagnostic) -> ! {
|
||||||
|
self.emit_diagnostic(diag);
|
||||||
self.abort_if_errors_and_should_abort();
|
self.abort_if_errors_and_should_abort();
|
||||||
panic!(ExplicitBug);
|
panic!(ExplicitBug);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue