Add some tests around where bounds on associated items and their lack of effect on impls

This commit is contained in:
Oli Scherer 2023-06-23 16:04:35 +00:00
parent fa06a371b7
commit 042f6052ab
12 changed files with 182 additions and 0 deletions

View file

@ -0,0 +1 @@
pub trait Trait {}

View file

@ -0,0 +1,3 @@
pub trait Trait {}
impl Trait for () {}

View file

@ -0,0 +1,18 @@
//! This test checks that we do need to implement
//! all members, even if their where bounds only hold
//! due to other impls.
trait Foo<T> {
fn foo()
where
Self: Foo<()>;
}
impl Foo<()> for () {
fn foo() {}
}
impl Foo<u32> for () {}
//~^ ERROR: not all trait items implemented, missing: `foo`
fn main() {}

View file

@ -0,0 +1,14 @@
error[E0046]: not all trait items implemented, missing: `foo`
--> $DIR/trivial_impl.rs:15:1
|
LL | / fn foo()
LL | | where
LL | | Self: Foo<()>;
| |______________________- `foo` from trait
...
LL | impl Foo<u32> for () {}
| ^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation
error: aborting due to previous error
For more information about this error, try `rustc --explain E0046`.

View file

@ -0,0 +1,13 @@
//! This test checks that we currently need to implement
//! members, even if their where bounds don't hold for the impl type.
trait Foo<T> {
fn foo()
where
Self: Foo<()>;
}
impl Foo<u32> for () {}
//~^ ERROR: not all trait items implemented, missing: `foo`
fn main() {}

View file

@ -0,0 +1,14 @@
error[E0046]: not all trait items implemented, missing: `foo`
--> $DIR/trivial_impl2.rs:10:1
|
LL | / fn foo()
LL | | where
LL | | Self: Foo<()>;
| |______________________- `foo` from trait
...
LL | impl Foo<u32> for () {}
| ^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation
error: aborting due to previous error
For more information about this error, try `rustc --explain E0046`.

View file

@ -0,0 +1,19 @@
//! Check that we don't break orphan rules.
//! The dependency may add an impl for `u8` later,
//! which would break this crate. We want to avoid adding
//! more ways in which adding an impl can be a breaking change.
// aux-build:trivial3.rs
extern crate trivial3;
pub trait Foo {
fn foo()
where
Self: trivial3::Trait;
}
impl Foo for u8 {}
//~^ ERROR not all trait items implemented, missing: `foo`
fn main() {}

View file

@ -0,0 +1,14 @@
error[E0046]: not all trait items implemented, missing: `foo`
--> $DIR/trivial_impl3.rs:16:1
|
LL | / fn foo()
LL | | where
LL | | Self: trivial3::Trait;
| |______________________________- `foo` from trait
...
LL | impl Foo for u8 {}
| ^^^^^^^^^^^^^^^ missing `foo` in implementation
error: aborting due to previous error
For more information about this error, try `rustc --explain E0046`.

View file

@ -0,0 +1,21 @@
//! Check that we don't break orphan rules.
//! The dependency may add an impl for `u8` later,
//! which would break this crate. We want to avoid adding
//! more ways in which adding an impl can be a breaking change.
//! This test differs from `trivial_impl3` because there actually
//! exists any impl for `Trait`, which has an effect on coherence.
// aux-build:trivial4.rs
extern crate trivial4;
pub trait Foo {
fn foo()
where
Self: trivial4::Trait;
}
impl Foo for u8 {}
//~^ ERROR not all trait items implemented, missing: `foo`
fn main() {}

View file

@ -0,0 +1,14 @@
error[E0046]: not all trait items implemented, missing: `foo`
--> $DIR/trivial_impl4.rs:18:1
|
LL | / fn foo()
LL | | where
LL | | Self: trivial4::Trait;
| |______________________________- `foo` from trait
...
LL | impl Foo for u8 {}
| ^^^^^^^^^^^^^^^ missing `foo` in implementation
error: aborting due to previous error
For more information about this error, try `rustc --explain E0046`.

View file

@ -0,0 +1,26 @@
//! This test checks that we currently need to implement
//! members, even if their where bounds don't hold for the impl type.
trait Foo {
fn foo()
where
Self: Sized;
}
impl Foo for () {
fn foo() {}
}
// Must not be allowed
impl Foo for i32 {}
//~^ ERROR: not all trait items implemented, missing: `foo`
// Should be allowed
impl Foo for dyn std::fmt::Debug {}
//~^ ERROR: not all trait items implemented, missing: `foo`
impl Foo for dyn std::fmt::Display {
fn foo() {}
}
fn main() {}

View file

@ -0,0 +1,25 @@
error[E0046]: not all trait items implemented, missing: `foo`
--> $DIR/trivial_impl_sized.rs:15:1
|
LL | / fn foo()
LL | | where
LL | | Self: Sized;
| |____________________- `foo` from trait
...
LL | impl Foo for i32 {}
| ^^^^^^^^^^^^^^^^ missing `foo` in implementation
error[E0046]: not all trait items implemented, missing: `foo`
--> $DIR/trivial_impl_sized.rs:19:1
|
LL | / fn foo()
LL | | where
LL | | Self: Sized;
| |____________________- `foo` from trait
...
LL | impl Foo for dyn std::fmt::Debug {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0046`.