about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2024-09-18 21:31:48 -0400
committerMichael Goulet <michael@errs.io>2025-02-13 05:45:53 +0000
commit2189908170f86809b7de5275dcde0cf828c16b37 (patch)
treec94c1d92fc542dae97ff3fe201807e1a7a36e935
parent18a3cc5c2c8b6cf3ff2e3313e5add69c7c6ff7ea (diff)
downloadrust-2189908170f86809b7de5275dcde0cf828c16b37.tar.gz
rust-2189908170f86809b7de5275dcde0cf828c16b37.zip
Add more tests
-rw-r--r--tests/ui/methods/supertrait-shadowing/assoc-const.rs23
-rw-r--r--tests/ui/methods/supertrait-shadowing/assoc-const.run.stdout1
-rw-r--r--tests/ui/methods/supertrait-shadowing/false-subtrait-after-inference.rs24
-rw-r--r--tests/ui/methods/supertrait-shadowing/false-subtrait-after-inference.stderr42
-rw-r--r--tests/ui/methods/supertrait-shadowing/out-of-scope.rs25
-rw-r--r--tests/ui/methods/supertrait-shadowing/out-of-scope.run.stdout1
-rw-r--r--tests/ui/methods/supertrait-shadowing/trivially-false-subtrait.rs26
-rw-r--r--tests/ui/methods/supertrait-shadowing/type-dependent.rs29
-rw-r--r--tests/ui/methods/supertrait-shadowing/type-dependent.run.stdout1
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