about summary refs log tree commit diff
path: root/src/test/ui/compare-method
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2016-10-19 17:17:35 -0400
committerNiko Matsakis <niko@alum.mit.edu>2016-11-01 14:08:56 -0400
commitfa9ebfc74e28ea2efb0508b3e2c73cc27ce3b65f (patch)
tree5cad23880e95e198a8dcaeb84e303e43f7e9b22f /src/test/ui/compare-method
parent222349931eec0b0b68b31b2b8b01e162cee23b85 (diff)
downloadrust-fa9ebfc74e28ea2efb0508b3e2c73cc27ce3b65f.tar.gz
rust-fa9ebfc74e28ea2efb0508b3e2c73cc27ce3b65f.zip
move compile-fail tests to ui tests
gets more comprehensive coverage in `ui`
Diffstat (limited to 'src/test/ui/compare-method')
-rw-r--r--src/test/ui/compare-method/proj-outlives-region.stderr2
-rw-r--r--src/test/ui/compare-method/region-extra-2.rs25
-rw-r--r--src/test/ui/compare-method/region-extra-2.stderr11
-rw-r--r--src/test/ui/compare-method/region-extra.rs (renamed from src/test/ui/compare-method/region.rs)5
-rw-r--r--src/test/ui/compare-method/region-extra.stderr (renamed from src/test/ui/compare-method/region.stderr)4
-rw-r--r--src/test/ui/compare-method/region-extra.stdout (renamed from src/test/ui/compare-method/region.stdout)0
-rw-r--r--src/test/ui/compare-method/region-unrelated.stderr2
-rw-r--r--src/test/ui/compare-method/reordered-type-param.rs29
-rw-r--r--src/test/ui/compare-method/reordered-type-param.stderr14
-rw-r--r--src/test/ui/compare-method/trait-bound-on-type-parameter.rs28
-rw-r--r--src/test/ui/compare-method/trait-bound-on-type-parameter.stderr11
-rw-r--r--src/test/ui/compare-method/traits-misc-mismatch-1.rs80
-rw-r--r--src/test/ui/compare-method/traits-misc-mismatch-1.stderr65
-rw-r--r--src/test/ui/compare-method/traits-misc-mismatch-2.rs33
-rw-r--r--src/test/ui/compare-method/traits-misc-mismatch-2.stderr11
15 files changed, 313 insertions, 7 deletions
diff --git a/src/test/ui/compare-method/proj-outlives-region.stderr b/src/test/ui/compare-method/proj-outlives-region.stderr
index f5907c0ae59..79293e0deed 100644
--- a/src/test/ui/compare-method/proj-outlives-region.stderr
+++ b/src/test/ui/compare-method/proj-outlives-region.stderr
@@ -8,7 +8,7 @@ error[E0276]: impl has stricter requirements than trait
    |     ^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `U: 'a`
    |
    = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
-   = note: for more information, see issue #18937 <https://github.com/rust-lang/rust/issues/18937>
+   = note: for more information, see issue #37166 <https://github.com/rust-lang/rust/issues/37166>
 note: lint level defined here
   --> $DIR/proj-outlives-region.rs:12:9
    |
diff --git a/src/test/ui/compare-method/region-extra-2.rs b/src/test/ui/compare-method/region-extra-2.rs
new file mode 100644
index 00000000000..b0cd3b8fdd2
--- /dev/null
+++ b/src/test/ui/compare-method/region-extra-2.rs
@@ -0,0 +1,25 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Regression test for issue #22779. An extra where clause was
+// permitted on the impl that is not present on the trait.
+
+trait Tr<'a, T> {
+    fn renew<'b: 'a>(self) -> &'b mut [T];
+}
+
+impl<'a, T> Tr<'a, T> for &'a mut [T] {
+    fn renew<'b: 'a>(self) -> &'b mut [T] where 'a: 'b {
+        //~^ ERROR E0276
+        &mut self[..]
+    }
+}
+
+fn main() { }
diff --git a/src/test/ui/compare-method/region-extra-2.stderr b/src/test/ui/compare-method/region-extra-2.stderr
new file mode 100644
index 00000000000..54a551bcfed
--- /dev/null
+++ b/src/test/ui/compare-method/region-extra-2.stderr
@@ -0,0 +1,11 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/region-extra-2.rs:19:5
+   |
+15 |     fn renew<'b: 'a>(self) -> &'b mut [T];
+   |     -------------------------------------- definition of `renew` from trait
+...
+19 |     fn renew<'b: 'a>(self) -> &'b mut [T] where 'a: 'b {
+   |     ^ impl has extra requirement `'a: 'b`
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/compare-method/region.rs b/src/test/ui/compare-method/region-extra.rs
index ef6a642143c..d61d0250211 100644
--- a/src/test/ui/compare-method/region.rs
+++ b/src/test/ui/compare-method/region-extra.rs
@@ -11,16 +11,15 @@
 #![allow(dead_code)]
 #![deny(extra_requirement_in_impl)]
 
