Skip to content

Commit

Permalink
Auto merge of #100205 - cjgillot:noice-doc, r=camelid
Browse files Browse the repository at this point in the history
Avoid ICE in rustdoc when using `Fn` bounds

Fixes #100143
  • Loading branch information
bors committed Aug 9, 2022
2 parents f03ce30 + 28e4b9e commit 8d1fa71
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 10 deletions.
28 changes: 18 additions & 10 deletions src/librustdoc/clean/auto_trait.rs
Original file line number Diff line number Diff line change
Expand Up @@ -348,15 +348,13 @@ where
fn make_final_bounds(
&self,
ty_to_bounds: FxHashMap<Type, FxHashSet<GenericBound>>,
ty_to_fn: FxHashMap<Type, (Option<PolyTrait>, Option<Type>)>,
ty_to_fn: FxHashMap<Type, (PolyTrait, Option<Type>)>,
lifetime_to_bounds: FxHashMap<Lifetime, FxHashSet<GenericBound>>,
) -> Vec<WherePredicate> {
ty_to_bounds
.into_iter()
.flat_map(|(ty, mut bounds)| {
if let Some(data) = ty_to_fn.get(&ty) {
let (poly_trait, output) =
(data.0.as_ref().unwrap().clone(), data.1.as_ref().cloned().map(Box::new));
if let Some((ref poly_trait, ref output)) = ty_to_fn.get(&ty) {
let mut new_path = poly_trait.trait_.clone();
let last_segment = new_path.segments.pop().expect("segments were empty");

Expand All @@ -374,8 +372,9 @@ where
GenericArgs::Parenthesized { inputs, output } => (inputs, output),
};

let output = output.as_ref().cloned().map(Box::new);
if old_output.is_some() && old_output != output {
panic!("Output mismatch for {:?} {:?} {:?}", ty, old_output, data.1);
panic!("Output mismatch for {:?} {:?} {:?}", ty, old_output, output);
}

let new_params = GenericArgs::Parenthesized { inputs: old_input, output };
Expand All @@ -385,7 +384,10 @@ where
.push(PathSegment { name: last_segment.name, args: new_params });

bounds.insert(GenericBound::TraitBound(
PolyTrait { trait_: new_path, generic_params: poly_trait.generic_params },
PolyTrait {
trait_: new_path,
generic_params: poly_trait.generic_params.clone(),
},
hir::TraitBoundModifier::None,
));
}
Expand Down Expand Up @@ -471,7 +473,7 @@ where
let mut lifetime_to_bounds: FxHashMap<_, FxHashSet<_>> = Default::default();
let mut ty_to_traits: FxHashMap<Type, FxHashSet<Path>> = Default::default();

let mut ty_to_fn: FxHashMap<Type, (Option<PolyTrait>, Option<Type>)> = Default::default();
let mut ty_to_fn: FxHashMap<Type, (PolyTrait, Option<Type>)> = Default::default();

for p in clean_where_predicates {
let (orig_p, p) = (p, p.clean(self.cx));
Expand Down Expand Up @@ -535,8 +537,8 @@ where
if is_fn {
ty_to_fn
.entry(ty.clone())
.and_modify(|e| *e = (Some(poly_trait.clone()), e.1.clone()))
.or_insert(((Some(poly_trait.clone())), None));
.and_modify(|e| *e = (poly_trait.clone(), e.1.clone()))
.or_insert(((poly_trait.clone()), None));

ty_to_bounds.entry(ty.clone()).or_default();
} else {
Expand All @@ -559,7 +561,13 @@ where
.and_modify(|e| {
*e = (e.0.clone(), Some(rhs.ty().unwrap().clone()))
})
.or_insert((None, Some(rhs.ty().unwrap().clone())));
.or_insert((
PolyTrait {
trait_: trait_.clone(),
generic_params: Vec::new(),
},
Some(rhs.ty().unwrap().clone()),
));
continue;
}

Expand Down
21 changes: 21 additions & 0 deletions src/test/rustdoc/fn-bound.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Regression test for #100143

use std::iter::Peekable;

pub struct Span<F: Fn(&i32)> {
inner: Peekable<ConditionalIterator<F>>,
}

pub struct ConditionalIterator<F> {
f: F,
}


// @has 'fn_bound/struct.ConditionalIterator.html' '//h3[@class="code-header in-band"]' 'impl<F: Fn(&i32)> Iterator for ConditionalIterator<F>'
impl<F: Fn(&i32)> Iterator for ConditionalIterator<F> {
type Item = ();

fn next(&mut self) -> Option<Self::Item> {
todo!()
}
}

0 comments on commit 8d1fa71

Please sign in to comment.