diff options
| author | bors <bors@rust-lang.org> | 2017-10-07 09:36:12 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-10-07 09:36:12 +0000 |
| commit | d2f71bf23f67b18fbdb64f1173af1a0ddc649421 (patch) | |
| tree | 61e4b407172484312fd6a6b410bba5ec0ad66855 /src | |
| parent | cce93436d3628f5fa8288c7e84f4b695542c6ae3 (diff) | |
| parent | 16c110f78b464f1c57a9142f6abb38c2a53c05ad (diff) | |
| download | rust-d2f71bf23f67b18fbdb64f1173af1a0ddc649421.tar.gz rust-d2f71bf23f67b18fbdb64f1173af1a0ddc649421.zip | |
Auto merge of #44860 - kennytm:fix-44731, r=alexcrichton
Fix issue #44731. Also excludes `impl Trait` from everybody_loops if it appears in the path. Fixes #44731.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_driver/pretty.rs | 18 | ||||
| -rw-r--r-- | src/test/rustdoc/issue-43869.rs | 51 |
2 files changed, 68 insertions, 1 deletions
diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index 2f665af8433..e6d89f77f21 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -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 diff --git a/src/test/rustdoc/issue-43869.rs b/src/test/rustdoc/issue-43869.rs index 2d18e4be532..4670c5386c8 100644 --- a/src/test/rustdoc/issue-43869.rs +++ b/src/test/rustdoc/issue-43869.rs @@ -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 |
