Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Overhaul -Ztreat-err-as-bug #119871

Merged
merged 1 commit into from
Jan 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 23 additions & 41 deletions compiler/rustc_errors/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -865,10 +865,6 @@ impl DiagCtxt {
/// directly).
#[track_caller]
pub fn delayed_bug(&self, msg: impl Into<DiagnosticMessage>) -> ErrorGuaranteed {
let treat_next_err_as_bug = self.inner.borrow().treat_next_err_as_bug();
if treat_next_err_as_bug {
self.bug(msg);
}
DiagnosticBuilder::<ErrorGuaranteed>::new(self, DelayedBug(DelayedBugKind::Normal), msg)
.emit()
}
Expand All @@ -883,10 +879,6 @@ impl DiagCtxt {
sp: impl Into<MultiSpan>,
msg: impl Into<DiagnosticMessage>,
) -> ErrorGuaranteed {
let treat_next_err_as_bug = self.inner.borrow().treat_next_err_as_bug();
if treat_next_err_as_bug {
self.span_bug(sp, msg);
}
DiagnosticBuilder::<ErrorGuaranteed>::new(self, DelayedBug(DelayedBugKind::Normal), msg)
.with_span(sp)
.emit()
Expand Down Expand Up @@ -1259,10 +1251,6 @@ impl DiagCtxtInner {
}

fn emit_diagnostic(&mut self, mut diagnostic: Diagnostic) -> Option<ErrorGuaranteed> {
if matches!(diagnostic.level, Error | Fatal) && self.treat_next_err_as_bug() {
diagnostic.level = Bug;
}

// The `LintExpectationId` can be stable or unstable depending on when it was created.
// Diagnostics created before the definition of `HirId`s are unstable and can not yet
// be stored. Instead, they are buffered until the `LintExpectationId` is replaced by
Expand Down Expand Up @@ -1298,6 +1286,12 @@ impl DiagCtxtInner {
_ => {}
}

// This must come after the possible promotion of `DelayedBug` to
// `Error` above.
if matches!(diagnostic.level, Error | Fatal) && self.treat_next_err_as_bug() {
diagnostic.level = Bug;
}

if diagnostic.has_future_breakage() {
// Future breakages aren't emitted if they're Level::Allow,
// but they still need to be constructed and stashed below,
Expand Down Expand Up @@ -1387,20 +1381,14 @@ impl DiagCtxtInner {
}

fn treat_err_as_bug(&self) -> bool {
self.flags.treat_err_as_bug.is_some_and(|c| {
self.err_count + self.lint_err_count + self.delayed_bug_count() >= c.get()
})
self.flags.treat_err_as_bug.is_some_and(|c| self.err_count + self.lint_err_count >= c.get())
}

// Use this one before incrementing `err_count`.
fn treat_next_err_as_bug(&self) -> bool {
self.flags.treat_err_as_bug.is_some_and(|c| {
self.err_count + self.lint_err_count + self.delayed_bug_count() + 1 >= c.get()
})
}

fn delayed_bug_count(&self) -> usize {
self.span_delayed_bugs.len() + self.good_path_delayed_bugs.len()
self.flags
.treat_err_as_bug
.is_some_and(|c| self.err_count + self.lint_err_count + 1 >= c.get())
}

fn has_errors(&self) -> bool {
Expand All @@ -1412,7 +1400,7 @@ impl DiagCtxtInner {
}

fn flush_delayed(&mut self, kind: DelayedBugKind) {
let (bugs, explanation) = match kind {
let (bugs, note1) = match kind {
DelayedBugKind::Normal => (
std::mem::take(&mut self.span_delayed_bugs),
"no errors encountered even though `span_delayed_bug` issued",
Expand All @@ -1422,6 +1410,7 @@ impl DiagCtxtInner {
"no warnings or errors encountered even though `good_path_delayed_bugs` issued",
),
};
let note2 = "those delayed bugs will now be shown as internal compiler errors";

if bugs.is_empty() {
return;
Expand All @@ -1447,8 +1436,11 @@ impl DiagCtxtInner {

if i == 0 {
// Put the overall explanation before the `DelayedBug`s, to
// frame them better (e.g. separate warnings from them).
self.emit_diagnostic(Diagnostic::new(Bug, explanation));
// frame them better (e.g. separate warnings from them). Also,
// make it a note so it doesn't count as an error, because that
// could trigger `-Ztreat-err-as-bug`, which we don't want.
self.emit_diagnostic(Diagnostic::new(Note, note1));
self.emit_diagnostic(Diagnostic::new(Note, note2));
}

let mut bug =
Expand All @@ -1474,22 +1466,12 @@ impl DiagCtxtInner {

fn panic_if_treat_err_as_bug(&self) {
if self.treat_err_as_bug() {
match (
self.err_count + self.lint_err_count,
self.delayed_bug_count(),
self.flags.treat_err_as_bug.map(|c| c.get()).unwrap(),
) {
(1, 0, 1) => panic!("aborting due to `-Z treat-err-as-bug=1`"),
(0, 1, 1) => panic!("aborting due delayed bug with `-Z treat-err-as-bug=1`"),
(count, delayed_count, val) => {
if delayed_count > 0 {
panic!(
"aborting after {count} errors and {delayed_count} delayed bugs due to `-Z treat-err-as-bug={val}`",
)
} else {
panic!("aborting after {count} errors due to `-Z treat-err-as-bug={val}`")
}
}
let n = self.flags.treat_err_as_bug.map(|c| c.get()).unwrap();
assert_eq!(n, self.err_count + self.lint_err_count);
if n == 1 {
panic!("aborting due to `-Z treat-err-as-bug=1`");
} else {
panic!("aborting after {n} errors due to `-Z treat-err-as-bug={n}`");
}
}
}
Expand Down
16 changes: 6 additions & 10 deletions tests/ui/impl-trait/equality-in-canonical-query.clone.stderr
Original file line number Diff line number Diff line change
@@ -1,29 +1,25 @@
error: internal compiler error: no errors encountered even though `span_delayed_bug` issued
note: no errors encountered even though `span_delayed_bug` issued

note: those delayed bugs will now be shown as internal compiler errors

error: internal compiler error: {OpaqueTypeKey { def_id: DefId(rpit::{opaque#0}), args: [] }: OpaqueTypeDecl { hidden_type: OpaqueHiddenType { span: no-location (#0), ty: Alias(Opaque, AliasTy { args: [], def_id: DefId(foo::{opaque#0}) }) } }}
|
=


error: internal compiler error: error performing ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing }, value: ProvePredicate { predicate: Binder { value: ProjectionPredicate(AliasTy { args: [FnDef(DefId(rpit), []), ()], def_id: DefId(ops::function::FnOnce::Output) }, Term::Ty(Alias(Opaque, AliasTy { args: [], def_id: DefId(foo::{opaque#0}) }))), bound_vars: [] } } }
--> $DIR/equality-in-canonical-query.rs:19:5
--> $DIR/equality-in-canonical-query.rs:21:5
|
LL | same_output(foo, rpit);
| ^^^^^^^^^^^^^^^^^^^^^^
|

--> $DIR/equality-in-canonical-query.rs:19:5
--> $DIR/equality-in-canonical-query.rs:21:5
|
LL | same_output(foo, rpit);
| ^^^^^^^^^^^^^^^^^^^^^^







query stack during panic:
end of query stack
error: aborting due to 3 previous errors
error: aborting due to 2 previous errors

6 changes: 4 additions & 2 deletions tests/ui/impl-trait/equality-in-canonical-query.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
// issue: #116877
// revisions: sized clone
//[sized] check-pass

//[clone] known-bug: #108498
//[clone] failure-status: 101
//[clone] normalize-stderr-test: "DefId\(.*?\]::" -> "DefId("
//[clone] normalize-stderr-test: "(?m)note: .*$" -> ""
//[clone] normalize-stderr-test: "(?m)note: we would appreciate a bug report.*\n\n" -> ""
//[clone] normalize-stderr-test: "(?m)note: rustc.*running on.*\n\n" -> ""
//[clone] normalize-stderr-test: "(?m)note: compiler flags.*\n\n" -> ""
//[clone] normalize-stderr-test: "(?m)note: delayed at.*$" -> ""
//[clone] normalize-stderr-test: "(?m)^ *\d+: .*\n" -> ""
//[clone] normalize-stderr-test: "(?m)^ *at .*\n" -> ""

Expand Down
8 changes: 6 additions & 2 deletions tests/ui/mir/lint/storage-live.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@ error: internal compiler error: broken MIR in Item(DefId(0:8 ~ storage_live[HASH
StorageLive(_1) which already has storage here
--> $DIR/storage-live.rs:22:13
|
LL | StorageLive(a);
| ^^^^^^^^^^^^^^
|
note: delayed at compiler/rustc_mir_transform/src/lint.rs:97:26 - disabled backtrace
--> $DIR/storage-live.rs:22:13
|
LL | StorageLive(a);
| ^^^^^^^^^^^^^^

aborting due to `-Z treat-err-as-bug=1`
error: the compiler unexpectedly panicked. this is a bug.

query stack during panic:
#0 [mir_const] preparing `multiple_storage` for borrow checking
#1 [mir_promoted] promoting constants in MIR for `multiple_storage`
end of query stack
2 changes: 1 addition & 1 deletion tests/ui/mir/lint/storage-return.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// compile-flags: -Zlint-mir -Ztreat-err-as-bug
// compile-flags: -Zlint-mir -Ztreat-err-as-bug -Zeagerly-emit-delayed-bugs
// failure-status: 101
// dont-check-compiler-stderr
// error-pattern: has storage when returning
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/treat-err-as-bug/span_delayed_bug.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// compile-flags: -Ztreat-err-as-bug
// compile-flags: -Ztreat-err-as-bug -Zeagerly-emit-delayed-bugs
// failure-status: 101
// error-pattern: aborting due to `-Z treat-err-as-bug=1`
// error-pattern: [trigger_span_delayed_bug] triggering a span delayed bug for testing incremental
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,25 @@
error: internal compiler error: no errors encountered even though `span_delayed_bug` issued
note: no errors encountered even though `span_delayed_bug` issued

note: those delayed bugs will now be shown as internal compiler errors

error: internal compiler error: {OpaqueTypeKey { def_id: DefId(get_rpit::{opaque#0}), args: [] }: OpaqueTypeDecl { hidden_type: OpaqueHiddenType { span: no-location (#0), ty: Alias(Opaque, AliasTy { args: [], def_id: DefId(Opaque::{opaque#0}) }) } }}
|
=


error: internal compiler error: error performing ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing }, value: ProvePredicate { predicate: Binder { value: ProjectionPredicate(AliasTy { args: [FnDef(DefId(get_rpit), []), ()], def_id: DefId(ops::function::FnOnce::Output) }, Term::Ty(Alias(Opaque, AliasTy { args: [], def_id: DefId(Opaque::{opaque#0}) }))), bound_vars: [] } } }
--> $DIR/rpit_tait_equality_in_canonical_query.rs:28:5
--> $DIR/rpit_tait_equality_in_canonical_query.rs:31:5
|
LL | query(get_rpit);
| ^^^^^^^^^^^^^^^
|

--> $DIR/rpit_tait_equality_in_canonical_query.rs:28:5
--> $DIR/rpit_tait_equality_in_canonical_query.rs:31:5
|
LL | query(get_rpit);
| ^^^^^^^^^^^^^^^







query stack during panic:
end of query stack
error: aborting due to 3 previous errors
error: aborting due to 2 previous errors

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@
//[current] known-bug: #108498
//[current] failure-status: 101
//[current] normalize-stderr-test: "DefId\(.*?\]::" -> "DefId("
//[current] normalize-stderr-test: "(?m)note: .*$" -> ""
//[current] normalize-stderr-test: "(?m)note: we would appreciate a bug report.*\n\n" -> ""
//[current] normalize-stderr-test: "(?m)note: rustc.*running on.*\n\n" -> ""
//[current] normalize-stderr-test: "(?m)note: compiler flags.*\n\n" -> ""
//[current] normalize-stderr-test: "(?m)note: delayed at.*$" -> ""
//[current] normalize-stderr-test: "(?m)^ *\d+: .*\n" -> ""
//[current] normalize-stderr-test: "(?m)^ *at .*\n" -> ""

Expand Down
Loading