Skip to content

Commit

Permalink
Add some tests around where bounds on associated items and their lack…
Browse files Browse the repository at this point in the history
… of effect on impls
  • Loading branch information
oli-obk committed Jun 26, 2023
1 parent fa06a37 commit 042f605
Show file tree
Hide file tree
Showing 12 changed files with 182 additions and 0 deletions.
1 change: 1 addition & 0 deletions tests/ui/traits/auxiliary/trivial3.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub trait Trait {}
3 changes: 3 additions & 0 deletions tests/ui/traits/auxiliary/trivial4.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pub trait Trait {}

impl Trait for () {}
18 changes: 18 additions & 0 deletions tests/ui/traits/trivial_impl.rs
Original file line number Diff line number Diff line change
@@ -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() {}
14 changes: 14 additions & 0 deletions tests/ui/traits/trivial_impl.stderr
Original file line number Diff line number Diff line change
@@ -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`.
13 changes: 13 additions & 0 deletions tests/ui/traits/trivial_impl2.rs
Original file line number Diff line number Diff line change
@@ -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() {}
14 changes: 14 additions & 0 deletions tests/ui/traits/trivial_impl2.stderr
Original file line number Diff line number Diff line change
@@ -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`.
19 changes: 19 additions & 0 deletions tests/ui/traits/trivial_impl3.rs
Original file line number Diff line number Diff line change
@@ -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() {}
14 changes: 14 additions & 0 deletions tests/ui/traits/trivial_impl3.stderr
Original file line number Diff line number Diff line change
@@ -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`.
21 changes: 21 additions & 0 deletions tests/ui/traits/trivial_impl4.rs
Original file line number Diff line number Diff line change
@@ -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() {}
14 changes: 14 additions & 0 deletions tests/ui/traits/trivial_impl4.stderr
Original file line number Diff line number Diff line change
@@ -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`.
26 changes: 26 additions & 0 deletions tests/ui/traits/trivial_impl_sized.rs
Original file line number Diff line number Diff line change
@@ -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() {}
25 changes: 25 additions & 0 deletions tests/ui/traits/trivial_impl_sized.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 042f605

Please sign in to comment.