Skip to content

Commit f31393f

Browse files
committed
Avoid adding edges to static where we already flag other errors
1 parent fccede8 commit f31393f

File tree

1 file changed

+25
-31
lines changed

1 file changed

+25
-31
lines changed

compiler/rustc_borrowck/src/handle_placeholders.rs

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::ty::VarianceDiagInfo;
2020
use crate::type_check::free_region_relations::UniversalRegionRelations;
2121
use crate::type_check::{Locations, MirTypeckRegionConstraints};
2222
use 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

Comments
 (0)