@@ -928,32 +928,6 @@ impl<'tcx> RegionInferenceContext<'tcx> {
928928 }
929929 }
930930
931- /// Converts a region inference variable into a `ty::Region` that
932- /// we can use for error reporting. If `r` is universally bound,
933- /// then we use the name that we have on record for it. If `r` is
934- /// existentially bound, then we check its inferred value and try
935- /// to find a good name from that. Returns `None` if we can't find
936- /// one (e.g., this is just some random part of the CFG).
937- pub fn to_error_region ( & self , r : RegionVid ) -> Option < ty:: Region < ' tcx > > {
938- self . to_error_region_vid ( r) . and_then ( |r| self . definitions [ r] . external_name )
939- }
940-
941- /// Returns the [RegionVid] corresponding to the region returned by
942- /// `to_error_region`.
943- pub fn to_error_region_vid ( & self , r : RegionVid ) -> Option < RegionVid > {
944- if self . universal_regions . is_universal_region ( r) {
945- Some ( r)
946- } else {
947- let r_scc = self . constraint_sccs . scc ( r) ;
948- let upper_bound = self . universal_upper_bound ( r) ;
949- if self . scc_values . contains ( r_scc, upper_bound) {
950- self . to_error_region_vid ( upper_bound)
951- } else {
952- None
953- }
954- }
955- }
956-
957931 /// Invoked when we have some type-test (e.g., `T: 'X`) that we cannot
958932 /// prove to be satisfied. If this is a closure, we will attempt to
959933 /// "promote" this type-test into our `ClosureRegionRequirements` and
@@ -1164,7 +1138,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
11641138 /// include the CFG anyhow.
11651139 /// - For each `end('x)` element in `'r`, compute the mutual LUB, yielding
11661140 /// a result `'y`.
1167- fn universal_upper_bound ( & self , r : RegionVid ) -> RegionVid {
1141+ pub ( in crate :: borrow_check ) fn universal_upper_bound ( & self , r : RegionVid ) -> RegionVid {
11681142 debug ! ( "universal_upper_bound(r={:?}={})" , r, self . region_value_str( r) ) ;
11691143
11701144 // Find the smallest universal region that contains all other
@@ -1458,19 +1432,34 @@ impl<'tcx> RegionInferenceContext<'tcx> {
14581432 debug ! ( "check_polonius_subset_errors: subset_error longer_fr={:?},\
14591433 shorter_fr={:?}", longer_fr, shorter_fr) ;
14601434
1461- self . report_or_propagate_universal_region_error (
1435+ let propagated = self . try_propagate_universal_region_error (
14621436 * longer_fr,
14631437 * shorter_fr,
1464- infcx,
14651438 body,
1466- local_names,
1467- upvars,
1468- mir_def_id,
14691439 & mut propagated_outlives_requirements,
1470- & mut outlives_suggestion,
1471- errors_buffer,
1472- region_naming,
14731440 ) ;
1441+ if !propagated {
1442+ // If we are not in a context where we can't propagate errors, or we
1443+ // could not shrink `fr` to something smaller, then just report an
1444+ // error.
1445+ //
1446+ // Note: in this case, we use the unapproximated regions to report the
1447+ // error. This gives better error messages in some cases.
1448+ let db = self . report_error (
1449+ body,
1450+ local_names,
1451+ upvars,
1452+ infcx,
1453+ mir_def_id,
1454+ * longer_fr,
1455+ NLLRegionVariableOrigin :: FreeRegion ,
1456+ * shorter_fr,
1457+ & mut outlives_suggestion,
1458+ region_naming,
1459+ ) ;
1460+
1461+ db. buffer ( errors_buffer) ;
1462+ }
14741463 }
14751464
14761465 // Handle the placeholder errors as usual, until the chalk-rustc-polonius triumvirate has
@@ -1594,48 +1583,59 @@ impl<'tcx> RegionInferenceContext<'tcx> {
15941583 return None ;
15951584 }
15961585
1597- self . report_or_propagate_universal_region_error (
1586+ let propagated = self . try_propagate_universal_region_error (
15981587 longer_fr,
15991588 shorter_fr,
1600- infcx,
16011589 body,
1602- local_names,
1603- upvars,
1604- mir_def_id,
16051590 propagated_outlives_requirements,
1606- outlives_suggestion,
1607- errors_buffer,
1608- region_naming,
1609- )
1591+ ) ;
1592+
1593+ if propagated {
1594+ None
1595+ } else {
1596+ // If we are not in a context where we can't propagate errors, or we
1597+ // could not shrink `fr` to something smaller, then just report an
1598+ // error.
1599+ //
1600+ // Note: in this case, we use the unapproximated regions to report the
1601+ // error. This gives better error messages in some cases.
1602+ let db = self . report_error (
1603+ body,
1604+ local_names,
1605+ upvars,
1606+ infcx,
1607+ mir_def_id,
1608+ longer_fr,
1609+ NLLRegionVariableOrigin :: FreeRegion ,
1610+ shorter_fr,
1611+ outlives_suggestion,
1612+ region_naming,
1613+ ) ;
1614+
1615+ db. buffer ( errors_buffer) ;
1616+
1617+ Some ( ErrorReported )
1618+ }
16101619 }
16111620
1612- fn report_or_propagate_universal_region_error (
1621+ /// Attempt to propagate a region error (e.g. `'a: 'b`) that is not met to a closure's
1622+ /// creator. If we cannot, then the caller should report an error to the user.
1623+ ///
1624+ /// Returns `true` if the error was propagated, and `false` otherwise.
1625+ fn try_propagate_universal_region_error (
16131626 & self ,
16141627 longer_fr : RegionVid ,
16151628 shorter_fr : RegionVid ,
1616- infcx : & InferCtxt < ' _ , ' tcx > ,
16171629 body : & Body < ' tcx > ,
1618- local_names : & IndexVec < Local , Option < Symbol > > ,
1619- upvars : & [ Upvar ] ,
1620- mir_def_id : DefId ,
16211630 propagated_outlives_requirements : & mut Option < & mut Vec < ClosureOutlivesRequirement < ' tcx > > > ,
1622- outlives_suggestion : & mut OutlivesSuggestionBuilder < ' _ > ,
1623- errors_buffer : & mut Vec < Diagnostic > ,
1624- region_naming : & mut RegionErrorNamingCtx ,
1625- ) -> Option < ErrorReported > {
1626- debug ! (
1627- "report_or_propagate_universal_region_error: fr={:?} does not outlive shorter_fr={:?}" ,
1628- longer_fr, shorter_fr,
1629- ) ;
1630-
1631+ ) -> bool {
16311632 if let Some ( propagated_outlives_requirements) = propagated_outlives_requirements {
16321633 // Shrink `longer_fr` until we find a non-local region (if we do).
16331634 // We'll call it `fr-` -- it's ever so slightly smaller than
16341635 // `longer_fr`.
1635-
16361636 if let Some ( fr_minus) =
16371637 self . universal_region_relations . non_local_lower_bound ( longer_fr) {
1638- debug ! ( "report_or_propagate_universal_region_error : fr_minus={:?}" , fr_minus) ;
1638+ debug ! ( "try_propagate_universal_region_error : fr_minus={:?}" , fr_minus) ;
16391639
16401640 let blame_span_category =
16411641 self . find_outlives_blame_span ( body, longer_fr,
@@ -1648,7 +1648,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
16481648 . universal_region_relations
16491649 . non_local_upper_bounds ( & shorter_fr) ;
16501650 debug ! (
1651- "report_or_propagate_universal_region_error : shorter_fr_plus={:?}" ,
1651+ "try_propagate_universal_region_error : shorter_fr_plus={:?}" ,
16521652 shorter_fr_plus
16531653 ) ;
16541654 for & & fr in & shorter_fr_plus {
@@ -1660,32 +1660,11 @@ impl<'tcx> RegionInferenceContext<'tcx> {
16601660 category : blame_span_category. 0 ,
16611661 } ) ;
16621662 }
1663- return None ;
1663+ return true ;
16641664 }
16651665 }
16661666
1667- // If we are not in a context where we can't propagate errors, or we
1668- // could not shrink `fr` to something smaller, then just report an
1669- // error.
1670- //
1671- // Note: in this case, we use the unapproximated regions to report the
1672- // error. This gives better error messages in some cases.
1673- let db = self . report_error (
1674- body,
1675- local_names,
1676- upvars,
1677- infcx,
1678- mir_def_id,
1679- longer_fr,
1680- NLLRegionVariableOrigin :: FreeRegion ,
1681- shorter_fr,
1682- outlives_suggestion,
1683- region_naming,
1684- ) ;
1685-
1686- db. buffer ( errors_buffer) ;
1687-
1688- Some ( ErrorReported )
1667+ false
16891668 }
16901669
16911670 fn check_bound_universal_region (
0 commit comments