review comments: more targeted span setting approach

This commit is contained in:
Esteban Küber 2023-11-13 17:05:08 +00:00
parent 69634f2077
commit 5061c09c58
3 changed files with 28 additions and 2 deletions

View File

@ -21,7 +21,7 @@ use crate::{
TupleArgumentsFlag::DontTupleArguments,
};
use rustc_ast as ast;
use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_errors::{
pluralize, struct_span_err, AddToDiagnostic, Applicability, Diagnostic, DiagnosticBuilder,
@ -2877,7 +2877,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// two-phase not needed because index_ty is never mutable
self.demand_coerce(idx, idx_t, index_ty, None, AllowTwoPhase::No);
self.select_obligations_where_possible(|errors| {
self.point_at_index(errors, idx.span)
self.point_at_index(errors, idx.span);
});
element_ty
}
@ -3037,7 +3037,29 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}
fn point_at_index(&self, errors: &mut Vec<traits::FulfillmentError<'tcx>>, span: Span) {
let mut seen_preds = FxHashSet::default();
// We re-sort here so that the outer most root obligations comes first, as we have the
// subsequent weird logic to identify *every* relevant obligation for proper deduplication
// of diagnostics.
errors.sort_by_key(|error| error.root_obligation.recursion_depth);
for error in errors {
match (
error.root_obligation.predicate.kind().skip_binder(),
error.obligation.predicate.kind().skip_binder(),
) {
(ty::PredicateKind::Clause(ty::ClauseKind::Trait(predicate)), _)
if self.tcx.lang_items().index_trait() == Some(predicate.trait_ref.def_id) =>
{
seen_preds.insert(error.obligation.predicate.kind().skip_binder());
}
(_, ty::PredicateKind::Clause(ty::ClauseKind::Trait(predicate)))
if self.tcx.is_diagnostic_item(sym::SliceIndex, predicate.trait_ref.def_id) =>
{
seen_preds.insert(error.obligation.predicate.kind().skip_binder());
}
(root, pred) if seen_preds.contains(&pred) || seen_preds.contains(&root) => {}
_ => continue,
}
error.obligation.cause.span = span;
}
}

View File

@ -8,6 +8,8 @@ LL | [0][0u8];
= help: the trait `SliceIndex<[{integer}]>` is implemented for `usize`
= help: for that trait implementation, expected `usize`, found `u8`
= note: required for `[{integer}]` to implement `Index<u8>`
= note: 1 redundant requirement hidden
= note: required for `[{integer}; 1]` to implement `Index<u8>`
error[E0308]: mismatched types
--> $DIR/indexing-requires-a-uint.rs:12:18

View File

@ -8,6 +8,8 @@ LL | let one_item_please: i32 = [1, 2, 3][i];
= help: the trait `SliceIndex<[{integer}]>` is implemented for `usize`
= help: for that trait implementation, expected `usize`, found `&usize`
= note: required for `[{integer}]` to implement `Index<&usize>`
= note: 1 redundant requirement hidden
= note: required for `[{integer}; 3]` to implement `Index<&usize>`
help: dereference this index
|
LL | let one_item_please: i32 = [1, 2, 3][*i];