use crate::{ errors::PlaceholderRelationLfNotSatisfied, infer::{ error_reporting::nice_region_error::NiceRegionError, RegionResolutionError, SubregionOrigin, }, }; use rustc_data_structures::intern::Interned; use rustc_errors::{DiagnosticBuilder, ErrorGuaranteed}; use rustc_middle::ty::{self, RePlaceholder, Region}; impl<'tcx> NiceRegionError<'_, 'tcx> { /// Emitted wwhen given a `ConcreteFailure` when relating two placeholders. pub(super) fn try_report_placeholder_relation( &self, ) -> Option> { match &self.error { Some(RegionResolutionError::ConcreteFailure( SubregionOrigin::RelateRegionParamBound(span), Region(Interned(RePlaceholder(ty::Placeholder { name: sub_name, .. }), _)), Region(Interned(RePlaceholder(ty::Placeholder { name: sup_name, .. }), _)), )) => { let span = *span; let (sub_span, sub_symbol) = match sub_name { ty::BrNamed(def_id, symbol) => { (Some(self.tcx().def_span(def_id)), Some(symbol)) } ty::BrAnon(_, span) => (*span, None), ty::BrEnv => (None, None), }; let (sup_span, sup_symbol) = match sup_name { ty::BrNamed(def_id, symbol) => { (Some(self.tcx().def_span(def_id)), Some(symbol)) } ty::BrAnon(_, span) => (*span, None), ty::BrEnv => (None, None), }; let diag = match (sub_span, sup_span, sub_symbol, sup_symbol) { (Some(sub_span), Some(sup_span), Some(&sub_symbol), Some(&sup_symbol)) => { PlaceholderRelationLfNotSatisfied::HasBoth { span, sub_span, sup_span, sub_symbol, sup_symbol, note: (), } } (Some(sub_span), Some(sup_span), _, Some(&sup_symbol)) => { PlaceholderRelationLfNotSatisfied::HasSup { span, sub_span, sup_span, sup_symbol, note: (), } } (Some(sub_span), Some(sup_span), Some(&sub_symbol), _) => { PlaceholderRelationLfNotSatisfied::HasSub { span, sub_span, sup_span, sub_symbol, note: (), } } (Some(sub_span), Some(sup_span), _, _) => { PlaceholderRelationLfNotSatisfied::HasNone { span, sub_span, sup_span, note: (), } } _ => PlaceholderRelationLfNotSatisfied::OnlyPrimarySpan { span, note: () }, }; Some(self.tcx().sess.create_err(diag)) } _ => None, } } }