Add some type-alias-impl-trait regression tests
Fixes #57611 Fixes #57807
This commit is contained in:
parent
e0bbe7915e
commit
1605276cc2
3 changed files with 81 additions and 0 deletions
27
src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs
Normal file
27
src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.rs
Normal file
|
@ -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() {}
|
|
@ -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`.
|
|
@ -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() {}
|
Loading…
Add table
Add a link
Reference in a new issue