Skip to content

Commit

Permalink
Rollup merge of rust-lang#106468 - compiler-errors:err-instability, r…
Browse files Browse the repository at this point in the history
…=lcnr

Use FxIndexSet when updating obligation causes in `adjust_fulfillment_errors_for_expr_obligation`

I have no idea how to test this reliably, but I've **manually** verified it fixes the instability in rust-lang#106417 that isn't due to dtolnay/trybuild#212.

Fixes rust-lang#106417
  • Loading branch information
Yuki Okushi authored Jan 9, 2023
2 parents 26e6a48 + 21b078a commit d3cae2b
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use crate::{
TupleArgumentsFlag,
};
use rustc_ast as ast;
use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::fx::FxIndexSet;
use rustc_errors::{pluralize, Applicability, Diagnostic, DiagnosticId, MultiSpan};
use rustc_hir as hir;
use rustc_hir::def::{CtorOf, DefKind, Res};
Expand Down Expand Up @@ -1698,7 +1698,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// even if their `ObligationCauseCode` isn't an `Expr*Obligation` kind.
// This is important since if we adjust one span but not the other, then
// we will have "duplicated" the error on the UI side.
let mut remap_cause = FxHashSet::default();
let mut remap_cause = FxIndexSet::default();
let mut not_adjusted = vec![];

for error in errors {
Expand Down Expand Up @@ -1726,6 +1726,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}
}

// Adjust any other errors that come from other cause codes, when these
// errors are of the same predicate as one we successfully adjusted, and
// when their spans overlap (suggesting they're due to the same root cause).
//
// This is because due to normalization, we often register duplicate
// obligations with misc obligations that are basically impossible to
// line back up with a useful ExprBindingObligation.
for error in not_adjusted {
for (span, predicate, cause) in &remap_cause {
if *predicate == error.obligation.predicate
Expand Down

0 comments on commit d3cae2b

Please sign in to comment.