summaryrefslogtreecommitdiffstats
path: root/tests/ui/self
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:35 +0000
commitd1b2d29528b7794b41e66fc2136e395a02f8529b (patch)
treea4a17504b260206dec3cf55b2dca82929a348ac2 /tests/ui/self
parentReleasing progress-linux version 1.72.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-d1b2d29528b7794b41e66fc2136e395a02f8529b.tar.xz
rustc-d1b2d29528b7794b41e66fc2136e395a02f8529b.zip
Merging upstream version 1.73.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/self')
-rw-r--r--tests/ui/self/arbitrary_self_type_mut_difference.rs13
-rw-r--r--tests/ui/self/arbitrary_self_type_mut_difference.stderr27
-rw-r--r--tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.fixed17
-rw-r--r--tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.rs17
-rw-r--r--tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.stderr43
-rw-r--r--tests/ui/self/arbitrary_self_types_needing_mut_pin.fixed12
-rw-r--r--tests/ui/self/arbitrary_self_types_needing_mut_pin.rs12
-rw-r--r--tests/ui/self/arbitrary_self_types_needing_mut_pin.stderr20
-rw-r--r--tests/ui/self/arbitrary_self_types_pin_needing_borrow.rs13
-rw-r--r--tests/ui/self/arbitrary_self_types_pin_needing_borrow.stderr33
10 files changed, 207 insertions, 0 deletions
diff --git a/tests/ui/self/arbitrary_self_type_mut_difference.rs b/tests/ui/self/arbitrary_self_type_mut_difference.rs
new file mode 100644
index 000000000..e75c00ae9
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_type_mut_difference.rs
@@ -0,0 +1,13 @@
+// Related to #57994.
+use std::pin::Pin;
+struct S;
+
+impl S {
+ fn x(self: Pin<&mut Self>) {} //~ NOTE method is available for `Pin<&mut S>`
+ fn y(self: Pin<&Self>) {} //~ NOTE method is available for `Pin<&S>`
+}
+
+fn main() {
+ Pin::new(&S).x(); //~ ERROR no method named `x` found for struct `Pin<&S>` in the current scope
+ Pin::new(&mut S).y(); //~ ERROR no method named `y` found for struct `Pin<&mut S>` in the current scope
+}
diff --git a/tests/ui/self/arbitrary_self_type_mut_difference.stderr b/tests/ui/self/arbitrary_self_type_mut_difference.stderr
new file mode 100644
index 000000000..a56d58694
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_type_mut_difference.stderr
@@ -0,0 +1,27 @@
+error[E0599]: no method named `x` found for struct `Pin<&S>` in the current scope
+ --> $DIR/arbitrary_self_type_mut_difference.rs:11:18
+ |
+LL | Pin::new(&S).x();
+ | ^ help: there is a method with a similar name: `y`
+ |
+note: method is available for `Pin<&mut S>`
+ --> $DIR/arbitrary_self_type_mut_difference.rs:6:5
+ |
+LL | fn x(self: Pin<&mut Self>) {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0599]: no method named `y` found for struct `Pin<&mut S>` in the current scope
+ --> $DIR/arbitrary_self_type_mut_difference.rs:12:22
+ |
+LL | Pin::new(&mut S).y();
+ | ^ help: there is a method with a similar name: `x`
+ |
+note: method is available for `Pin<&S>`
+ --> $DIR/arbitrary_self_type_mut_difference.rs:7:5
+ |
+LL | fn y(self: Pin<&Self>) {}
+ | ^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.fixed b/tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.fixed
new file mode 100644
index 000000000..6a94b85b9
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.fixed
@@ -0,0 +1,17 @@
+// run-rustfix
+#![allow(dead_code)]
+mod first {
+ trait Foo { fn m(self: Box<Self>); }
+ fn foo<T: Foo>(a: T) {
+ Box::new(a).m(); //~ ERROR no method named `m` found
+ }
+}
+mod second {
+ use std::sync::Arc;
+ trait Bar { fn m(self: Arc<Self>); }
+ fn bar(b: impl Bar) {
+ Arc::new(b).m(); //~ ERROR no method named `m` found
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.rs b/tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.rs
new file mode 100644
index 000000000..fa480b1f7
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.rs
@@ -0,0 +1,17 @@
+// run-rustfix
+#![allow(dead_code)]
+mod first {
+ trait Foo { fn m(self: Box<Self>); }
+ fn foo<T: Foo>(a: T) {
+ a.m(); //~ ERROR no method named `m` found
+ }
+}
+mod second {
+ use std::sync::Arc;
+ trait Bar { fn m(self: Arc<Self>); }
+ fn bar(b: impl Bar) {
+ b.m(); //~ ERROR no method named `m` found
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.stderr b/tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.stderr
new file mode 100644
index 000000000..2ab634ad3
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_types_needing_box_or_arc_wrapping.stderr
@@ -0,0 +1,43 @@
+error[E0599]: no method named `m` found for type parameter `T` in the current scope
+ --> $DIR/arbitrary_self_types_needing_box_or_arc_wrapping.rs:6:11
+ |
+LL | trait Foo { fn m(self: Box<Self>); }
+ | - --------- the method might not be found because of this arbitrary self type
+ | |
+ | the method is available for `Box<T>` here
+LL | fn foo<T: Foo>(a: T) {
+ | - method `m` not found for this type parameter
+LL | a.m();
+ | ^ method not found in `T`
+...
+LL | trait Bar { fn m(self: Arc<Self>); }
+ | --------- the method might not be found because of this arbitrary self type
+ |
+help: consider wrapping the receiver expression with the appropriate type
+ |
+LL | Box::new(a).m();
+ | +++++++++ +
+
+error[E0599]: no method named `m` found for type parameter `impl Bar` in the current scope
+ --> $DIR/arbitrary_self_types_needing_box_or_arc_wrapping.rs:13:11
+ |
+LL | trait Foo { fn m(self: Box<Self>); }
+ | --------- the method might not be found because of this arbitrary self type
+...
+LL | trait Bar { fn m(self: Arc<Self>); }
+ | - --------- the method might not be found because of this arbitrary self type
+ | |
+ | the method is available for `Arc<impl Bar>` here
+LL | fn bar(b: impl Bar) {
+ | -------- method `m` not found for this type parameter
+LL | b.m();
+ | ^ method not found in `impl Bar`
+ |
+help: consider wrapping the receiver expression with the appropriate type
+ |
+LL | Arc::new(b).m();
+ | +++++++++ +
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/tests/ui/self/arbitrary_self_types_needing_mut_pin.fixed b/tests/ui/self/arbitrary_self_types_needing_mut_pin.fixed
new file mode 100644
index 000000000..ccd65ff40
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_types_needing_mut_pin.fixed
@@ -0,0 +1,12 @@
+// run-rustfix
+use std::pin::Pin;
+struct S;
+
+impl S {
+ fn x(self: Pin<&mut Self>) {
+ }
+}
+
+fn main() {
+ Pin::new(&mut S).x(); //~ ERROR no method named `x` found
+}
diff --git a/tests/ui/self/arbitrary_self_types_needing_mut_pin.rs b/tests/ui/self/arbitrary_self_types_needing_mut_pin.rs
new file mode 100644
index 000000000..d15676a62
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_types_needing_mut_pin.rs
@@ -0,0 +1,12 @@
+// run-rustfix
+use std::pin::Pin;
+struct S;
+
+impl S {
+ fn x(self: Pin<&mut Self>) {
+ }
+}
+
+fn main() {
+ S.x(); //~ ERROR no method named `x` found
+}
diff --git a/tests/ui/self/arbitrary_self_types_needing_mut_pin.stderr b/tests/ui/self/arbitrary_self_types_needing_mut_pin.stderr
new file mode 100644
index 000000000..f34ce4dce
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_types_needing_mut_pin.stderr
@@ -0,0 +1,20 @@
+error[E0599]: no method named `x` found for struct `S` in the current scope
+ --> $DIR/arbitrary_self_types_needing_mut_pin.rs:11:7
+ |
+LL | struct S;
+ | -------- method `x` not found for this struct
+...
+LL | fn x(self: Pin<&mut Self>) {
+ | - the method is available for `Pin<&mut S>` here
+...
+LL | S.x();
+ | ^ method not found in `S`
+ |
+help: consider wrapping the receiver expression with the appropriate type
+ |
+LL | Pin::new(&mut S).x();
+ | +++++++++++++ +
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/tests/ui/self/arbitrary_self_types_pin_needing_borrow.rs b/tests/ui/self/arbitrary_self_types_pin_needing_borrow.rs
new file mode 100644
index 000000000..d877dbe60
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_types_pin_needing_borrow.rs
@@ -0,0 +1,13 @@
+use std::pin::Pin;
+struct S;
+
+impl S {
+ fn x(self: Pin<&mut Self>) {
+ }
+}
+
+fn main() {
+ Pin::new(S).x();
+ //~^ ERROR the trait bound `S: Deref` is not satisfied
+ //~| ERROR no method named `x` found for struct `Pin` in the current scope
+}
diff --git a/tests/ui/self/arbitrary_self_types_pin_needing_borrow.stderr b/tests/ui/self/arbitrary_self_types_pin_needing_borrow.stderr
new file mode 100644
index 000000000..ec985b254
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_types_pin_needing_borrow.stderr
@@ -0,0 +1,33 @@
+error[E0277]: the trait bound `S: Deref` is not satisfied
+ --> $DIR/arbitrary_self_types_pin_needing_borrow.rs:10:14
+ |
+LL | Pin::new(S).x();
+ | -------- ^ the trait `Deref` is not implemented for `S`
+ | |
+ | required by a bound introduced by this call
+ |
+note: required by a bound in `Pin::<P>::new`
+ --> $SRC_DIR/core/src/pin.rs:LL:COL
+help: consider borrowing here
+ |
+LL | Pin::new(&S).x();
+ | +
+LL | Pin::new(&mut S).x();
+ | ++++
+
+error[E0599]: no method named `x` found for struct `Pin` in the current scope
+ --> $DIR/arbitrary_self_types_pin_needing_borrow.rs:10:17
+ |
+LL | Pin::new(S).x();
+ | ^ method not found in `Pin<S>`
+ |
+note: method is available for `Pin<&mut S>`
+ --> $DIR/arbitrary_self_types_pin_needing_borrow.rs:5:5
+ |
+LL | fn x(self: Pin<&mut Self>) {
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0277, E0599.
+For more information about an error, try `rustc --explain E0277`.