about summary refs log tree commit diff
path: root/tests/ui/self
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2025-02-04 04:22:50 +0000
committerMichael Goulet <michael@errs.io>2025-02-04 04:23:04 +0000
commitaa884da1e7e1f7d08a3c66ca25a824a907f43258 (patch)
treee38c7c8bddacf1519a33144c42179792668c24af /tests/ui/self
parentf2c4ccd852f68fb36dedc033239cb7c0fb1921ef (diff)
downloadrust-aa884da1e7e1f7d08a3c66ca25a824a907f43258.tar.gz
rust-aa884da1e7e1f7d08a3c66ca25a824a907f43258.zip
Delay bug when method confirmation cannot upcast object pick of self
Diffstat (limited to 'tests/ui/self')
-rw-r--r--tests/ui/self/invalid-self-dyn-receiver.rs20
-rw-r--r--tests/ui/self/invalid-self-dyn-receiver.stderr12
2 files changed, 32 insertions, 0 deletions
diff --git a/tests/ui/self/invalid-self-dyn-receiver.rs b/tests/ui/self/invalid-self-dyn-receiver.rs
new file mode 100644
index 00000000000..a989b331b5e
--- /dev/null
+++ b/tests/ui/self/invalid-self-dyn-receiver.rs
@@ -0,0 +1,20 @@
+// Makes sure we don't ICE when encountering a receiver that is *ostensibly* dyn safe,
+// because it satisfies `&dyn Bar: DispatchFromDyn<&dyn Bar>`, but is not a valid receiver
+// in wfcheck.
+
+#![feature(arbitrary_self_types)]
+
+use std::ops::Deref;
+
+trait Foo: Deref<Target = dyn Bar> {
+     fn method(self: &dyn Bar) {}
+     //~^ ERROR invalid `self` parameter type: `&dyn Bar`
+}
+
+trait Bar {}
+
+fn test(x: &dyn Foo) {
+     x.method();
+}
+
+fn main() {}
diff --git a/tests/ui/self/invalid-self-dyn-receiver.stderr b/tests/ui/self/invalid-self-dyn-receiver.stderr
new file mode 100644
index 00000000000..f77f5686ad2
--- /dev/null
+++ b/tests/ui/self/invalid-self-dyn-receiver.stderr
@@ -0,0 +1,12 @@
+error[E0307]: invalid `self` parameter type: `&dyn Bar`
+  --> $DIR/invalid-self-dyn-receiver.rs:10:22
+   |
+LL |      fn method(self: &dyn Bar) {}
+   |                      ^^^^^^^^
+   |
+   = note: type of `self` must be `Self` or some type implementing `Receiver`
+   = help: consider changing to `self`, `&self`, `&mut self`, or a type implementing `Receiver` such as `self: Box<Self>`, `self: Rc<Self>`, or `self: Arc<Self>`
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0307`.