Skip to content

Commit

Permalink
Fix issue rust-lang#44731.
Browse files Browse the repository at this point in the history
Also excludes `impl Trait` from everybody_loops if it appears in the path.
  • Loading branch information
kennytm committed Sep 26, 2017
1 parent 82ae968 commit 16c110f
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 1 deletion.
18 changes: 17 additions & 1 deletion src/librustc_driver/pretty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -659,10 +659,26 @@ impl ReplaceBodyWithLoop {
ast::TyKind::Ptr(ast::MutTy { ty: ref subty, .. }) |
ast::TyKind::Rptr(_, ast::MutTy { ty: ref subty, .. }) |
ast::TyKind::Paren(ref subty) => involves_impl_trait(subty),
ast::TyKind::Tup(ref tys) => tys.iter().any(|subty| involves_impl_trait(subty)),
ast::TyKind::Tup(ref tys) => any_involves_impl_trait(tys.iter()),
ast::TyKind::Path(_, ref path) => path.segments.iter().any(|seg| {
match seg.parameters.as_ref().map(|p| &**p) {
None => false,
Some(&ast::PathParameters::AngleBracketed(ref data)) =>
any_involves_impl_trait(data.types.iter()) ||
any_involves_impl_trait(data.bindings.iter().map(|b| &b.ty)),
Some(&ast::PathParameters::Parenthesized(ref data)) =>
any_involves_impl_trait(data.inputs.iter()) ||
any_involves_impl_trait(data.output.iter()),
}
}),
_ => false,
}
}

fn any_involves_impl_trait<'a, I: Iterator<Item = &'a P<ast::Ty>>>(mut it: I) -> bool {
it.any(|subty| involves_impl_trait(subty))
}

involves_impl_trait(ty)
} else {
false
Expand Down
51 changes: 51 additions & 0 deletions src/test/rustdoc/issue-43869.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,58 @@ pub fn j() -> impl Iterator<Item=u8> + Clone {
Some(1u8).into_iter()
}

pub fn k() -> [impl Clone; 2] {
[123u32, 456u32]
}

pub fn l() -> (impl Clone, impl Default) {
(789u32, -123i32)
}

pub fn m() -> &'static impl Clone {
&1u8
}

pub fn n() -> *const impl Clone {
&1u8
}

pub fn o() -> &'static [impl Clone] {
b":)"
}

// issue #44731
pub fn test_44731_0() -> Box<impl Iterator<Item=u8>> {
Box::new(g())
}

pub fn test_44731_1() -> Result<Box<impl Clone>, ()> {
Ok(Box::new(j()))
}

pub fn test_44731_2() -> Box<Fn(impl Clone)> {
Box::new(|_: u32| {})
}

pub fn test_44731_3() -> Box<Fn() -> impl Clone> {
Box::new(|| 0u32)
}

pub fn test_44731_4() -> Box<Iterator<Item=impl Clone>> {
Box::new(g())
}

// @has issue_43869/fn.g.html
// @has issue_43869/fn.h.html
// @has issue_43869/fn.i.html
// @has issue_43869/fn.j.html
// @has issue_43869/fn.k.html
// @has issue_43869/fn.l.html
// @has issue_43869/fn.m.html
// @has issue_43869/fn.n.html
// @has issue_43869/fn.o.html
// @has issue_43869/fn.test_44731_0.html
// @has issue_43869/fn.test_44731_1.html
// @has issue_43869/fn.test_44731_2.html
// @has issue_43869/fn.test_44731_3.html
// @has issue_43869/fn.test_44731_4.html

0 comments on commit 16c110f

Please sign in to comment.