Add tests showcasing our short circuiting behaviour in the signature checks for defining scopes
This commit is contained in:
parent
12243ec415
commit
326a9fa8e8
25
tests/ui/type-alias-impl-trait/multi-error.rs
Normal file
25
tests/ui/type-alias-impl-trait/multi-error.rs
Normal file
@ -0,0 +1,25 @@
|
||||
//! This test checks that we don't follow up
|
||||
//! with type mismatch errors of opaque types
|
||||
//! with their hidden types if we failed the
|
||||
//! defining scope check at the signature level.
|
||||
|
||||
#![feature(impl_trait_in_assoc_type)]
|
||||
|
||||
trait Foo {
|
||||
type Bar<T>;
|
||||
type Baz;
|
||||
fn foo() -> (Self::Bar<u32>, Self::Baz);
|
||||
}
|
||||
|
||||
impl Foo for () {
|
||||
type Bar<T> = impl Sized;
|
||||
type Baz = impl Sized;
|
||||
fn foo() -> (Self::Bar<u32>, Self::Baz) {
|
||||
//~^ ERROR non-defining opaque type use
|
||||
((), ())
|
||||
//~^ ERROR mismatched types
|
||||
//~| ERROR mismatched types
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
49
tests/ui/type-alias-impl-trait/multi-error.stderr
Normal file
49
tests/ui/type-alias-impl-trait/multi-error.stderr
Normal file
@ -0,0 +1,49 @@
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/multi-error.rs:17:17
|
||||
|
|
||||
LL | fn foo() -> (Self::Bar<u32>, Self::Baz) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ argument `u32` is not a generic parameter
|
||||
|
|
||||
note: for this opaque type
|
||||
--> $DIR/multi-error.rs:15:19
|
||||
|
|
||||
LL | type Bar<T> = impl Sized;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/multi-error.rs:19:10
|
||||
|
|
||||
LL | type Bar<T> = impl Sized;
|
||||
| ---------- the expected opaque type
|
||||
...
|
||||
LL | ((), ())
|
||||
| ^^ expected opaque type, found `()`
|
||||
|
|
||||
= note: expected opaque type `<() as Foo>::Bar<u32>`
|
||||
found unit type `()`
|
||||
note: this item must have the opaque type in its signature in order to be able to register hidden types
|
||||
--> $DIR/multi-error.rs:17:8
|
||||
|
|
||||
LL | fn foo() -> (Self::Bar<u32>, Self::Baz) {
|
||||
| ^^^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/multi-error.rs:19:14
|
||||
|
|
||||
LL | type Baz = impl Sized;
|
||||
| ---------- the expected opaque type
|
||||
...
|
||||
LL | ((), ())
|
||||
| ^^ expected opaque type, found `()`
|
||||
|
|
||||
= note: expected opaque type `<() as Foo>::Baz`
|
||||
found unit type `()`
|
||||
note: this item must have the opaque type in its signature in order to be able to register hidden types
|
||||
--> $DIR/multi-error.rs:17:8
|
||||
|
|
||||
LL | fn foo() -> (Self::Bar<u32>, Self::Baz) {
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
22
tests/ui/type-alias-impl-trait/non-defining-method.rs
Normal file
22
tests/ui/type-alias-impl-trait/non-defining-method.rs
Normal file
@ -0,0 +1,22 @@
|
||||
//! This test checks that we don't follow up
|
||||
//! with type mismatch errors of opaque types
|
||||
//! with their hidden types if we failed the
|
||||
//! defining scope check at the signature level.
|
||||
|
||||
#![feature(impl_trait_in_assoc_type)]
|
||||
|
||||
trait Foo {
|
||||
type Bar<T>;
|
||||
fn foo() -> Self::Bar<u32>;
|
||||
fn bar<T>() -> Self::Bar<T>;
|
||||
}
|
||||
|
||||
impl Foo for () {
|
||||
type Bar<T> = impl Sized;
|
||||
fn foo() -> Self::Bar<u32> {}
|
||||
//~^ ERROR non-defining opaque type use
|
||||
//~| ERROR mismatched types
|
||||
fn bar<T>() -> Self::Bar<T> {}
|
||||
}
|
||||
|
||||
fn main() {}
|
33
tests/ui/type-alias-impl-trait/non-defining-method.stderr
Normal file
33
tests/ui/type-alias-impl-trait/non-defining-method.stderr
Normal file
@ -0,0 +1,33 @@
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/non-defining-method.rs:16:17
|
||||
|
|
||||
LL | fn foo() -> Self::Bar<u32> {}
|
||||
| ^^^^^^^^^^^^^^ argument `u32` is not a generic parameter
|
||||
|
|
||||
note: for this opaque type
|
||||
--> $DIR/non-defining-method.rs:15:19
|
||||
|
|
||||
LL | type Bar<T> = impl Sized;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/non-defining-method.rs:16:17
|
||||
|
|
||||
LL | type Bar<T> = impl Sized;
|
||||
| ---------- the expected opaque type
|
||||
LL | fn foo() -> Self::Bar<u32> {}
|
||||
| --- ^^^^^^^^^^^^^^ expected opaque type, found `()`
|
||||
| |
|
||||
| implicitly returns `()` as its body has no tail or `return` expression
|
||||
|
|
||||
= note: expected opaque type `<() as Foo>::Bar<u32>`
|
||||
found unit type `()`
|
||||
note: this item must have the opaque type in its signature in order to be able to register hidden types
|
||||
--> $DIR/non-defining-method.rs:16:8
|
||||
|
|
||||
LL | fn foo() -> Self::Bar<u32> {}
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
Loading…
x
Reference in New Issue
Block a user