Don't try to clean predicates involving ReErased
There's nothing to render when we have a bound involving ReErased (either a type or region outliving it), so we don't attempt to generate a clean WherePredicate Fixes #57806
This commit is contained in:
parent
4c2be9c97f
commit
e4fedf4be4
2 changed files with 37 additions and 15 deletions
|
@ -574,6 +574,10 @@ impl<'a, 'tcx, 'rcx> AutoTraitFinder<'a, 'tcx, 'rcx> {
|
||||||
let mut ty_to_fn: FxHashMap<Type, (Option<PolyTrait>, Option<Type>)> = Default::default();
|
let mut ty_to_fn: FxHashMap<Type, (Option<PolyTrait>, Option<Type>)> = Default::default();
|
||||||
|
|
||||||
for (orig_p, p) in clean_where_predicates {
|
for (orig_p, p) in clean_where_predicates {
|
||||||
|
if p.is_none() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let p = p.unwrap();
|
||||||
match p {
|
match p {
|
||||||
WherePredicate::BoundPredicate { ty, mut bounds } => {
|
WherePredicate::BoundPredicate { ty, mut bounds } => {
|
||||||
// Writing a projection trait bound of the form
|
// Writing a projection trait bound of the form
|
||||||
|
|
|
@ -1271,7 +1271,10 @@ impl Clean<Option<Lifetime>> for ty::RegionKind {
|
||||||
ty::RePlaceholder(..) |
|
ty::RePlaceholder(..) |
|
||||||
ty::ReEmpty |
|
ty::ReEmpty |
|
||||||
ty::ReClosureBound(_) |
|
ty::ReClosureBound(_) |
|
||||||
ty::ReErased => None
|
ty::ReErased => {
|
||||||
|
debug!("Cannot clean region {:?}", self);
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1310,16 +1313,16 @@ impl Clean<WherePredicate> for hir::WherePredicate {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Clean<WherePredicate> for ty::Predicate<'a> {
|
impl<'a> Clean<Option<WherePredicate>> for ty::Predicate<'a> {
|
||||||
fn clean(&self, cx: &DocContext) -> WherePredicate {
|
fn clean(&self, cx: &DocContext) -> Option<WherePredicate> {
|
||||||
use rustc::ty::Predicate;
|
use rustc::ty::Predicate;
|
||||||
|
|
||||||
match *self {
|
match *self {
|
||||||
Predicate::Trait(ref pred) => pred.clean(cx),
|
Predicate::Trait(ref pred) => Some(pred.clean(cx)),
|
||||||
Predicate::Subtype(ref pred) => pred.clean(cx),
|
Predicate::Subtype(ref pred) => Some(pred.clean(cx)),
|
||||||
Predicate::RegionOutlives(ref pred) => pred.clean(cx),
|
Predicate::RegionOutlives(ref pred) => pred.clean(cx),
|
||||||
Predicate::TypeOutlives(ref pred) => pred.clean(cx),
|
Predicate::TypeOutlives(ref pred) => pred.clean(cx),
|
||||||
Predicate::Projection(ref pred) => pred.clean(cx),
|
Predicate::Projection(ref pred) => Some(pred.clean(cx)),
|
||||||
|
|
||||||
Predicate::WellFormed(..) |
|
Predicate::WellFormed(..) |
|
||||||
Predicate::ObjectSafe(..) |
|
Predicate::ObjectSafe(..) |
|
||||||
|
@ -1345,24 +1348,39 @@ impl<'tcx> Clean<WherePredicate> for ty::SubtypePredicate<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Clean<WherePredicate> for ty::OutlivesPredicate<ty::Region<'tcx>, ty::Region<'tcx>> {
|
impl<'tcx> Clean<Option<WherePredicate>> for
|
||||||
fn clean(&self, cx: &DocContext) -> WherePredicate {
|
ty::OutlivesPredicate<ty::Region<'tcx>,ty::Region<'tcx>> {
|
||||||
|
|
||||||
|
fn clean(&self, cx: &DocContext) -> Option<WherePredicate> {
|
||||||
let ty::OutlivesPredicate(ref a, ref b) = *self;
|
let ty::OutlivesPredicate(ref a, ref b) = *self;
|
||||||
WherePredicate::RegionPredicate {
|
|
||||||
|
match (a, b) {
|
||||||
|
(ty::ReEmpty, ty::ReEmpty) => {
|
||||||
|
return None;
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(WherePredicate::RegionPredicate {
|
||||||
lifetime: a.clean(cx).expect("failed to clean lifetime"),
|
lifetime: a.clean(cx).expect("failed to clean lifetime"),
|
||||||
bounds: vec![GenericBound::Outlives(b.clean(cx).expect("failed to clean bounds"))]
|
bounds: vec![GenericBound::Outlives(b.clean(cx).expect("failed to clean bounds"))]
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> Clean<WherePredicate> for ty::OutlivesPredicate<Ty<'tcx>, ty::Region<'tcx>> {
|
impl<'tcx> Clean<Option<WherePredicate>> for ty::OutlivesPredicate<Ty<'tcx>, ty::Region<'tcx>> {
|
||||||
fn clean(&self, cx: &DocContext) -> WherePredicate {
|
fn clean(&self, cx: &DocContext) -> Option<WherePredicate> {
|
||||||
let ty::OutlivesPredicate(ref ty, ref lt) = *self;
|
let ty::OutlivesPredicate(ref ty, ref lt) = *self;
|
||||||
|
|
||||||
WherePredicate::BoundPredicate {
|
match lt {
|
||||||
|
ty::ReEmpty => return None,
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(WherePredicate::BoundPredicate {
|
||||||
ty: ty.clean(cx),
|
ty: ty.clean(cx),
|
||||||
bounds: vec![GenericBound::Outlives(lt.clean(cx).expect("failed to clean lifetimes"))]
|
bounds: vec![GenericBound::Outlives(lt.clean(cx).expect("failed to clean lifetimes"))]
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1579,7 +1597,7 @@ impl<'a, 'tcx> Clean<Generics> for (&'a ty::Generics,
|
||||||
}).collect::<Vec<GenericParamDef>>();
|
}).collect::<Vec<GenericParamDef>>();
|
||||||
|
|
||||||
let mut where_predicates = preds.predicates.iter()
|
let mut where_predicates = preds.predicates.iter()
|
||||||
.map(|(p, _)| p.clean(cx))
|
.flat_map(|(p, _)| p.clean(cx))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
// Type parameters and have a Sized bound by default unless removed with
|
// Type parameters and have a Sized bound by default unless removed with
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue