@@ -20,7 +20,7 @@ use crate::ty::VarianceDiagInfo;
2020use crate :: type_check:: free_region_relations:: UniversalRegionRelations ;
2121use crate :: type_check:: { Locations , MirTypeckRegionConstraints } ;
2222use crate :: universal_regions:: UniversalRegions ;
23- use crate :: { BorrowckInferCtxt , NllRegionVariableOrigin } ;
23+ use crate :: { BorrowckInferCtxt , NllRegionVariableOrigin , bug } ;
2424
2525/// A set of outlives constraints after rewriting to remove
2626/// higher-kinded constraints.
@@ -428,39 +428,33 @@ fn rewrite_placeholder_outlives<'tcx>(
428428 // That constraint is annotated with some placeholder `unnameable` where
429429 // `unnameable` is unnameable from `r` and there is a path in the constraint graph
430430 // between them.
431- //
432- // There is one exception; if some other region in this SCC can't name `'r`, then
433- // we pick the region with the smallest universe in the SCC, so that a path can
434- // always start in `'r` to find a motivation that isn't cyclic.
435- let blame_to = if annotation. representative . rvid ( ) == max_u_rvid {
436- // Assertion: the region that lowered our universe is an existential one and we are a placeholder!
437-
431+ if annotation. representative . rvid ( ) != max_u_rvid {
432+ // FIXME: if we can extract a useful blame span here, future error
433+ // reporting and constraint search can be simplified.
434+
435+ added_constraints = true ;
436+ outlives_constraints. push ( OutlivesConstraint {
437+ sup : annotation. representative . rvid ( ) ,
438+ sub : fr_static,
439+ category : ConstraintCategory :: OutlivesUnnameablePlaceholder ( max_u_rvid) ,
440+ locations : Locations :: All ( rustc_span:: DUMMY_SP ) ,
441+ span : rustc_span:: DUMMY_SP ,
442+ variance_info : VarianceDiagInfo :: None ,
443+ from_closure : false ,
444+ } ) ;
445+ } else if !( annotation. reaches_existential_that_cannot_name_us ( ) . is_some ( )
446+ || annotation. reaches_other_placeholder ( annotation. representative . rvid ( ) ) . is_some ( ) )
447+ {
438448 // The SCC's representative is not nameable from some region
439- // that ends up in the SCC.
440- let small_universed_rvid = annotation. max_nameable_universe . 1 ;
441- debug ! (
442- "{small_universed_rvid:?} lowered our universe to {:?}" ,
443- annotation. max_nameable_universe( )
449+ // that ends up in the SCC. This means there is nothing for us to do.
450+ // However, this is only possible under circumstances that produce
451+ // errors, so we make sure that we catch them here. Otherwise,
452+ // there might actually be soundness issues!
453+ bug ! (
454+ "Universe of SCC {scc:?} should have been lowered by an existential or at least another placeholder but was lowered by {:?}, which is neither." ,
455+ annotation. max_nameable_universe
444456 ) ;
445- small_universed_rvid
446- } else {
447- // `max_u_rvid` is not nameable by the SCC's representative.
448- max_u_rvid
449457 } ;
450-
451- // FIXME: if we can extract a useful blame span here, future error
452- // reporting and constraint search can be simplified.
453-
454- added_constraints = true ;
455- outlives_constraints. push ( OutlivesConstraint {
456- sup : annotation. representative . rvid ( ) ,
457- sub : fr_static,
458- category : ConstraintCategory :: OutlivesUnnameablePlaceholder ( blame_to) ,
459- locations : Locations :: All ( rustc_span:: DUMMY_SP ) ,
460- span : rustc_span:: DUMMY_SP ,
461- variance_info : VarianceDiagInfo :: None ,
462- from_closure : false ,
463- } ) ;
464458 }
465459 added_constraints
466460}
0 commit comments