Rollup merge of #90884 - Nilstrieb:fix-span-trivial-trait-bound, r=estebank
Fix span for non-satisfied trivial trait bounds The spans for "trait bound not satisfied" errors in trivial trait bounds referenced the entire item (fn, impl, struct) before. Now they only reference the obligation itself (`String: Copy`) Address #90869
This commit is contained in:
commit
23ad7a7697
8 changed files with 102 additions and 104 deletions
|
@ -5,6 +5,7 @@ use crate::traits::{Obligation, ObligationCause, PredicateObligation};
|
|||
use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
|
||||
use rustc_middle::ty::{self, ToPredicate, TyCtxt, WithConstness};
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::Span;
|
||||
|
||||
pub fn anonymize_predicate<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
|
@ -97,6 +98,22 @@ pub fn elaborate_predicates<'tcx>(
|
|||
elaborate_obligations(tcx, obligations)
|
||||
}
|
||||
|
||||
pub fn elaborate_predicates_with_span<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
predicates: impl Iterator<Item = (ty::Predicate<'tcx>, Span)>,
|
||||
) -> Elaborator<'tcx> {
|
||||
let obligations = predicates
|
||||
.map(|(predicate, span)| {
|
||||
predicate_obligation(
|
||||
predicate,
|
||||
ty::ParamEnv::empty(),
|
||||
ObligationCause::dummy_with_span(span),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
elaborate_obligations(tcx, obligations)
|
||||
}
|
||||
|
||||
pub fn elaborate_obligations<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
mut obligations: Vec<PredicateObligation<'tcx>>,
|
||||
|
|
|
@ -65,7 +65,8 @@ pub use self::specialize::{specialization_graph, translate_substs, OverlapError}
|
|||
pub use self::structural_match::search_for_structural_match_violation;
|
||||
pub use self::structural_match::NonStructuralMatchTy;
|
||||
pub use self::util::{
|
||||
elaborate_obligations, elaborate_predicates, elaborate_trait_ref, elaborate_trait_refs,
|
||||
elaborate_obligations, elaborate_predicates, elaborate_predicates_with_span,
|
||||
elaborate_trait_ref, elaborate_trait_refs,
|
||||
};
|
||||
pub use self::util::{expand_trait_aliases, TraitAliasExpander};
|
||||
pub use self::util::{
|
||||
|
|
|
@ -1641,19 +1641,38 @@ fn report_bivariance(tcx: TyCtxt<'_>, param: &rustc_hir::GenericParam<'_>) {
|
|||
|
||||
/// Feature gates RFC 2056 -- trivial bounds, checking for global bounds that
|
||||
/// aren't true.
|
||||
fn check_false_global_bounds(fcx: &FnCtxt<'_, '_>, span: Span, id: hir::HirId) {
|
||||
fn check_false_global_bounds(fcx: &FnCtxt<'_, '_>, mut span: Span, id: hir::HirId) {
|
||||
let empty_env = ty::ParamEnv::empty();
|
||||
|
||||
let def_id = fcx.tcx.hir().local_def_id(id);
|
||||
let predicates = fcx.tcx.predicates_of(def_id).predicates.iter().map(|(p, _)| *p);
|
||||
let predicates_with_span =
|
||||
fcx.tcx.predicates_of(def_id).predicates.iter().map(|(p, span)| (*p, *span));
|
||||
// Check elaborated bounds.
|
||||
let implied_obligations = traits::elaborate_predicates(fcx.tcx, predicates);
|
||||
let implied_obligations = traits::elaborate_predicates_with_span(fcx.tcx, predicates_with_span);
|
||||
|
||||
for obligation in implied_obligations {
|
||||
let pred = obligation.predicate;
|
||||
// Match the existing behavior.
|
||||
if pred.is_global(fcx.tcx) && !pred.has_late_bound_regions() {
|
||||
let pred = fcx.normalize_associated_types_in(span, pred);
|
||||
let hir_node = fcx.tcx.hir().find(id);
|
||||
|
||||
// only use the span of the predicate clause (#90869)
|
||||
|
||||
if let Some(hir::Generics { where_clause, .. }) =
|
||||
hir_node.and_then(|node| node.generics())
|
||||
{
|
||||
let obligation_span = obligation.cause.span(fcx.tcx);
|
||||
|
||||
span = where_clause
|
||||
.predicates
|
||||
.iter()
|
||||
// There seems to be no better way to find out which predicate we are in
|
||||
.find(|pred| pred.span().contains(obligation_span))
|
||||
.map(|pred| pred.span())
|
||||
.unwrap_or(obligation_span);
|
||||
}
|
||||
|
||||
let obligation = traits::Obligation::new(
|
||||
traits::ObligationCause::new(span, id, traits::TrivialBound),
|
||||
empty_env,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue