move compile-fail tests to ui tests
gets more comprehensive coverage in `ui`
This commit is contained in:
parent
222349931e
commit
fa9ebfc74e
15 changed files with 125 additions and 11 deletions
|
|
@ -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
|
||||
|
|
||||
|
|
|
|||
25
src/test/ui/compare-method/region-extra-2.rs
Normal file
25
src/test/ui/compare-method/region-extra-2.rs
Normal file
|
|
@ -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() { }
|
||||
11
src/test/ui/compare-method/region-extra-2.stderr
Normal file
11
src/test/ui/compare-method/region-extra-2.stderr
Normal file
|
|
@ -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
|
||||
|
||||
|
|
@ -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() {
|
||||
|
|
@ -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 { }
|
||||
|
|
@ -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
|
||||
|
|
||||
|
|
|
|||
29
src/test/ui/compare-method/reordered-type-param.rs
Normal file
29
src/test/ui/compare-method/reordered-type-param.rs
Normal file
|
|
@ -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() {}
|
||||
14
src/test/ui/compare-method/reordered-type-param.stderr
Normal file
14
src/test/ui/compare-method/reordered-type-param.stderr
Normal file
|
|
@ -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
|
||||
|
||||
28
src/test/ui/compare-method/trait-bound-on-type-parameter.rs
Normal file
28
src/test/ui/compare-method/trait-bound-on-type-parameter.rs
Normal file
|
|
@ -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() {}
|
||||
|
|
@ -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
|
||||
|
||||
80
src/test/ui/compare-method/traits-misc-mismatch-1.rs
Normal file
80
src/test/ui/compare-method/traits-misc-mismatch-1.rs
Normal file
|
|
@ -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() {}
|
||||
65
src/test/ui/compare-method/traits-misc-mismatch-1.stderr
Normal file
65
src/test/ui/compare-method/traits-misc-mismatch-1.stderr
Normal file
|
|
@ -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
|
||||
|
||||
33
src/test/ui/compare-method/traits-misc-mismatch-2.rs
Normal file
33
src/test/ui/compare-method/traits-misc-mismatch-2.rs
Normal file
|
|
@ -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() {}
|
||||
11
src/test/ui/compare-method/traits-misc-mismatch-2.stderr
Normal file
11
src/test/ui/compare-method/traits-misc-mismatch-2.stderr
Normal file
|
|
@ -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
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue