Don't use TypeckTables
in NiceRegionError
Regions in TypeckTables will be erased, so are unusable for error reporting.
This commit is contained in:
parent
5a9ccc9ce7
commit
cefd0305b1
@ -3,6 +3,8 @@
|
||||
|
||||
use crate::infer::error_reporting::nice_region_error::util::AnonymousParamInfo;
|
||||
use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
||||
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
||||
use crate::infer::SubregionOrigin;
|
||||
use rustc::util::common::ErrorReported;
|
||||
|
||||
use rustc_errors::struct_span_err;
|
||||
@ -47,6 +49,15 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
|
||||
pub(super) fn try_report_anon_anon_conflict(&self) -> Option<ErrorReported> {
|
||||
let (span, sub, sup) = self.regions()?;
|
||||
|
||||
if let Some(RegionResolutionError::ConcreteFailure(
|
||||
SubregionOrigin::ReferenceOutlivesReferent(..),
|
||||
..,
|
||||
)) = self.error
|
||||
{
|
||||
// This error doesn't make much sense in this case.
|
||||
return None;
|
||||
}
|
||||
|
||||
// Determine whether the sub and sup consist of both anonymous (elided) regions.
|
||||
let anon_reg_sup = self.tcx().is_suitable_region(sup)?;
|
||||
|
||||
|
@ -17,12 +17,7 @@ mod util;
|
||||
|
||||
impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
|
||||
pub fn try_report_nice_region_error(&self, error: &RegionResolutionError<'tcx>) -> bool {
|
||||
if let Some(tables) = self.in_progress_tables {
|
||||
let tables = tables.borrow();
|
||||
NiceRegionError::new(self, error.clone(), Some(&tables)).try_report().is_some()
|
||||
} else {
|
||||
NiceRegionError::new(self, error.clone(), None).try_report().is_some()
|
||||
}
|
||||
NiceRegionError::new(self, error.clone()).try_report().is_some()
|
||||
}
|
||||
}
|
||||
|
||||
@ -30,16 +25,11 @@ pub struct NiceRegionError<'cx, 'tcx> {
|
||||
infcx: &'cx InferCtxt<'cx, 'tcx>,
|
||||
error: Option<RegionResolutionError<'tcx>>,
|
||||
regions: Option<(Span, ty::Region<'tcx>, ty::Region<'tcx>)>,
|
||||
tables: Option<&'cx ty::TypeckTables<'tcx>>,
|
||||
}
|
||||
|
||||
impl<'cx, 'tcx> NiceRegionError<'cx, 'tcx> {
|
||||
pub fn new(
|
||||
infcx: &'cx InferCtxt<'cx, 'tcx>,
|
||||
error: RegionResolutionError<'tcx>,
|
||||
tables: Option<&'cx ty::TypeckTables<'tcx>>,
|
||||
) -> Self {
|
||||
Self { infcx, error: Some(error), regions: None, tables }
|
||||
pub fn new(infcx: &'cx InferCtxt<'cx, 'tcx>, error: RegionResolutionError<'tcx>) -> Self {
|
||||
Self { infcx, error: Some(error), regions: None }
|
||||
}
|
||||
|
||||
pub fn new_from_span(
|
||||
@ -47,9 +37,8 @@ impl<'cx, 'tcx> NiceRegionError<'cx, 'tcx> {
|
||||
span: Span,
|
||||
sub: ty::Region<'tcx>,
|
||||
sup: ty::Region<'tcx>,
|
||||
tables: Option<&'cx ty::TypeckTables<'tcx>>,
|
||||
) -> Self {
|
||||
Self { infcx, error: None, regions: Some((span, sub, sup)), tables }
|
||||
Self { infcx, error: None, regions: Some((span, sub, sup)) }
|
||||
}
|
||||
|
||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||
|
@ -51,52 +51,44 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
|
||||
};
|
||||
|
||||
let hir = &self.tcx().hir();
|
||||
if let Some(hir_id) = hir.as_local_hir_id(id) {
|
||||
if let Some(body_id) = hir.maybe_body_owned_by(hir_id) {
|
||||
let body = hir.body(body_id);
|
||||
let owner_id = hir.body_owner(body_id);
|
||||
let fn_decl = hir.fn_decl_by_hir_id(owner_id).unwrap();
|
||||
if let Some(tables) = self.tables {
|
||||
body.params
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter_map(|(index, param)| {
|
||||
// May return None; sometimes the tables are not yet populated.
|
||||
let ty_hir_id = fn_decl.inputs[index].hir_id;
|
||||
let param_ty_span = hir.span(ty_hir_id);
|
||||
let ty = tables.node_type_opt(param.hir_id)?;
|
||||
let mut found_anon_region = false;
|
||||
let new_param_ty = self.tcx().fold_regions(&ty, &mut false, |r, _| {
|
||||
if *r == *anon_region {
|
||||
found_anon_region = true;
|
||||
replace_region
|
||||
} else {
|
||||
r
|
||||
}
|
||||
});
|
||||
if found_anon_region {
|
||||
let is_first = index == 0;
|
||||
Some(AnonymousParamInfo {
|
||||
param,
|
||||
param_ty: new_param_ty,
|
||||
param_ty_span,
|
||||
bound_region,
|
||||
is_first,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.next()
|
||||
let hir_id = hir.as_local_hir_id(id)?;
|
||||
let body_id = hir.maybe_body_owned_by(hir_id)?;
|
||||
let body = hir.body(body_id);
|
||||
let owner_id = hir.body_owner(body_id);
|
||||
let fn_decl = hir.fn_decl_by_hir_id(owner_id).unwrap();
|
||||
let poly_fn_sig = self.tcx().fn_sig(id);
|
||||
let fn_sig = self.tcx().liberate_late_bound_regions(id, &poly_fn_sig);
|
||||
body.params
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter_map(|(index, param)| {
|
||||
// May return None; sometimes the tables are not yet populated.
|
||||
let ty = fn_sig.inputs()[index];
|
||||
let mut found_anon_region = false;
|
||||
let new_param_ty = self.tcx().fold_regions(&ty, &mut false, |r, _| {
|
||||
if *r == *anon_region {
|
||||
found_anon_region = true;
|
||||
replace_region
|
||||
} else {
|
||||
r
|
||||
}
|
||||
});
|
||||
if found_anon_region {
|
||||
let ty_hir_id = fn_decl.inputs[index].hir_id;
|
||||
let param_ty_span = hir.span(ty_hir_id);
|
||||
let is_first = index == 0;
|
||||
Some(AnonymousParamInfo {
|
||||
param,
|
||||
param_ty: new_param_ty,
|
||||
param_ty_span,
|
||||
bound_region,
|
||||
is_first,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.next()
|
||||
}
|
||||
|
||||
// Here, we check for the case where the anonymous region
|
||||
|
@ -284,8 +284,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||
debug!("report_region_error: category={:?} {:?}", category, span);
|
||||
// Check if we can use one of the "nice region errors".
|
||||
if let (Some(f), Some(o)) = (self.to_error_region(fr), self.to_error_region(outlived_fr)) {
|
||||
let tables = self.infcx.tcx.typeck_tables_of(self.mir_def_id);
|
||||
let nice = NiceRegionError::new_from_span(self.infcx, span, o, f, Some(tables));
|
||||
let nice = NiceRegionError::new_from_span(self.infcx, span, o, f);
|
||||
if let Some(diag) = nice.try_report_from_nll() {
|
||||
diag.buffer(&mut self.errors_buffer);
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user