diff options
| author | kennytm <kennytm@gmail.com> | 2019-02-16 00:55:46 +0800 |
|---|---|---|
| committer | kennytm <kennytm@gmail.com> | 2019-02-16 14:11:20 +0800 |
| commit | 84e88da4311e4c2dac3789de708ec5232a3deeff (patch) | |
| tree | e04dbb0e1a7fc03f086d0e9349ccc1073c64018b /src/test | |
| parent | f058741a679062202697144daebd05e1b0d6d747 (diff) | |
| parent | cce2c89e3bb7cb91610ea6891290491bf763bee3 (diff) | |
| download | rust-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.rs | 42 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-57979.stderr | 17 |
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`. |
