Improve cause information for NLL higher-ranked errors
This PR has several interconnected pieces: 1. In some of the NLL region error code, we now pass around an `ObligationCause`, instead of just a plain `Span`. This gets forwarded into `fulfill_cx.register_predicate_obligation` during error reporting. 2. The general InferCtxt error reporting code is extended to handle `ObligationCauseCode::BindingObligation` 3. A new enum variant `ConstraintCategory::Predicate` is added. We try to avoid using this as the 'best blame constraint' - instead, we use it to enhance the `ObligationCause` of the `BlameConstraint` that we do end up choosing. As a result, several NLL error messages now contain the same "the lifetime requirement is introduced here" message as non-NLL errors. Having an `ObligationCause` available will likely prove useful for future improvements to NLL error messages.
This commit is contained in:
parent
3e8f32e1c5
commit
93ab12eeab
16 changed files with 194 additions and 82 deletions
|
@ -13,6 +13,7 @@ use rustc_span::{BytePos, Span};
|
|||
|
||||
use crate::borrowck_errors;
|
||||
|
||||
use super::{OutlivesSuggestionBuilder, RegionName};
|
||||
use crate::region_infer::BlameConstraint;
|
||||
use crate::{
|
||||
nll::ConstraintDescription,
|
||||
|
@ -21,8 +22,6 @@ use crate::{
|
|||
MirBorrowckCtxt,
|
||||
};
|
||||
|
||||
use super::{OutlivesSuggestionBuilder, RegionName};
|
||||
|
||||
impl ConstraintDescription for ConstraintCategory {
|
||||
fn description(&self) -> &'static str {
|
||||
// Must end with a space. Allows for empty names to be provided.
|
||||
|
@ -41,7 +40,8 @@ impl ConstraintDescription for ConstraintCategory {
|
|||
ConstraintCategory::OpaqueType => "opaque type ",
|
||||
ConstraintCategory::ClosureUpvar(_) => "closure capture ",
|
||||
ConstraintCategory::Usage => "this usage ",
|
||||
ConstraintCategory::Boring
|
||||
ConstraintCategory::Predicate(_, _)
|
||||
| ConstraintCategory::Boring
|
||||
| ConstraintCategory::BoringNoLocation
|
||||
| ConstraintCategory::Internal => "",
|
||||
}
|
||||
|
@ -217,7 +217,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
let error_vid = self.regioncx.region_from_element(longer_fr, &error_element);
|
||||
|
||||
// Find the code to blame for the fact that `longer_fr` outlives `error_fr`.
|
||||
let (_, span) = self.regioncx.find_outlives_blame_span(
|
||||
let (_, cause) = self.regioncx.find_outlives_blame_span(
|
||||
&self.body,
|
||||
longer_fr,
|
||||
NllRegionVariableOrigin::Placeholder(placeholder),
|
||||
|
@ -227,7 +227,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
let universe = placeholder.universe;
|
||||
let universe_info = self.regioncx.universe_info(universe);
|
||||
|
||||
universe_info.report_error(self, placeholder, error_element, span);
|
||||
universe_info.report_error(self, placeholder, error_element, cause);
|
||||
}
|
||||
|
||||
RegionErrorKind::RegionError { fr_origin, longer_fr, shorter_fr, is_reported } => {
|
||||
|
@ -275,15 +275,15 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
) {
|
||||
debug!("report_region_error(fr={:?}, outlived_fr={:?})", fr, outlived_fr);
|
||||
|
||||
let BlameConstraint { category, span, variance_info, from_closure: _ } =
|
||||
let BlameConstraint { category, cause, variance_info, from_closure: _ } =
|
||||
self.regioncx.best_blame_constraint(&self.body, fr, fr_origin, |r| {
|
||||
self.regioncx.provides_universal_region(r, fr, outlived_fr)
|
||||
});
|
||||
|
||||
debug!("report_region_error: category={:?} {:?} {:?}", category, span, variance_info);
|
||||
debug!("report_region_error: category={:?} {:?} {:?}", category, cause, variance_info);
|
||||
// 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 nice = NiceRegionError::new_from_span(self.infcx, span, o, f);
|
||||
let nice = NiceRegionError::new_from_span(self.infcx, cause.span, o, f);
|
||||
if let Some(diag) = nice.try_report_from_nll() {
|
||||
diag.buffer(&mut self.errors_buffer);
|
||||
return;
|
||||
|
@ -306,7 +306,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
fr_is_local,
|
||||
outlived_fr_is_local,
|
||||
category,
|
||||
span,
|
||||
span: cause.span,
|
||||
};
|
||||
|
||||
let mut diag = match (category, fr_is_local, outlived_fr_is_local) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue