diff options
| author | Ariel Ben-Yehuda <ariel.byd@gmail.com> | 2019-07-13 22:52:57 +0300 |
|---|---|---|
| committer | Ariel Ben-Yehuda <ariel.byd@gmail.com> | 2019-09-24 21:11:50 +0300 |
| commit | 9a94ecde04306986dac1b7ca88b4b327b67ea499 (patch) | |
| tree | 10135d2f21717552b9614ee4ca5337c05751f758 | |
| parent | 5d79e8c4c97388dd1201135b8d6cfadccfd3c8e3 (diff) | |
| download | rust-9a94ecde04306986dac1b7ca88b4b327b67ea499.tar.gz rust-9a94ecde04306986dac1b7ca88b4b327b67ea499.zip | |
improve and add tests
| -rw-r--r-- | src/test/ui/never-from-impl-is-reserved.rs (renamed from src/test/ui/never-impl-is-reserved.rs) | 0 | ||||
| -rw-r--r-- | src/test/ui/never-from-impl-is-reserved.stderr (renamed from src/test/ui/never-impl-is-reserved.stderr) | 2 | ||||
| -rw-r--r-- | src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.stderr | 11 | ||||
| -rw-r--r-- | src/test/ui/traits/reservation-impls/reservation-impl-no-use.rs | 14 | ||||
| -rw-r--r-- | src/test/ui/traits/reservation-impls/reservation-impl-no-use.stderr | 15 | ||||
| -rw-r--r-- | src/test/ui/traits/reservation-impls/reservation-impl-ok.rs | 28 |
7 files changed, 85 insertions, 1 deletions
diff --git a/src/test/ui/never-impl-is-reserved.rs b/src/test/ui/never-from-impl-is-reserved.rs index 9d16015bdc1..9d16015bdc1 100644 --- a/src/test/ui/never-impl-is-reserved.rs +++ b/src/test/ui/never-from-impl-is-reserved.rs diff --git a/src/test/ui/never-impl-is-reserved.stderr b/src/test/ui/never-from-impl-is-reserved.stderr index 09116eb4f7f..7e9b21a5429 100644 --- a/src/test/ui/never-impl-is-reserved.stderr +++ b/src/test/ui/never-from-impl-is-reserved.stderr @@ -1,5 +1,5 @@ error[E0119]: conflicting implementations of trait `MyTrait` for type `MyFoo`: - --> $DIR/never-impl-is-reserved.rs:10:1 + --> $DIR/never-from-impl-is-reserved.rs:10:1 | LL | impl MyTrait for MyFoo {} | ---------------------- first implementation here diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.rs b/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.rs new file mode 100644 index 00000000000..1a5266f5583 --- /dev/null +++ b/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.rs @@ -0,0 +1,16 @@ +// compile-fail + +// check that reservation impls are accounted for in negative reasoning. + +#![feature(rustc_attrs)] + +trait MyTrait {} +#[rustc_reservation_impl] +impl MyTrait for () {} + +trait OtherTrait {} +impl OtherTrait for () {} +impl<T: MyTrait> OtherTrait for T {} +//~^ ERROR conflicting implementations + +fn main() {} diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.stderr b/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.stderr new file mode 100644 index 00000000000..7b88d2b42db --- /dev/null +++ b/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.stderr @@ -0,0 +1,11 @@ +error[E0119]: conflicting implementations of trait `OtherTrait` for type `()`: + --> $DIR/reservation-impl-coherence-conflict.rs:13:1 + | +LL | impl OtherTrait for () {} + | ---------------------- first implementation here +LL | impl<T: MyTrait> OtherTrait for T {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `()` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0119`. diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-no-use.rs b/src/test/ui/traits/reservation-impls/reservation-impl-no-use.rs new file mode 100644 index 00000000000..f08338bdc1c --- /dev/null +++ b/src/test/ui/traits/reservation-impls/reservation-impl-no-use.rs @@ -0,0 +1,14 @@ +// compile-fail + +// check that reservation impls can't be used as normal impls in positive reasoning. + +#![feature(rustc_attrs)] + +trait MyTrait { fn foo(&self); } +#[rustc_reservation_impl] +impl MyTrait for () { fn foo(&self) {} } + +fn main() { + <() as MyTrait>::foo(&()); + //~^ ERROR the trait bound `(): MyTrait` is not satisfied +} diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-no-use.stderr b/src/test/ui/traits/reservation-impls/reservation-impl-no-use.stderr new file mode 100644 index 00000000000..8a86f53086d --- /dev/null +++ b/src/test/ui/traits/reservation-impls/reservation-impl-no-use.stderr @@ -0,0 +1,15 @@ +error[E0277]: the trait bound `(): MyTrait` is not satisfied + --> $DIR/reservation-impl-no-use.rs:12:5 + | +LL | trait MyTrait { fn foo(&self); } + | -------------- required by `MyTrait::foo` +... +LL | <() as MyTrait>::foo(&()); + | ^^^^^^^^^^^^^^^^^^^^ the trait `MyTrait` is not implemented for `()` + | + = help: the following implementations were found: + <() as MyTrait> + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-ok.rs b/src/test/ui/traits/reservation-impls/reservation-impl-ok.rs new file mode 100644 index 00000000000..febd14b7922 --- /dev/null +++ b/src/test/ui/traits/reservation-impls/reservation-impl-ok.rs @@ -0,0 +1,28 @@ +// run-pass + +// rpass test for reservation impls. Not 100% required because `From` uses them, +// but still. + +#![feature(rustc_attrs)] + +use std::mem; + +trait MyTrait<S> { + fn foo(&self, s: S) -> usize; +} + +#[rustc_reservation_impl] +impl<T> MyTrait<u64> for T { + fn foo(&self, _x: u64) -> usize { 0 } +} + +// reservation impls don't create coherence conflicts, even with +// non-chain overlap. +impl<S> MyTrait<S> for u32 { + fn foo(&self, _x: S) -> usize { mem::size_of::<S>() } +} + +fn main() { + // ...and the non-reservation impl gets picked.XS + assert_eq!(0u32.foo(0u64), mem::size_of::<u64>()); +} |