-// Test that we elaborate `Type: 'region` constraints and infer various important things.
+// Test that you cannot add an extra where clause in the impl relating
+// two regions.
 
 trait Master<'a, 'b> {
     fn foo();
 }
 
-// `U: 'a` does not imply `V: 'a`
 impl<'a, 'b> Master<'a, 'b> for () {
     fn foo() where 'a: 'b { }
-    //~^ ERROR parameter type `V` may not live long enough
 }
 
 fn main() {
diff --git a/src/test/ui/compare-method/region.stderr b/src/test/ui/compare-method/region-extra.stderr
index d5805981348..e657813221a 100644
--- a/src/test/ui/compare-method/region.stderr
+++ b/src/test/ui/compare-method/region-extra.stderr
@@ -1,7 +1,7 @@
 error[E0276]: impl has stricter requirements than trait
-  --> $DIR/region.rs:22:5
+  --> $DIR/region-extra.rs:22:5
    |
-17 |     fn foo();
+18 |     fn foo();
    |     --------- definition of `foo` from trait
 ...
 22 |     fn foo() where 'a: 'b { }
diff --git a/src/test/ui/compare-method/region.stdout b/src/test/ui/compare-method/region-extra.stdout
index e69de29bb2d..e69de29bb2d 100644
--- a/src/test/ui/compare-method/region.stdout
+++ b/src/test/ui/compare-method/region-extra.stdout
diff --git a/src/test/ui/compare-method/region-unrelated.stderr b/src/test/ui/compare-method/region-unrelated.stderr
index b8084c4a2f3..b7cfdf799bc 100644
--- a/src/test/ui/compare-method/region-unrelated.stderr
+++ b/src/test/ui/compare-method/region-unrelated.stderr
@@ -8,7 +8,7 @@ error[E0276]: impl has stricter requirements than trait
    |     ^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `V: 'a`
    |
    = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
-   = note: for more information, see issue #18937 <https://github.com/rust-lang/rust/issues/18937>
+   = note: for more information, see issue #37166 <https://github.com/rust-lang/rust/issues/37166>
 note: lint level defined here
   --> $DIR/region-unrelated.rs:12:9
    |
diff --git a/src/test/ui/compare-method/reordered-type-param.rs b/src/test/ui/compare-method/reordered-type-param.rs
new file mode 100644
index 00000000000..0b844d4521d
--- /dev/null
+++ b/src/test/ui/compare-method/reordered-type-param.rs
@@ -0,0 +1,29 @@
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Tests that ty params get matched correctly when comparing
+// an impl against a trait
+//
+// cc #26111
+
+trait A {
+  fn b<C:Clone,D>(&self, x: C) -> C;
+}
+
+struct E {
+ f: isize
+}
+
+impl A for E {
+  // n.b. The error message is awful -- see #3404
+  fn b<F:Clone,G>(&self, _x: G) -> G { panic!() } //~ ERROR method `b` has an incompatible type
+}
+
+fn main() {}
diff --git a/src/test/ui/compare-method/reordered-type-param.stderr b/src/test/ui/compare-method/reordered-type-param.stderr
new file mode 100644
index 00000000000..985b85cc4ec
--- /dev/null
+++ b/src/test/ui/compare-method/reordered-type-param.stderr
@@ -0,0 +1,14 @@
+error[E0053]: method `b` has an incompatible type for trait
+  --> $DIR/reordered-type-param.rs:26:30
+   |
+17 |   fn b<C:Clone,D>(&self, x: C) -> C;
+   |                             - type in trait
+...
+26 |   fn b<F:Clone,G>(&self, _x: G) -> G { panic!() } //~ ERROR method `b` has an incompatible type
+   |                              ^ expected type parameter, found a different type parameter
+   |
+   = note: expected type `fn(&E, F) -> F`
+   = note:    found type `fn(&E, G) -> G`
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/compare-method/trait-bound-on-type-parameter.rs b/src/test/ui/compare-method/trait-bound-on-type-parameter.rs
new file mode 100644
index 00000000000..09e9fb4ca2b
--- /dev/null
+++ b/src/test/ui/compare-method/trait-bound-on-type-parameter.rs
@@ -0,0 +1,28 @@
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Tests that impl can't add extra `F: Sync` bound aren't *more* restrictive
+// than the trait method it's implementing.
+//
+// Regr test for #26111.
+
+trait A {
+  fn b<C,D>(&self, x: C) -> C;
+}
+
+struct E {
+ f: isize
+}
+
+impl A for E {
+    fn b<F: Sync, G>(&self, _x: F) -> F { panic!() } //~ ERROR E0276
+}
+
+fn main() {}
diff --git a/src/test/ui/compare-method/trait-bound-on-type-parameter.stderr b/src/test/ui/compare-method/trait-bound-on-type-parameter.stderr
new file mode 100644
index 00000000000..7112a00c7b7
--- /dev/null
+++ b/src/test/ui/compare-method/trait-bound-on-type-parameter.stderr
@@ -0,0 +1,11 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/trait-bound-on-type-parameter.rs:25:5
+   |
+17 |   fn b<C,D>(&self, x: C) -> C;
+   |   ---------------------------- definition of `b` from trait
+...
+25 |     fn b<F: Sync, G>(&self, _x: F) -> F { panic!() } //~ ERROR E0276
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `F: std::marker::Sync`
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/compare-method/traits-misc-mismatch-1.rs b/src/test/ui/compare-method/traits-misc-mismatch-1.rs
new file mode 100644
index 00000000000..cca282a1d19
--- /dev/null
+++ b/src/test/ui/compare-method/traits-misc-mismatch-1.rs
@@ -0,0 +1,80 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+//
+// Make sure rustc checks the type parameter bounds in implementations of traits,
+// see #2687
+
+use std::marker;
+
+trait A { }
+
+trait B: A {}
+
+trait C: A {}
+
+trait Foo {
+    fn test_error1_fn<T: Eq>(&self);
+    fn test_error2_fn<T: Eq + Ord>(&self);
+    fn test_error3_fn<T: Eq + Ord>(&self);
+    fn test3_fn<T: Eq + Ord>(&self);
+    fn test4_fn<T: Eq + Ord>(&self);
+    fn test_error5_fn<T: A>(&self);
+    fn test6_fn<T: A + Eq>(&self);
+    fn test_error7_fn<T: A>(&self);
+    fn test_error8_fn<T: B>(&self);
+}
+
+impl Foo for isize {
+    // invalid bound for T, was defined as Eq in trait
+    fn test_error1_fn<T: Ord>(&self) {}
+    //~^ ERROR E0276
+
+    // invalid bound for T, was defined as Eq + Ord in trait
+    fn test_error2_fn<T: Eq + B>(&self) {}
+    //~^ ERROR E0276
+
+    // invalid bound for T, was defined as Eq + Ord in trait
+    fn test_error3_fn<T: B + Eq>(&self) {}
+    //~^ ERROR E0276
+
+    // multiple bounds, same order as in trait
+    fn test3_fn<T: Ord + Eq>(&self) {}
+
+    // multiple bounds, different order as in trait
+    fn test4_fn<T: Eq + Ord>(&self) {}
+
+    // parameters in impls must be equal or more general than in the defining trait
+    fn test_error5_fn<T: B>(&self) {}
+    //~^ ERROR E0276
+
+    // bound `std::cmp::Eq` not enforced by this implementation, but this is OK
+    fn test6_fn<T: A>(&self) {}
+
+    fn test_error7_fn<T: A + Eq>(&self) {}
+    //~^ ERROR E0276
+
+    fn test_error8_fn<T: C>(&self) {}
+    //~^ ERROR E0276
+}
+
+trait Getter<T> {
+    fn get(&self) -> T { loop { } }
+}
+
+trait Trait {
+    fn method<G:Getter<isize>>(&self);
+}
+
+impl Trait for usize {
+    fn method<G: Getter<usize>>(&self) {}
+    //~^ ERROR E0276
+}
+
+fn main() {}
diff --git a/src/test/ui/compare-method/traits-misc-mismatch-1.stderr b/src/test/ui/compare-method/traits-misc-mismatch-1.stderr
new file mode 100644
index 00000000000..f221ebe3302
--- /dev/null
+++ b/src/test/ui/compare-method/traits-misc-mismatch-1.stderr
@@ -0,0 +1,65 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:36:5
+   |
+23 |     fn test_error1_fn<T: Eq>(&self);
+   |     -------------------------------- definition of `test_error1_fn` from trait
+...
+36 |     fn test_error1_fn<T: Ord>(&self) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `T: std::cmp::Ord`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:40:5
+   |
+24 |     fn test_error2_fn<T: Eq + Ord>(&self);
+   |     -------------------------------------- definition of `test_error2_fn` from trait
+...
+40 |     fn test_error2_fn<T: Eq + B>(&self) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `T: B`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:44:5
+   |
+25 |     fn test_error3_fn<T: Eq + Ord>(&self);
+   |     -------------------------------------- definition of `test_error3_fn` from trait
+...
+44 |     fn test_error3_fn<T: B + Eq>(&self) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `T: B`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:54:5
+   |
+28 |     fn test_error5_fn<T: A>(&self);
+   |     ------------------------------- definition of `test_error5_fn` from trait
+...
+54 |     fn test_error5_fn<T: B>(&self) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `T: B`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:60:5
+   |
+30 |     fn test_error7_fn<T: A>(&self);
+   |     ------------------------------- definition of `test_error7_fn` from trait
+...
+60 |     fn test_error7_fn<T: A + Eq>(&self) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `T: std::cmp::Eq`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:63:5
+   |
+31 |     fn test_error8_fn<T: B>(&self);
+   |     ------------------------------- definition of `test_error8_fn` from trait
+...
+63 |     fn test_error8_fn<T: C>(&self) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `T: C`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:76:5
+   |
+72 |     fn method<G:Getter<isize>>(&self);
+   |     ---------------------------------- definition of `method` from trait
+...
+76 |     fn method<G: Getter<usize>>(&self) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `G: Getter<usize>`
+
+error: aborting due to 7 previous errors
+
diff --git a/src/test/ui/compare-method/traits-misc-mismatch-2.rs b/src/test/ui/compare-method/traits-misc-mismatch-2.rs
new file mode 100644
index 00000000000..e82cf256df1
--- /dev/null
+++ b/src/test/ui/compare-method/traits-misc-mismatch-2.rs
@@ -0,0 +1,33 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Issue #5886: a complex instance of issue #2687.
+
+trait Iterator<A> {
+    fn next(&mut self) -> Option<A>;
+}
+
+trait IteratorUtil<A>: Sized
+{
+    fn zip<B, U: Iterator<U>>(self, other: U) -> ZipIterator<Self, U>;
+}
+
+impl<A, T: Iterator<A>> IteratorUtil<A> for T {
+    fn zip<B, U: Iterator<B>>(self, other: U) -> ZipIterator<T, U> {
+    //~^ ERROR E0276
+        ZipIterator{a: self, b: other}
+    }
+}
+
+struct ZipIterator<T, U> {
+    a: T, b: U
+}
+
+fn main() {}
diff --git a/src/test/ui/compare-method/traits-misc-mismatch-2.stderr b/src/test/ui/compare-method/traits-misc-mismatch-2.stderr
new file mode 100644
index 00000000000..5003550fd1e
--- /dev/null
+++ b/src/test/ui/compare-method/traits-misc-mismatch-2.stderr
@@ -0,0 +1,11 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-2.rs:23:5
+   |
+19 |     fn zip<B, U: Iterator<U>>(self, other: U) -> ZipIterator<Self, U>;
+   |     ------------------------------------------------------------------ definition of `zip` from trait
+...
+23 |     fn zip<B, U: Iterator<B>>(self, other: U) -> ZipIterator<T, U> {
+   |     ^ impl has extra requirement `U: Iterator<B>`
+
+error: aborting due to previous error
+