Add test for walking order dependent opaque type behaviour
This commit is contained in:
parent
bbe9a9c20b
commit
ffe5439330
28
tests/ui/impl-trait/associated-type-undefine.rs
Normal file
28
tests/ui/impl-trait/associated-type-undefine.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#![feature(impl_trait_in_assoc_type)]
|
||||||
|
|
||||||
|
trait Foo: Sized {
|
||||||
|
type Bar;
|
||||||
|
type Gat<T: Foo>;
|
||||||
|
fn foo(self) -> (<Self as Foo>::Gat<u32>, <Self as Foo>::Gat<Self>);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Foo for u32 {
|
||||||
|
type Bar = ();
|
||||||
|
type Gat<T: Foo> = ();
|
||||||
|
fn foo(self) -> (<Self as Foo>::Gat<u32>, <Self as Foo>::Gat<Self>) {
|
||||||
|
((), ())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Foo for () {
|
||||||
|
type Bar = impl Sized;
|
||||||
|
type Gat<T: Foo> = <T as Foo>::Bar;
|
||||||
|
// Because we encounter `Gat<u32>` first, we never walk into another `Gat`
|
||||||
|
// again, thus missing the opaque type that we could be defining.
|
||||||
|
fn foo(self) -> (<Self as Foo>::Gat<u32>, <Self as Foo>::Gat<Self>) {
|
||||||
|
((), ())
|
||||||
|
//~^ ERROR: mismatched types
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
20
tests/ui/impl-trait/associated-type-undefine.stderr
Normal file
20
tests/ui/impl-trait/associated-type-undefine.stderr
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/associated-type-undefine.rs:23:14
|
||||||
|
|
|
||||||
|
LL | type Bar = impl Sized;
|
||||||
|
| ---------- the expected opaque type
|
||||||
|
...
|
||||||
|
LL | ((), ())
|
||||||
|
| ^^ expected opaque type, found `()`
|
||||||
|
|
|
||||||
|
= note: expected opaque type `<() as Foo>::Bar`
|
||||||
|
found unit type `()`
|
||||||
|
note: this item must have the opaque type in its signature in order to be able to register hidden types
|
||||||
|
--> $DIR/associated-type-undefine.rs:22:8
|
||||||
|
|
|
||||||
|
LL | fn foo(self) -> (<Self as Foo>::Gat<u32>, <Self as Foo>::Gat<Self>) {
|
||||||
|
| ^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Reference in New Issue
Block a user