about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2019-02-16 00:55:46 +0800
committerkennytm <kennytm@gmail.com>2019-02-16 14:11:20 +0800
commit84e88da4311e4c2dac3789de708ec5232a3deeff (patch)
treee04dbb0e1a7fc03f086d0e9349ccc1073c64018b /src/test
parentf058741a679062202697144daebd05e1b0d6d747 (diff)
parentcce2c89e3bb7cb91610ea6891290491bf763bee3 (diff)
downloadrust-84e88da4311e4c2dac3789de708ec5232a3deeff.tar.gz
rust-84e88da4311e4c2dac3789de708ec5232a3deeff.zip
Rollup merge of #57981 - Zoxc:fix-57979, r=nikomatsakis
Fix #57730

cc https://github.com/rust-lang/rust/pull/57730

r? @cramertj
Diffstat (limited to 'src/test')
-rw-r--r--src/test/ui/issues/issue-57979.rs42
-rw-r--r--src/test/ui/issues/issue-57979.stderr17
2 files changed, 59 insertions, 0 deletions
diff --git a/src/test/ui/issues/issue-57979.rs b/src/test/ui/issues/issue-57979.rs
new file mode 100644
index 00000000000..abd46b60ab1
--- /dev/null
+++ b/src/test/ui/issues/issue-57979.rs
@@ -0,0 +1,42 @@
+// Regression test for #57979. This situation is meant to be an error.
+// As noted in the issue thread, we decided to forbid nested impl
+// trait of this kind:
+//
+// ```rust
+// fn foo() -> impl Foo<impl Bar> { .. }
+// ```
+//
+// Basically there are two hidden variables here, let's call them `X`
+// and `Y`, and we must prove that:
+//
+// ```
+// X: Foo<Y>
+// Y: Bar
+// ```
+//
+// However, the user is only giving us the return type `X`. It's true
+// that in some cases, we can infer `Y` from `X`, because `X` only
+// implements `Foo` for one type (and indeed the compiler does
+// inference of this kind), but I do recall that we intended to forbid
+// this -- in part because such inference is fragile, and there is not
+// necessarily a way for the user to be more explicit should the
+// inference fail (so you could get stuck with no way to port your
+// code forward if, for example, more impls are added to an existing
+// type).
+//
+// The same seems to apply in this situation. Here there are three impl traits, so we have
+//
+// ```
+// X: IntoIterator<Item = Y>
+// Y: Borrow<Data<Z>>
+// Z: AsRef<[u8]>
+// ```
+
+use std::borrow::Borrow;
+
+pub struct Data<TBody>(TBody);
+
+pub fn collect(_: impl IntoIterator<Item = impl Borrow<Data<impl AsRef<[u8]>>>>) {
+    //~^ ERROR
+    unimplemented!()
+}
diff --git a/src/test/ui/issues/issue-57979.stderr b/src/test/ui/issues/issue-57979.stderr
new file mode 100644
index 00000000000..488f30ab7c5
--- /dev/null
+++ b/src/test/ui/issues/issue-57979.stderr
@@ -0,0 +1,17 @@
+error[E0666]: nested `impl Trait` is not allowed
+  --> $DIR/issue-57979.rs:39:61
+   |
+LL | pub fn collect(_: impl IntoIterator<Item = impl Borrow<Data<impl AsRef<[u8]>>>>) {
+   |                                            -----------------^^^^^^^^^^^^^^^^--
+   |                                            |                |
+   |                                            |                nested `impl Trait` here
+   |                                            outer `impl Trait`
+
+error[E0601]: `main` function not found in crate `issue_57979`
+   |
+   = note: consider adding a `main` function to `$DIR/issue-57979.rs`
+
+error: aborting due to 2 previous errors
+
+Some errors occurred: E0601, E0666.
+For more information about an error, try `rustc --explain E0601`.