about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-10-07 09:36:12 +0000
committerbors <bors@rust-lang.org>2017-10-07 09:36:12 +0000
commitd2f71bf23f67b18fbdb64f1173af1a0ddc649421 (patch)
tree61e4b407172484312fd6a6b410bba5ec0ad66855 /src
parentcce93436d3628f5fa8288c7e84f4b695542c6ae3 (diff)
parent16c110f78b464f1c57a9142f6abb38c2a53c05ad (diff)
downloadrust-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.rs18
-rw-r--r--src/test/rustdoc/issue-43869.rs51
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