Add more tests
This commit is contained in:
parent
18a3cc5c2c
commit
2189908170
9 changed files with 172 additions and 0 deletions
23
tests/ui/methods/supertrait-shadowing/assoc-const.rs
Normal file
23
tests/ui/methods/supertrait-shadowing/assoc-const.rs
Normal file
|
@ -0,0 +1,23 @@
|
|||
//@ run-pass
|
||||
//@ check-run-results
|
||||
|
||||
#![feature(supertrait_item_shadowing)]
|
||||
#![allow(dead_code)]
|
||||
|
||||
trait A {
|
||||
const CONST: i32;
|
||||
}
|
||||
impl<T> A for T {
|
||||
const CONST: i32 = 1;
|
||||
}
|
||||
|
||||
trait B: A {
|
||||
const CONST: i32;
|
||||
}
|
||||
impl<T> B for T {
|
||||
const CONST: i32 = 2;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("{}", i32::CONST);
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
2
|
|
@ -0,0 +1,24 @@
|
|||
#![feature(supertrait_item_shadowing)]
|
||||
#![warn(supertrait_item_shadowing_usage)]
|
||||
|
||||
struct W<T>(T);
|
||||
|
||||
trait Upstream {
|
||||
fn hello(&self) {}
|
||||
}
|
||||
impl<T> Upstream for T {}
|
||||
|
||||
trait Downstream: Upstream {
|
||||
fn hello(&self) {}
|
||||
}
|
||||
impl<T> Downstream for W<T> where T: Foo {}
|
||||
|
||||
trait Foo {}
|
||||
|
||||
fn main() {
|
||||
let x = W(Default::default());
|
||||
x.hello();
|
||||
//~^ ERROR the trait bound `i32: Foo` is not satisfied
|
||||
//~| WARN trait item `hello` from `Downstream` shadows identically named item from supertrait
|
||||
let _: i32 = x.0;
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
warning: trait item `hello` from `Downstream` shadows identically named item from supertrait
|
||||
--> $DIR/false-subtrait-after-inference.rs:20:7
|
||||
|
|
||||
LL | x.hello();
|
||||
| ^^^^^
|
||||
|
|
||||
note: item from `Downstream` shadows a supertrait item
|
||||
--> $DIR/false-subtrait-after-inference.rs:12:5
|
||||
|
|
||||
LL | fn hello(&self) {}
|
||||
| ^^^^^^^^^^^^^^^
|
||||
note: item from `Upstream` is shadowed by a subtrait item
|
||||
--> $DIR/false-subtrait-after-inference.rs:7:5
|
||||
|
|
||||
LL | fn hello(&self) {}
|
||||
| ^^^^^^^^^^^^^^^
|
||||
note: the lint level is defined here
|
||||
--> $DIR/false-subtrait-after-inference.rs:2:9
|
||||
|
|
||||
LL | #![warn(supertrait_item_shadowing_usage)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0277]: the trait bound `i32: Foo` is not satisfied
|
||||
--> $DIR/false-subtrait-after-inference.rs:20:7
|
||||
|
|
||||
LL | x.hello();
|
||||
| ^^^^^ the trait `Foo` is not implemented for `i32`
|
||||
|
|
||||
help: this trait has no implementations, consider adding one
|
||||
--> $DIR/false-subtrait-after-inference.rs:16:1
|
||||
|
|
||||
LL | trait Foo {}
|
||||
| ^^^^^^^^^
|
||||
note: required for `W<i32>` to implement `Downstream`
|
||||
--> $DIR/false-subtrait-after-inference.rs:14:9
|
||||
|
|
||||
LL | impl<T> Downstream for W<T> where T: Foo {}
|
||||
| ^^^^^^^^^^ ^^^^ --- unsatisfied trait bound introduced here
|
||||
|
||||
error: aborting due to 1 previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
25
tests/ui/methods/supertrait-shadowing/out-of-scope.rs
Normal file
25
tests/ui/methods/supertrait-shadowing/out-of-scope.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
//@ run-pass
|
||||
//@ check-run-results
|
||||
|
||||
#![feature(supertrait_item_shadowing)]
|
||||
#![allow(dead_code)]
|
||||
|
||||
mod out_of_scope {
|
||||
pub trait Subtrait: super::Supertrait {
|
||||
fn hello(&self) {
|
||||
println!("subtrait");
|
||||
}
|
||||
}
|
||||
impl<T> Subtrait for T {}
|
||||
}
|
||||
|
||||
trait Supertrait {
|
||||
fn hello(&self) {
|
||||
println!("supertrait");
|
||||
}
|
||||
}
|
||||
impl<T> Supertrait for T {}
|
||||
|
||||
fn main() {
|
||||
().hello();
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
supertrait
|
|
@ -0,0 +1,26 @@
|
|||
//@ check-pass
|
||||
|
||||
// Make sure we don't prefer a subtrait that we would've otherwise eliminated
|
||||
// in `consider_probe` during method probing.
|
||||
|
||||
#![feature(supertrait_item_shadowing)]
|
||||
#![allow(dead_code)]
|
||||
|
||||
struct W<T>(T);
|
||||
|
||||
trait Upstream {
|
||||
fn hello(&self) {}
|
||||
}
|
||||
impl<T> Upstream for T {}
|
||||
|
||||
trait Downstream: Upstream {
|
||||
fn hello(&self) {}
|
||||
}
|
||||
impl<T> Downstream for W<T> where T: Foo {}
|
||||
|
||||
trait Foo {}
|
||||
|
||||
fn main() {
|
||||
let x = W(1i32);
|
||||
x.hello();
|
||||
}
|
29
tests/ui/methods/supertrait-shadowing/type-dependent.rs
Normal file
29
tests/ui/methods/supertrait-shadowing/type-dependent.rs
Normal file
|
@ -0,0 +1,29 @@
|
|||
//@ run-pass
|
||||
//@ check-run-results
|
||||
|
||||
// Makes sure we can shadow with type-dependent method syntax.
|
||||
|
||||
#![feature(supertrait_item_shadowing)]
|
||||
#![allow(dead_code)]
|
||||
|
||||
trait A {
|
||||
fn hello() {
|
||||
println!("A");
|
||||
}
|
||||
}
|
||||
impl<T> A for T {}
|
||||
|
||||
trait B: A {
|
||||
fn hello() {
|
||||
println!("B");
|
||||
}
|
||||
}
|
||||
impl<T> B for T {}
|
||||
|
||||
fn foo<T>() {
|
||||
T::hello();
|
||||
}
|
||||
|
||||
fn main() {
|
||||
foo::<()>();
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
B
|
Loading…
Add table
Add a link
Reference in a new issue