summaryrefslogtreecommitdiffstats
path: root/tests/ui/traits/suggest-deferences
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:13 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:13 +0000
commit218caa410aa38c29984be31a5229b9fa717560ee (patch)
treec54bd55eeb6e4c508940a30e94c0032fbd45d677 /tests/ui/traits/suggest-deferences
parentReleasing progress-linux version 1.67.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-218caa410aa38c29984be31a5229b9fa717560ee.tar.xz
rustc-218caa410aa38c29984be31a5229b9fa717560ee.zip
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/traits/suggest-deferences')
-rw-r--r--tests/ui/traits/suggest-deferences/issue-39029.fixed18
-rw-r--r--tests/ui/traits/suggest-deferences/issue-39029.rs18
-rw-r--r--tests/ui/traits/suggest-deferences/issue-39029.stderr19
-rw-r--r--tests/ui/traits/suggest-deferences/issue-62530.fixed15
-rw-r--r--tests/ui/traits/suggest-deferences/issue-62530.rs15
-rw-r--r--tests/ui/traits/suggest-deferences/issue-62530.stderr21
-rw-r--r--tests/ui/traits/suggest-deferences/multiple-0.fixed36
-rw-r--r--tests/ui/traits/suggest-deferences/multiple-0.rs36
-rw-r--r--tests/ui/traits/suggest-deferences/multiple-0.stderr21
-rw-r--r--tests/ui/traits/suggest-deferences/multiple-1.rs54
-rw-r--r--tests/ui/traits/suggest-deferences/multiple-1.stderr18
-rw-r--r--tests/ui/traits/suggest-deferences/root-obligation.fixed13
-rw-r--r--tests/ui/traits/suggest-deferences/root-obligation.rs13
-rw-r--r--tests/ui/traits/suggest-deferences/root-obligation.stderr21
-rw-r--r--tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.fixed14
-rw-r--r--tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.rs14
-rw-r--r--tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.stderr15
17 files changed, 361 insertions, 0 deletions
diff --git a/tests/ui/traits/suggest-deferences/issue-39029.fixed b/tests/ui/traits/suggest-deferences/issue-39029.fixed
new file mode 100644
index 000000000..a1abf668b
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/issue-39029.fixed
@@ -0,0 +1,18 @@
+// run-rustfix
+use std::net::TcpListener;
+
+struct NoToSocketAddrs(String);
+
+impl std::ops::Deref for NoToSocketAddrs {
+ type Target = String;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+fn main() {
+ let _works = TcpListener::bind("some string");
+ let bad = NoToSocketAddrs("bad".to_owned());
+ let _errors = TcpListener::bind(&*bad);
+ //~^ ERROR the trait bound `NoToSocketAddrs: ToSocketAddrs` is not satisfied
+}
diff --git a/tests/ui/traits/suggest-deferences/issue-39029.rs b/tests/ui/traits/suggest-deferences/issue-39029.rs
new file mode 100644
index 000000000..90d097105
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/issue-39029.rs
@@ -0,0 +1,18 @@
+// run-rustfix
+use std::net::TcpListener;
+
+struct NoToSocketAddrs(String);
+
+impl std::ops::Deref for NoToSocketAddrs {
+ type Target = String;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+fn main() {
+ let _works = TcpListener::bind("some string");
+ let bad = NoToSocketAddrs("bad".to_owned());
+ let _errors = TcpListener::bind(&bad);
+ //~^ ERROR the trait bound `NoToSocketAddrs: ToSocketAddrs` is not satisfied
+}
diff --git a/tests/ui/traits/suggest-deferences/issue-39029.stderr b/tests/ui/traits/suggest-deferences/issue-39029.stderr
new file mode 100644
index 000000000..49e20c6a7
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/issue-39029.stderr
@@ -0,0 +1,19 @@
+error[E0277]: the trait bound `NoToSocketAddrs: ToSocketAddrs` is not satisfied
+ --> $DIR/issue-39029.rs:16:37
+ |
+LL | let _errors = TcpListener::bind(&bad);
+ | ----------------- ^^^^ the trait `ToSocketAddrs` is not implemented for `NoToSocketAddrs`
+ | |
+ | required by a bound introduced by this call
+ |
+ = note: required for `&NoToSocketAddrs` to implement `ToSocketAddrs`
+note: required by a bound in `TcpListener::bind`
+ --> $SRC_DIR/std/src/net/tcp.rs:LL:COL
+help: consider dereferencing here
+ |
+LL | let _errors = TcpListener::bind(&*bad);
+ | +
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/traits/suggest-deferences/issue-62530.fixed b/tests/ui/traits/suggest-deferences/issue-62530.fixed
new file mode 100644
index 000000000..406caaa00
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/issue-62530.fixed
@@ -0,0 +1,15 @@
+// run-rustfix
+fn takes_str(_x: &str) {}
+
+fn takes_type_parameter<T>(_x: T) where T: SomeTrait {}
+
+trait SomeTrait {}
+impl SomeTrait for &'_ str {}
+impl SomeTrait for char {}
+
+fn main() {
+ let string = String::new();
+ takes_str(&string); // Ok
+ takes_type_parameter(&*string); // Error
+ //~^ ERROR the trait bound `&String: SomeTrait` is not satisfied
+}
diff --git a/tests/ui/traits/suggest-deferences/issue-62530.rs b/tests/ui/traits/suggest-deferences/issue-62530.rs
new file mode 100644
index 000000000..53846be73
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/issue-62530.rs
@@ -0,0 +1,15 @@
+// run-rustfix
+fn takes_str(_x: &str) {}
+
+fn takes_type_parameter<T>(_x: T) where T: SomeTrait {}
+
+trait SomeTrait {}
+impl SomeTrait for &'_ str {}
+impl SomeTrait for char {}
+
+fn main() {
+ let string = String::new();
+ takes_str(&string); // Ok
+ takes_type_parameter(&string); // Error
+ //~^ ERROR the trait bound `&String: SomeTrait` is not satisfied
+}
diff --git a/tests/ui/traits/suggest-deferences/issue-62530.stderr b/tests/ui/traits/suggest-deferences/issue-62530.stderr
new file mode 100644
index 000000000..e47ae0b65
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/issue-62530.stderr
@@ -0,0 +1,21 @@
+error[E0277]: the trait bound `&String: SomeTrait` is not satisfied
+ --> $DIR/issue-62530.rs:13:26
+ |
+LL | takes_type_parameter(&string); // Error
+ | -------------------- ^^^^^^^ the trait `SomeTrait` is not implemented for `&String`
+ | |
+ | required by a bound introduced by this call
+ |
+note: required by a bound in `takes_type_parameter`
+ --> $DIR/issue-62530.rs:4:44
+ |
+LL | fn takes_type_parameter<T>(_x: T) where T: SomeTrait {}
+ | ^^^^^^^^^ required by this bound in `takes_type_parameter`
+help: consider dereferencing here
+ |
+LL | takes_type_parameter(&*string); // Error
+ | +
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/traits/suggest-deferences/multiple-0.fixed b/tests/ui/traits/suggest-deferences/multiple-0.fixed
new file mode 100644
index 000000000..b7160b75c
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/multiple-0.fixed
@@ -0,0 +1,36 @@
+// run-rustfix
+use std::ops::Deref;
+
+trait Happy {}
+struct LDM;
+impl Happy for &LDM {}
+
+struct Foo(LDM);
+struct Bar(Foo);
+struct Baz(Bar);
+impl Deref for Foo {
+ type Target = LDM;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+impl Deref for Bar {
+ type Target = Foo;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+impl Deref for Baz {
+ type Target = Bar;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+fn foo<T>(_: T) where T: Happy {}
+
+fn main() {
+ let baz = Baz(Bar(Foo(LDM)));
+ foo(&***baz);
+ //~^ ERROR the trait bound `&Baz: Happy` is not satisfied
+}
diff --git a/tests/ui/traits/suggest-deferences/multiple-0.rs b/tests/ui/traits/suggest-deferences/multiple-0.rs
new file mode 100644
index 000000000..9ac55177f
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/multiple-0.rs
@@ -0,0 +1,36 @@
+// run-rustfix
+use std::ops::Deref;
+
+trait Happy {}
+struct LDM;
+impl Happy for &LDM {}
+
+struct Foo(LDM);
+struct Bar(Foo);
+struct Baz(Bar);
+impl Deref for Foo {
+ type Target = LDM;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+impl Deref for Bar {
+ type Target = Foo;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+impl Deref for Baz {
+ type Target = Bar;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+fn foo<T>(_: T) where T: Happy {}
+
+fn main() {
+ let baz = Baz(Bar(Foo(LDM)));
+ foo(&baz);
+ //~^ ERROR the trait bound `&Baz: Happy` is not satisfied
+}
diff --git a/tests/ui/traits/suggest-deferences/multiple-0.stderr b/tests/ui/traits/suggest-deferences/multiple-0.stderr
new file mode 100644
index 000000000..6a4d4b8d5
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/multiple-0.stderr
@@ -0,0 +1,21 @@
+error[E0277]: the trait bound `&Baz: Happy` is not satisfied
+ --> $DIR/multiple-0.rs:34:9
+ |
+LL | foo(&baz);
+ | --- ^^^^ the trait `Happy` is not implemented for `&Baz`
+ | |
+ | required by a bound introduced by this call
+ |
+note: required by a bound in `foo`
+ --> $DIR/multiple-0.rs:30:26
+ |
+LL | fn foo<T>(_: T) where T: Happy {}
+ | ^^^^^ required by this bound in `foo`
+help: consider dereferencing here
+ |
+LL | foo(&***baz);
+ | +++
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/traits/suggest-deferences/multiple-1.rs b/tests/ui/traits/suggest-deferences/multiple-1.rs
new file mode 100644
index 000000000..91c6c7924
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/multiple-1.rs
@@ -0,0 +1,54 @@
+use std::ops::{Deref, DerefMut};
+
+trait Happy {}
+struct LDM;
+impl Happy for &mut LDM {}
+
+struct Foo(LDM);
+struct Bar(Foo);
+struct Baz(Bar);
+impl Deref for Foo {
+ type Target = LDM;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+impl Deref for Bar {
+ type Target = Foo;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+impl Deref for Baz {
+ type Target = Bar;
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+impl DerefMut for Foo {
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ &mut self.0
+ }
+}
+impl DerefMut for Bar {
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ &mut self.0
+ }
+}
+impl DerefMut for Baz {
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ &mut self.0
+ }
+}
+
+
+fn foo<T>(_: T) where T: Happy {}
+
+fn main() {
+ // Currently the compiler doesn't try to suggest dereferences for situations
+ // where DerefMut involves. So this test is meant to ensure compiler doesn't
+ // generate incorrect help message.
+ let mut baz = Baz(Bar(Foo(LDM)));
+ foo(&mut baz);
+ //~^ ERROR the trait bound `&mut Baz: Happy` is not satisfied
+}
diff --git a/tests/ui/traits/suggest-deferences/multiple-1.stderr b/tests/ui/traits/suggest-deferences/multiple-1.stderr
new file mode 100644
index 000000000..6e12321c2
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/multiple-1.stderr
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `&mut Baz: Happy` is not satisfied
+ --> $DIR/multiple-1.rs:52:9
+ |
+LL | foo(&mut baz);
+ | --- ^^^^^^^^ the trait `Happy` is not implemented for `&mut Baz`
+ | |
+ | required by a bound introduced by this call
+ |
+ = help: the trait `Happy` is implemented for `&mut LDM`
+note: required by a bound in `foo`
+ --> $DIR/multiple-1.rs:45:26
+ |
+LL | fn foo<T>(_: T) where T: Happy {}
+ | ^^^^^ required by this bound in `foo`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/traits/suggest-deferences/root-obligation.fixed b/tests/ui/traits/suggest-deferences/root-obligation.fixed
new file mode 100644
index 000000000..7a8433f90
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/root-obligation.fixed
@@ -0,0 +1,13 @@
+// run-rustfix
+
+fn get_vowel_count(string: &str) -> usize {
+ string
+ .chars()
+ .filter(|c| "aeiou".contains(*c))
+ //~^ ERROR expected a `Fn<(char,)>` closure, found `char`
+ .count()
+}
+
+fn main() {
+ let _ = get_vowel_count("asdf");
+}
diff --git a/tests/ui/traits/suggest-deferences/root-obligation.rs b/tests/ui/traits/suggest-deferences/root-obligation.rs
new file mode 100644
index 000000000..51bac2107
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/root-obligation.rs
@@ -0,0 +1,13 @@
+// run-rustfix
+
+fn get_vowel_count(string: &str) -> usize {
+ string
+ .chars()
+ .filter(|c| "aeiou".contains(c))
+ //~^ ERROR expected a `Fn<(char,)>` closure, found `char`
+ .count()
+}
+
+fn main() {
+ let _ = get_vowel_count("asdf");
+}
diff --git a/tests/ui/traits/suggest-deferences/root-obligation.stderr b/tests/ui/traits/suggest-deferences/root-obligation.stderr
new file mode 100644
index 000000000..1363fb8c4
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/root-obligation.stderr
@@ -0,0 +1,21 @@
+error[E0277]: expected a `Fn<(char,)>` closure, found `char`
+ --> $DIR/root-obligation.rs:6:38
+ |
+LL | .filter(|c| "aeiou".contains(c))
+ | -------- ^ expected an `Fn<(char,)>` closure, found `char`
+ | |
+ | required by a bound introduced by this call
+ |
+ = help: the trait `Fn<(char,)>` is not implemented for `char`
+ = note: required for `&char` to implement `FnOnce<(char,)>`
+ = note: required for `&char` to implement `Pattern<'_>`
+note: required by a bound in `core::str::<impl str>::contains`
+ --> $SRC_DIR/core/src/str/mod.rs:LL:COL
+help: consider dereferencing here
+ |
+LL | .filter(|c| "aeiou".contains(*c))
+ | +
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.fixed b/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.fixed
new file mode 100644
index 000000000..ea3d1bf85
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.fixed
@@ -0,0 +1,14 @@
+// run-rustfix
+
+struct TargetStruct;
+
+impl From<usize> for TargetStruct {
+ fn from(_unchecked: usize) -> Self {
+ TargetStruct
+ }
+}
+
+fn main() {
+ let a = &3;
+ let _b: TargetStruct = (*a).into(); //~ ERROR the trait bound `TargetStruct: From<&{integer}>` is not satisfied
+}
diff --git a/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.rs b/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.rs
new file mode 100644
index 000000000..9eda68027
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.rs
@@ -0,0 +1,14 @@
+// run-rustfix
+
+struct TargetStruct;
+
+impl From<usize> for TargetStruct {
+ fn from(_unchecked: usize) -> Self {
+ TargetStruct
+ }
+}
+
+fn main() {
+ let a = &3;
+ let _b: TargetStruct = a.into(); //~ ERROR the trait bound `TargetStruct: From<&{integer}>` is not satisfied
+}
diff --git a/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.stderr b/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.stderr
new file mode 100644
index 000000000..ede31a2c7
--- /dev/null
+++ b/tests/ui/traits/suggest-deferences/suggest-dereferencing-receiver-argument.stderr
@@ -0,0 +1,15 @@
+error[E0277]: the trait bound `TargetStruct: From<&{integer}>` is not satisfied
+ --> $DIR/suggest-dereferencing-receiver-argument.rs:13:30
+ |
+LL | let _b: TargetStruct = a.into();
+ | ^^^^ the trait `From<&{integer}>` is not implemented for `TargetStruct`
+ |
+ = note: required for `&{integer}` to implement `Into<TargetStruct>`
+help: consider dereferencing here
+ |
+LL | let _b: TargetStruct = (*a).into();
+ | ++ +
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.