diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2020-01-26 06:37:19 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-01-26 06:37:19 +0900 |
| commit | e7c557b2958883d5f1927780cc2f4708efe6a00c (patch) | |
| tree | 1331cea78a16e455af5ac739ad85a8d9cb32c7d3 | |
| parent | 88429fb5e250d61e60578e3ed5de4ac2d56567a8 (diff) | |
| parent | 1605276cc2ff3319a7f360b389be1a53d0d5751c (diff) | |
| download | rust-e7c557b2958883d5f1927780cc2f4708efe6a00c.tar.gz rust-e7c557b2958883d5f1927780cc2f4708efe6a00c.zip | |
Rollup merge of #68498 - Aaron1011:tait-regression-tests, r=Centril
Add some type-alias-impl-trait regression tests Fixes #57611 Fixes #57807
3 files changed, 81 insertions, 0 deletions
diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs new file mode 100644 index 00000000000..1c2051e7eae --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs @@ -0,0 +1,27 @@ +// Regression test for issue #57611 +// Ensures that we don't ICE +// FIXME: This should compile, but it currently doesn't + +#![feature(trait_alias)] +#![feature(type_alias_impl_trait)] + +trait Foo { + type Bar: Baz<Self, Self>; + + fn bar(&self) -> Self::Bar; +} + +struct X; + +impl Foo for X { + type Bar = impl Baz<Self, Self>; //~ ERROR type mismatch in closure arguments + //~^ ERROR type mismatch resolving + + fn bar(&self) -> Self::Bar { + |x| x + } +} + +trait Baz<A, B> = Fn(&A) -> &B; + +fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr new file mode 100644 index 00000000000..f648b7bfc99 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr @@ -0,0 +1,23 @@ +error[E0631]: type mismatch in closure arguments + --> $DIR/issue-57611-trait-alias.rs:17:5 + | +LL | type Bar = impl Baz<Self, Self>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected signature of `for<'r> fn(&'r X) -> _` +... +LL | |x| x + | ----- found signature of `fn(_) -> _` + | + = note: the return type of a function must have a statically known size + +error[E0271]: type mismatch resolving `for<'r> <[closure@$DIR/issue-57611-trait-alias.rs:21:9: 21:14] as std::ops::FnOnce<(&'r X,)>>::Output == &'r X` + --> $DIR/issue-57611-trait-alias.rs:17:5 + | +LL | type Bar = impl Baz<Self, Self>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bound lifetime parameter, found concrete lifetime + | + = note: the return type of a function must have a statically known size + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0271, E0631. +For more information about an error, try `rustc --explain E0271`. diff --git a/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs b/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs new file mode 100644 index 00000000000..fcab2c7db26 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.rs @@ -0,0 +1,31 @@ +// Regression test for issue #57807 - ensure +// that we properly unify associated types within +// a type alias impl trait +// check-pass +#![feature(type_alias_impl_trait)] + +trait Bar { + type A; +} + +impl Bar for () { + type A = (); +} + +trait Foo { + type A; + type B: Bar<A = Self::A>; + + fn foo() -> Self::B; +} + +impl Foo for () { + type A = (); + type B = impl Bar<A = Self::A>; + + fn foo() -> Self::B { + () + } +} + +fn main() {} |
