summaryrefslogtreecommitdiffstats
path: root/tests/ui/mismatched_types
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
commitdc0db358abe19481e475e10c32149b53370f1a1c (patch)
treeab8ce99c4b255ce46f99ef402c27916055b899ee /tests/ui/mismatched_types
parentReleasing progress-linux version 1.71.1+dfsg1-2~progress7.99u1. (diff)
downloadrustc-dc0db358abe19481e475e10c32149b53370f1a1c.tar.xz
rustc-dc0db358abe19481e475e10c32149b53370f1a1c.zip
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/mismatched_types')
-rw-r--r--tests/ui/mismatched_types/E0053.stderr2
-rw-r--r--tests/ui/mismatched_types/binops.stderr72
-rw-r--r--tests/ui/mismatched_types/issue-112036.rs7
-rw-r--r--tests/ui/mismatched_types/issue-112036.stderr15
-rw-r--r--tests/ui/mismatched_types/suggest-option-asderef-inference-var.rs9
-rw-r--r--tests/ui/mismatched_types/suggest-option-asderef-inference-var.stderr24
-rw-r--r--tests/ui/mismatched_types/suggest-option-asderef-unfixable.rs34
-rw-r--r--tests/ui/mismatched_types/suggest-option-asderef-unfixable.stderr75
-rw-r--r--tests/ui/mismatched_types/suggest-option-asderef.fixed39
-rw-r--r--tests/ui/mismatched_types/suggest-option-asderef.rs39
-rw-r--r--tests/ui/mismatched_types/suggest-option-asderef.stderr88
11 files changed, 367 insertions, 37 deletions
diff --git a/tests/ui/mismatched_types/E0053.stderr b/tests/ui/mismatched_types/E0053.stderr
index 154f2fcbe..d0bd5b46c 100644
--- a/tests/ui/mismatched_types/E0053.stderr
+++ b/tests/ui/mismatched_types/E0053.stderr
@@ -22,7 +22,7 @@ LL | fn bar(&mut self) { }
| ^^^^^^^^^
| |
| types differ in mutability
- | help: change the self-receiver type to match the trait: `self: &Bar`
+ | help: change the self-receiver type to match the trait: `&self`
|
note: type in trait
--> $DIR/E0053.rs:3:12
diff --git a/tests/ui/mismatched_types/binops.stderr b/tests/ui/mismatched_types/binops.stderr
index 3585587ed..b18ab7f76 100644
--- a/tests/ui/mismatched_types/binops.stderr
+++ b/tests/ui/mismatched_types/binops.stderr
@@ -6,14 +6,14 @@ LL | 1 + Some(1);
|
= help: the trait `Add<Option<{integer}>>` is not implemented for `{integer}`
= help: the following other types implement trait `Add<Rhs>`:
- <&'a f32 as Add<f32>>
- <&'a f64 as Add<f64>>
- <&'a i128 as Add<i128>>
- <&'a i16 as Add<i16>>
- <&'a i32 as Add<i32>>
- <&'a i64 as Add<i64>>
- <&'a i8 as Add<i8>>
- <&'a isize as Add<isize>>
+ <isize as Add>
+ <isize as Add<&isize>>
+ <i8 as Add>
+ <i8 as Add<&i8>>
+ <i16 as Add>
+ <i16 as Add<&i16>>
+ <i32 as Add>
+ <i32 as Add<&i32>>
and 48 others
error[E0277]: cannot subtract `Option<{integer}>` from `usize`
@@ -24,10 +24,10 @@ LL | 2 as usize - Some(1);
|
= help: the trait `Sub<Option<{integer}>>` is not implemented for `usize`
= help: the following other types implement trait `Sub<Rhs>`:
+ <usize as Sub>
+ <usize as Sub<&usize>>
<&'a usize as Sub<usize>>
<&usize as Sub<&usize>>
- <usize as Sub<&usize>>
- <usize as Sub>
error[E0277]: cannot multiply `{integer}` by `()`
--> $DIR/binops.rs:4:7
@@ -37,14 +37,14 @@ LL | 3 * ();
|
= help: the trait `Mul<()>` is not implemented for `{integer}`
= help: the following other types implement trait `Mul<Rhs>`:
- <&'a f32 as Mul<f32>>
- <&'a f64 as Mul<f64>>
- <&'a i128 as Mul<i128>>
- <&'a i16 as Mul<i16>>
- <&'a i32 as Mul<i32>>
- <&'a i64 as Mul<i64>>
- <&'a i8 as Mul<i8>>
- <&'a isize as Mul<isize>>
+ <isize as Mul>
+ <isize as Mul<&isize>>
+ <i8 as Mul>
+ <i8 as Mul<&i8>>
+ <i16 as Mul>
+ <i16 as Mul<&i16>>
+ <i32 as Mul>
+ <i32 as Mul<&i32>>
and 49 others
error[E0277]: cannot divide `{integer}` by `&str`
@@ -55,14 +55,14 @@ LL | 4 / "";
|
= help: the trait `Div<&str>` is not implemented for `{integer}`
= help: the following other types implement trait `Div<Rhs>`:
- <&'a f32 as Div<f32>>
- <&'a f64 as Div<f64>>
- <&'a i128 as Div<i128>>
- <&'a i16 as Div<i16>>
- <&'a i32 as Div<i32>>
- <&'a i64 as Div<i64>>
- <&'a i8 as Div<i8>>
- <&'a isize as Div<isize>>
+ <isize as Div>
+ <isize as Div<&isize>>
+ <i8 as Div>
+ <i8 as Div<&i8>>
+ <i16 as Div>
+ <i16 as Div<&i16>>
+ <i32 as Div>
+ <i32 as Div<&i32>>
and 54 others
error[E0277]: can't compare `{integer}` with `String`
@@ -73,14 +73,14 @@ LL | 5 < String::new();
|
= help: the trait `PartialOrd<String>` is not implemented for `{integer}`
= help: the following other types implement trait `PartialOrd<Rhs>`:
- f32
- f64
- i128
+ isize
+ i8
i16
i32
i64
- i8
- isize
+ i128
+ usize
+ u8
and 6 others
error[E0277]: can't compare `{integer}` with `Result<{integer}, _>`
@@ -91,14 +91,14 @@ LL | 6 == Ok(1);
|
= help: the trait `PartialEq<Result<{integer}, _>>` is not implemented for `{integer}`
= help: the following other types implement trait `PartialEq<Rhs>`:
- f32
- f64
- i128
+ isize
+ i8
i16
i32
i64
- i8
- isize
+ i128
+ usize
+ u8
and 6 others
error: aborting due to 6 previous errors
diff --git a/tests/ui/mismatched_types/issue-112036.rs b/tests/ui/mismatched_types/issue-112036.rs
new file mode 100644
index 000000000..e63471e97
--- /dev/null
+++ b/tests/ui/mismatched_types/issue-112036.rs
@@ -0,0 +1,7 @@
+struct Foo;
+
+impl Drop for Foo {
+ fn drop(self) {} //~ ERROR method `drop` has an incompatible type for trait
+}
+
+fn main() {}
diff --git a/tests/ui/mismatched_types/issue-112036.stderr b/tests/ui/mismatched_types/issue-112036.stderr
new file mode 100644
index 000000000..a883aba35
--- /dev/null
+++ b/tests/ui/mismatched_types/issue-112036.stderr
@@ -0,0 +1,15 @@
+error[E0053]: method `drop` has an incompatible type for trait
+ --> $DIR/issue-112036.rs:4:13
+ |
+LL | fn drop(self) {}
+ | ^^^^
+ | |
+ | expected `&mut Foo`, found `Foo`
+ | help: change the self-receiver type to match the trait: `&mut self`
+ |
+ = note: expected signature `fn(&mut Foo)`
+ found signature `fn(Foo)`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0053`.
diff --git a/tests/ui/mismatched_types/suggest-option-asderef-inference-var.rs b/tests/ui/mismatched_types/suggest-option-asderef-inference-var.rs
new file mode 100644
index 000000000..5febbbe39
--- /dev/null
+++ b/tests/ui/mismatched_types/suggest-option-asderef-inference-var.rs
@@ -0,0 +1,9 @@
+fn deref_int(a: &i32) -> i32 {
+ *a
+}
+
+fn main() {
+ // https://github.com/rust-lang/rust/issues/112293
+ let _has_inference_vars: Option<i32> = Some(0).map(deref_int);
+ //~^ ERROR type mismatch in function arguments
+}
diff --git a/tests/ui/mismatched_types/suggest-option-asderef-inference-var.stderr b/tests/ui/mismatched_types/suggest-option-asderef-inference-var.stderr
new file mode 100644
index 000000000..71c4729e3
--- /dev/null
+++ b/tests/ui/mismatched_types/suggest-option-asderef-inference-var.stderr
@@ -0,0 +1,24 @@
+error[E0631]: type mismatch in function arguments
+ --> $DIR/suggest-option-asderef-inference-var.rs:7:56
+ |
+LL | fn deref_int(a: &i32) -> i32 {
+ | ---------------------------- found signature defined here
+...
+LL | let _has_inference_vars: Option<i32> = Some(0).map(deref_int);
+ | --- ^^^^^^^^^ expected due to this
+ | |
+ | required by a bound introduced by this call
+ |
+ = note: expected function signature `fn({integer}) -> _`
+ found function signature `for<'a> fn(&'a i32) -> _`
+note: required by a bound in `Option::<T>::map`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+help: do not borrow the argument
+ |
+LL - fn deref_int(a: &i32) -> i32 {
+LL + fn deref_int(a: i32) -> i32 {
+ |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0631`.
diff --git a/tests/ui/mismatched_types/suggest-option-asderef-unfixable.rs b/tests/ui/mismatched_types/suggest-option-asderef-unfixable.rs
new file mode 100644
index 000000000..ac0831ce6
--- /dev/null
+++ b/tests/ui/mismatched_types/suggest-option-asderef-unfixable.rs
@@ -0,0 +1,34 @@
+fn produces_string() -> Option<String> {
+ Some("my cool string".to_owned())
+}
+
+fn takes_str_but_too_many_refs(_: &&str) -> Option<()> {
+ Some(())
+}
+
+fn no_args() -> Option<()> {
+ Some(())
+}
+
+extern "C" fn takes_str_but_wrong_abi(_: &str) -> Option<()> {
+ Some(())
+}
+
+unsafe fn takes_str_but_unsafe(_: &str) -> Option<()> {
+ Some(())
+}
+
+struct TypeWithoutDeref;
+
+fn main() {
+ let _ = produces_string().and_then(takes_str_but_too_many_refs);
+ //~^ ERROR type mismatch in function arguments
+ let _ = produces_string().and_then(takes_str_but_wrong_abi);
+ //~^ ERROR expected a `FnOnce<(String,)>` closure, found `for<'a> extern "C" fn(&'a str) -> Option<()> {takes_str_but_wrong_abi}`
+ let _ = produces_string().and_then(takes_str_but_unsafe);
+ //~^ ERROR expected a `FnOnce<(String,)>` closure, found `for<'a> unsafe fn(&'a str) -> Option<()> {takes_str_but_unsafe}`
+ let _ = produces_string().and_then(no_args);
+ //~^ ERROR function is expected to take 1 argument, but it takes 0 arguments
+ let _ = Some(TypeWithoutDeref).and_then(takes_str_but_too_many_refs);
+ //~^ ERROR type mismatch in function arguments
+}
diff --git a/tests/ui/mismatched_types/suggest-option-asderef-unfixable.stderr b/tests/ui/mismatched_types/suggest-option-asderef-unfixable.stderr
new file mode 100644
index 000000000..ecfbd27b1
--- /dev/null
+++ b/tests/ui/mismatched_types/suggest-option-asderef-unfixable.stderr
@@ -0,0 +1,75 @@
+error[E0631]: type mismatch in function arguments
+ --> $DIR/suggest-option-asderef-unfixable.rs:24:40
+ |
+LL | fn takes_str_but_too_many_refs(_: &&str) -> Option<()> {
+ | ------------------------------------------------------ found signature defined here
+...
+LL | let _ = produces_string().and_then(takes_str_but_too_many_refs);
+ | -------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected due to this
+ | |
+ | required by a bound introduced by this call
+ |
+ = note: expected function signature `fn(String) -> _`
+ found function signature `for<'a, 'b> fn(&'a &'b str) -> _`
+note: required by a bound in `Option::<T>::and_then`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+
+error[E0277]: expected a `FnOnce<(String,)>` closure, found `for<'a> extern "C" fn(&'a str) -> Option<()> {takes_str_but_wrong_abi}`
+ --> $DIR/suggest-option-asderef-unfixable.rs:26:40
+ |
+LL | let _ = produces_string().and_then(takes_str_but_wrong_abi);
+ | -------- ^^^^^^^^^^^^^^^^^^^^^^^ expected an `FnOnce<(String,)>` closure, found `for<'a> extern "C" fn(&'a str) -> Option<()> {takes_str_but_wrong_abi}`
+ | |
+ | required by a bound introduced by this call
+ |
+ = help: the trait `FnOnce<(String,)>` is not implemented for fn item `for<'a> extern "C" fn(&'a str) -> Option<()> {takes_str_but_wrong_abi}`
+note: required by a bound in `Option::<T>::and_then`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+
+error[E0277]: expected a `FnOnce<(String,)>` closure, found `for<'a> unsafe fn(&'a str) -> Option<()> {takes_str_but_unsafe}`
+ --> $DIR/suggest-option-asderef-unfixable.rs:28:40
+ |
+LL | let _ = produces_string().and_then(takes_str_but_unsafe);
+ | -------- ^^^^^^^^^^^^^^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }`
+ | |
+ | required by a bound introduced by this call
+ |
+ = help: the trait `FnOnce<(String,)>` is not implemented for fn item `for<'a> unsafe fn(&'a str) -> Option<()> {takes_str_but_unsafe}`
+ = note: unsafe function cannot be called generically without an unsafe block
+note: required by a bound in `Option::<T>::and_then`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+
+error[E0593]: function is expected to take 1 argument, but it takes 0 arguments
+ --> $DIR/suggest-option-asderef-unfixable.rs:30:40
+ |
+LL | fn no_args() -> Option<()> {
+ | -------------------------- takes 0 arguments
+...
+LL | let _ = produces_string().and_then(no_args);
+ | -------- ^^^^^^^ expected function that takes 1 argument
+ | |
+ | required by a bound introduced by this call
+ |
+note: required by a bound in `Option::<T>::and_then`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+
+error[E0631]: type mismatch in function arguments
+ --> $DIR/suggest-option-asderef-unfixable.rs:32:45
+ |
+LL | fn takes_str_but_too_many_refs(_: &&str) -> Option<()> {
+ | ------------------------------------------------------ found signature defined here
+...
+LL | let _ = Some(TypeWithoutDeref).and_then(takes_str_but_too_many_refs);
+ | -------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected due to this
+ | |
+ | required by a bound introduced by this call
+ |
+ = note: expected function signature `fn(TypeWithoutDeref) -> _`
+ found function signature `for<'a, 'b> fn(&'a &'b str) -> _`
+note: required by a bound in `Option::<T>::and_then`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+
+error: aborting due to 5 previous errors
+
+Some errors have detailed explanations: E0277, E0593, E0631.
+For more information about an error, try `rustc --explain E0277`.
diff --git a/tests/ui/mismatched_types/suggest-option-asderef.fixed b/tests/ui/mismatched_types/suggest-option-asderef.fixed
new file mode 100644
index 000000000..5c42ece3c
--- /dev/null
+++ b/tests/ui/mismatched_types/suggest-option-asderef.fixed
@@ -0,0 +1,39 @@
+// run-rustfix
+
+fn produces_string() -> Option<String> {
+ Some("my cool string".to_owned())
+}
+
+fn takes_str(_: &str) -> Option<()> {
+ Some(())
+}
+
+fn takes_str_mut(_: &mut str) -> Option<()> {
+ Some(())
+}
+
+fn generic<T>(_: T) -> Option<()> {
+ Some(())
+}
+
+fn generic_ref<T>(_: T) -> Option<()> {
+ //~^ HELP do not borrow the argument
+ Some(())
+}
+
+fn main() {
+ let _: Option<()> = produces_string().as_deref().and_then(takes_str);
+ //~^ ERROR type mismatch in function arguments
+ //~| HELP call `Option::as_deref()` first
+ let _: Option<Option<()>> = produces_string().as_deref().map(takes_str);
+ //~^ ERROR type mismatch in function arguments
+ //~| HELP call `Option::as_deref()` first
+ let _: Option<Option<()>> = produces_string().as_deref_mut().map(takes_str_mut);
+ //~^ ERROR type mismatch in function arguments
+ //~| HELP call `Option::as_deref_mut()` first
+ let _ = produces_string().and_then(generic);
+
+ let _ = produces_string().as_deref().and_then(generic_ref);
+ //~^ ERROR type mismatch in function arguments
+ //~| HELP call `Option::as_deref()` first
+}
diff --git a/tests/ui/mismatched_types/suggest-option-asderef.rs b/tests/ui/mismatched_types/suggest-option-asderef.rs
new file mode 100644
index 000000000..a5278b8fb
--- /dev/null
+++ b/tests/ui/mismatched_types/suggest-option-asderef.rs
@@ -0,0 +1,39 @@
+// run-rustfix
+
+fn produces_string() -> Option<String> {
+ Some("my cool string".to_owned())
+}
+
+fn takes_str(_: &str) -> Option<()> {
+ Some(())
+}
+
+fn takes_str_mut(_: &mut str) -> Option<()> {
+ Some(())
+}
+
+fn generic<T>(_: T) -> Option<()> {
+ Some(())
+}
+
+fn generic_ref<T>(_: &T) -> Option<()> {
+ //~^ HELP do not borrow the argument
+ Some(())
+}
+
+fn main() {
+ let _: Option<()> = produces_string().and_then(takes_str);
+ //~^ ERROR type mismatch in function arguments
+ //~| HELP call `Option::as_deref()` first
+ let _: Option<Option<()>> = produces_string().map(takes_str);
+ //~^ ERROR type mismatch in function arguments
+ //~| HELP call `Option::as_deref()` first
+ let _: Option<Option<()>> = produces_string().map(takes_str_mut);
+ //~^ ERROR type mismatch in function arguments
+ //~| HELP call `Option::as_deref_mut()` first
+ let _ = produces_string().and_then(generic);
+
+ let _ = produces_string().and_then(generic_ref);
+ //~^ ERROR type mismatch in function arguments
+ //~| HELP call `Option::as_deref()` first
+}
diff --git a/tests/ui/mismatched_types/suggest-option-asderef.stderr b/tests/ui/mismatched_types/suggest-option-asderef.stderr
new file mode 100644
index 000000000..01341603d
--- /dev/null
+++ b/tests/ui/mismatched_types/suggest-option-asderef.stderr
@@ -0,0 +1,88 @@
+error[E0631]: type mismatch in function arguments
+ --> $DIR/suggest-option-asderef.rs:25:52
+ |
+LL | fn takes_str(_: &str) -> Option<()> {
+ | ----------------------------------- found signature defined here
+...
+LL | let _: Option<()> = produces_string().and_then(takes_str);
+ | -------- ^^^^^^^^^ expected due to this
+ | |
+ | required by a bound introduced by this call
+ |
+ = note: expected function signature `fn(String) -> _`
+ found function signature `for<'a> fn(&'a str) -> _`
+note: required by a bound in `Option::<T>::and_then`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+help: call `Option::as_deref()` first
+ |
+LL | let _: Option<()> = produces_string().as_deref().and_then(takes_str);
+ | +++++++++++
+
+error[E0631]: type mismatch in function arguments
+ --> $DIR/suggest-option-asderef.rs:28:55
+ |
+LL | fn takes_str(_: &str) -> Option<()> {
+ | ----------------------------------- found signature defined here
+...
+LL | let _: Option<Option<()>> = produces_string().map(takes_str);
+ | --- ^^^^^^^^^ expected due to this
+ | |
+ | required by a bound introduced by this call
+ |
+ = note: expected function signature `fn(String) -> _`
+ found function signature `for<'a> fn(&'a str) -> _`
+note: required by a bound in `Option::<T>::map`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+help: call `Option::as_deref()` first
+ |
+LL | let _: Option<Option<()>> = produces_string().as_deref().map(takes_str);
+ | +++++++++++
+
+error[E0631]: type mismatch in function arguments
+ --> $DIR/suggest-option-asderef.rs:31:55
+ |
+LL | fn takes_str_mut(_: &mut str) -> Option<()> {
+ | ------------------------------------------- found signature defined here
+...
+LL | let _: Option<Option<()>> = produces_string().map(takes_str_mut);
+ | --- ^^^^^^^^^^^^^ expected due to this
+ | |
+ | required by a bound introduced by this call
+ |
+ = note: expected function signature `fn(String) -> _`
+ found function signature `for<'a> fn(&'a mut str) -> _`
+note: required by a bound in `Option::<T>::map`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+help: call `Option::as_deref_mut()` first
+ |
+LL | let _: Option<Option<()>> = produces_string().as_deref_mut().map(takes_str_mut);
+ | +++++++++++++++
+
+error[E0631]: type mismatch in function arguments
+ --> $DIR/suggest-option-asderef.rs:36:40
+ |
+LL | fn generic_ref<T>(_: &T) -> Option<()> {
+ | -------------------------------------- found signature defined here
+...
+LL | let _ = produces_string().and_then(generic_ref);
+ | -------- ^^^^^^^^^^^ expected due to this
+ | |
+ | required by a bound introduced by this call
+ |
+ = note: expected function signature `fn(String) -> _`
+ found function signature `for<'a> fn(&'a _) -> _`
+note: required by a bound in `Option::<T>::and_then`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
+help: do not borrow the argument
+ |
+LL - fn generic_ref<T>(_: &T) -> Option<()> {
+LL + fn generic_ref<T>(_: T) -> Option<()> {
+ |
+help: call `Option::as_deref()` first
+ |
+LL | let _ = produces_string().as_deref().and_then(generic_ref);
+ | +++++++++++
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0631`.