diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2016-10-19 17:17:35 -0400 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2016-11-01 14:08:56 -0400 |
| commit | fa9ebfc74e28ea2efb0508b3e2c73cc27ce3b65f (patch) | |
| tree | 5cad23880e95e198a8dcaeb84e303e43f7e9b22f /src/test/ui/compare-method | |
| parent | 222349931eec0b0b68b31b2b8b01e162cee23b85 (diff) | |
| download | rust-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')
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 + |
