diff options
| author | Michael Goulet <michael@errs.io> | 2024-09-18 21:31:48 -0400 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2025-02-13 05:45:53 +0000 |
| commit | 2189908170f86809b7de5275dcde0cf828c16b37 (patch) | |
| tree | c94c1d92fc542dae97ff3fe201807e1a7a36e935 | |
| parent | 18a3cc5c2c8b6cf3ff2e3313e5add69c7c6ff7ea (diff) | |
| download | rust-2189908170f86809b7de5275dcde0cf828c16b37.tar.gz rust-2189908170f86809b7de5275dcde0cf828c16b37.zip | |
Add more tests
9 files changed, 172 insertions, 0 deletions
diff --git a/tests/ui/methods/supertrait-shadowing/assoc-const.rs b/tests/ui/methods/supertrait-shadowing/assoc-const.rs new file mode 100644 index 00000000000..a542ce7d326 --- /dev/null +++ b/tests/ui/methods/supertrait-shadowing/assoc-const.rs @@ -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); +} diff --git a/tests/ui/methods/supertrait-shadowing/assoc-const.run.stdout b/tests/ui/methods/supertrait-shadowing/assoc-const.run.stdout new file mode 100644 index 00000000000..0cfbf08886f --- /dev/null +++ b/tests/ui/methods/supertrait-shadowing/assoc-const.run.stdout @@ -0,0 +1 @@ +2 diff --git a/tests/ui/methods/supertrait-shadowing/false-subtrait-after-inference.rs b/tests/ui/methods/supertrait-shadowing/false-subtrait-after-inference.rs new file mode 100644 index 00000000000..7cafb0c7ebd --- /dev/null +++ b/tests/ui/methods/supertrait-shadowing/false-subtrait-after-inference.rs @@ -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; +} diff --git a/tests/ui/methods/supertrait-shadowing/false-subtrait-after-inference.stderr b/tests/ui/methods/supertrait-shadowing/false-subtrait-after-inference.stderr new file mode 100644 index 00000000000..c0555b95f3c --- /dev/null +++ b/tests/ui/methods/supertrait-shadowing/false-subtrait-after-inference.stderr @@ -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`. diff --git a/tests/ui/methods/supertrait-shadowing/out-of-scope.rs b/tests/ui/methods/supertrait-shadowing/out-of-scope.rs new file mode 100644 index 00000000000..bd263be59cc --- /dev/null +++ b/tests/ui/methods/supertrait-shadowing/out-of-scope.rs @@ -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(); +} diff --git a/tests/ui/methods/supertrait-shadowing/out-of-scope.run.stdout b/tests/ui/methods/supertrait-shadowing/out-of-scope.run.stdout new file mode 100644 index 00000000000..1019e5f3543 --- /dev/null +++ b/tests/ui/methods/supertrait-shadowing/out-of-scope.run.stdout @@ -0,0 +1 @@ +supertrait diff --git a/tests/ui/methods/supertrait-shadowing/trivially-false-subtrait.rs b/tests/ui/methods/supertrait-shadowing/trivially-false-subtrait.rs new file mode 100644 index 00000000000..e44c7c18083 --- /dev/null +++ b/tests/ui/methods/supertrait-shadowing/trivially-false-subtrait.rs @@ -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(); +} diff --git a/tests/ui/methods/supertrait-shadowing/type-dependent.rs b/tests/ui/methods/supertrait-shadowing/type-dependent.rs new file mode 100644 index 00000000000..3af884fd52d --- /dev/null +++ b/tests/ui/methods/supertrait-shadowing/type-dependent.rs @@ -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::<()>(); +} diff --git a/tests/ui/methods/supertrait-shadowing/type-dependent.run.stdout b/tests/ui/methods/supertrait-shadowing/type-dependent.run.stdout new file mode 100644 index 00000000000..223b7836fb1 --- /dev/null +++ b/tests/ui/methods/supertrait-shadowing/type-dependent.run.stdout @@ -0,0 +1 @@ +B |
