Make empty bounds lower to WellFormed and make WellFormed coinductive
This commit is contained in:
parent
8e430bfa9a
commit
e16dbb5076
8 changed files with 100 additions and 26 deletions
|
@ -206,6 +206,9 @@ fn ensure_drop_predicates_are_implied_by_item_defn<'tcx>(
|
|||
relator.relate(predicate.rebind(ty_a), p.rebind(ty_b)).is_ok()
|
||||
&& relator.relate(predicate.rebind(lt_a), p.rebind(lt_b)).is_ok()
|
||||
}
|
||||
(ty::PredicateKind::WellFormed(arg_a), ty::PredicateKind::WellFormed(arg_b)) => {
|
||||
relator.relate(predicate.rebind(arg_a), p.rebind(arg_b)).is_ok()
|
||||
}
|
||||
_ => predicate == p,
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1807,6 +1807,12 @@ fn check_false_global_bounds(fcx: &FnCtxt<'_, '_>, mut span: Span, id: hir::HirI
|
|||
let implied_obligations = traits::elaborate_predicates_with_span(fcx.tcx, predicates_with_span);
|
||||
|
||||
for obligation in implied_obligations {
|
||||
// We lower empty bounds like `Vec<dyn Copy>:` as
|
||||
// `WellFormed(Vec<dyn Copy>)`, which will later get checked by
|
||||
// regular WF checking
|
||||
if let ty::PredicateKind::WellFormed(..) = obligation.predicate.kind().skip_binder() {
|
||||
continue;
|
||||
}
|
||||
let pred = obligation.predicate;
|
||||
// Match the existing behavior.
|
||||
if pred.is_global() && !pred.has_late_bound_regions() {
|
||||
|
|
|
@ -2264,12 +2264,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
|
|||
// compiler/tooling bugs from not handling WF predicates.
|
||||
} else {
|
||||
let span = bound_pred.bounded_ty.span;
|
||||
let re_root_empty = tcx.lifetimes.re_root_empty;
|
||||
let predicate = ty::Binder::bind_with_vars(
|
||||
ty::PredicateKind::TypeOutlives(ty::OutlivesPredicate(
|
||||
ty,
|
||||
re_root_empty,
|
||||
)),
|
||||
ty::PredicateKind::WellFormed(ty.into()),
|
||||
bound_vars,
|
||||
);
|
||||
predicates.insert((predicate.to_predicate(tcx), span));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue