about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <ariel.byd@gmail.com>2019-07-13 22:52:57 +0300
committerAriel Ben-Yehuda <ariel.byd@gmail.com>2019-09-24 21:11:50 +0300
commit9a94ecde04306986dac1b7ca88b4b327b67ea499 (patch)
tree10135d2f21717552b9614ee4ca5337c05751f758
parent5d79e8c4c97388dd1201135b8d6cfadccfd3c8e3 (diff)
downloadrust-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.rs16
-rw-r--r--src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.stderr11
-rw-r--r--src/test/ui/traits/reservation-impls/reservation-impl-no-use.rs14
-rw-r--r--src/test/ui/traits/reservation-impls/reservation-impl-no-use.stderr15
-rw-r--r--src/test/ui/traits/reservation-impls/reservation-impl-ok.rs28
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>());
+}