Avoid ICE in rustdoc.
This commit is contained in:
parent
55f46419af
commit
a6cfabc88a
2 changed files with 24 additions and 5 deletions
|
@ -354,9 +354,7 @@ where
|
||||||
ty_to_bounds
|
ty_to_bounds
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.flat_map(|(ty, mut bounds)| {
|
.flat_map(|(ty, mut bounds)| {
|
||||||
if let Some(data) = ty_to_fn.get(&ty) {
|
if let Some((Some(ref poly_trait), ref output)) = ty_to_fn.get(&ty) {
|
||||||
let (poly_trait, output) =
|
|
||||||
(data.0.as_ref().unwrap().clone(), data.1.as_ref().cloned().map(Box::new));
|
|
||||||
let mut new_path = poly_trait.trait_.clone();
|
let mut new_path = poly_trait.trait_.clone();
|
||||||
let last_segment = new_path.segments.pop().expect("segments were empty");
|
let last_segment = new_path.segments.pop().expect("segments were empty");
|
||||||
|
|
||||||
|
@ -374,8 +372,9 @@ where
|
||||||
GenericArgs::Parenthesized { inputs, output } => (inputs, output),
|
GenericArgs::Parenthesized { inputs, output } => (inputs, output),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let output = output.as_ref().cloned().map(Box::new);
|
||||||
if old_output.is_some() && old_output != output {
|
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 };
|
let new_params = GenericArgs::Parenthesized { inputs: old_input, output };
|
||||||
|
@ -385,7 +384,10 @@ where
|
||||||
.push(PathSegment { name: last_segment.name, args: new_params });
|
.push(PathSegment { name: last_segment.name, args: new_params });
|
||||||
|
|
||||||
bounds.insert(GenericBound::TraitBound(
|
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,
|
hir::TraitBoundModifier::None,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
17
src/test/rustdoc/fn-bound.rs
Normal file
17
src/test/rustdoc/fn-bound.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
use std::iter::Peekable;
|
||||||
|
|
||||||
|
pub struct Span<F: Fn(&i32)> {
|
||||||
|
inner: Peekable<ConditionalIterator<F>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ConditionalIterator<F> {
|
||||||
|
f: F,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F: Fn(&i32)> Iterator for ConditionalIterator<F> {
|
||||||
|
type Item = ();
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue