From 16c110f78b464f1c57a9142f6abb38c2a53c05ad Mon Sep 17 00:00:00 2001 From: kennytm Date: Tue, 26 Sep 2017 16:44:28 +0800 Subject: [PATCH] Fix issue #44731. Also excludes `impl Trait` from everybody_loops if it appears in the path. --- src/librustc_driver/pretty.rs | 18 +++++++++++- src/test/rustdoc/issue-43869.rs | 51 +++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) 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>>(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 + 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> { + Box::new(g()) +} + +pub fn test_44731_1() -> Result, ()> { + Ok(Box::new(j())) +} + +pub fn test_44731_2() -> Box { + Box::new(|_: u32| {}) +} + +pub fn test_44731_3() -> Box impl Clone> { + Box::new(|| 0u32) +} + +pub fn test_44731_4() -> Box> { + 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