reduce to single suggestion for all arguments

This commit is contained in:
akida31 2022-11-13 22:40:54 +01:00
parent 4d87fb5d11
commit f780faa8c4
No known key found for this signature in database
GPG Key ID: 02E1AF2C3D9FB7C9
5 changed files with 66 additions and 89 deletions

View File

@ -3429,26 +3429,37 @@ fn hint_missing_borrow<'tcx>(
(ty, refs)
}
let mut to_borrow = Vec::new();
let mut remove_borrow = Vec::new();
for ((found_arg, expected_arg), arg_span) in found_args.zip(expected_args).zip(arg_spans) {
let (found_ty, found_refs) = get_deref_type_and_refs(*found_arg);
let (expected_ty, expected_refs) = get_deref_type_and_refs(*expected_arg);
if found_ty == expected_ty {
let hint = if found_refs < expected_refs {
"consider borrowing the argument"
} else if found_refs == expected_refs {
continue;
} else {
"do not borrow the argument"
};
err.span_suggestion_verbose(
arg_span,
hint,
expected_arg.to_string(),
Applicability::MaybeIncorrect,
);
if found_refs < expected_refs {
to_borrow.push((arg_span, expected_arg.to_string()));
} else if found_refs > expected_refs {
remove_borrow.push((arg_span, expected_arg.to_string()));
}
}
}
if !to_borrow.is_empty() {
err.multipart_suggestion(
"consider borrowing the argument",
to_borrow,
Applicability::MaybeIncorrect,
);
}
if !remove_borrow.is_empty() {
err.multipart_suggestion(
"do not borrow the argument",
remove_borrow,
Applicability::MaybeIncorrect,
);
}
}
/// Collect all the returned expressions within the input expression.

View File

@ -15,12 +15,8 @@ LL | fn f1<F>(_: F) where F: Fn(&(), &()) {}
| ^^^^^^^^^^^^ required by this bound in `f1`
help: consider borrowing the argument
|
LL | f1(|_: &(), _: ()| {});
| ~~~
help: consider borrowing the argument
|
LL | f1(|_: (), _: &()| {});
| ~~~
LL | f1(|_: &(), _: &()| {});
| ~~~ ~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:3:5
@ -39,12 +35,8 @@ LL | fn f2<F>(_: F) where F: for<'a> Fn(&'a (), &()) {}
| ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f2`
help: consider borrowing the argument
|
LL | f2(|_: &'a (), _: ()| {});
| ~~~~~~
help: consider borrowing the argument
|
LL | f2(|_: (), _: &()| {});
| ~~~
LL | f2(|_: &'a (), _: &()| {});
| ~~~~~~ ~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:4:5
@ -63,12 +55,8 @@ LL | fn f3<'a, F>(_: F) where F: Fn(&'a (), &()) {}
| ^^^^^^^^^^^^^^^ required by this bound in `f3`
help: consider borrowing the argument
|
LL | f3(|_: &(), _: ()| {});
| ~~~
help: consider borrowing the argument
|
LL | f3(|_: (), _: &()| {});
| ~~~
LL | f3(|_: &(), _: &()| {});
| ~~~ ~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:5:5
@ -87,12 +75,8 @@ LL | fn f4<F>(_: F) where F: for<'r> Fn(&(), &'r ()) {}
| ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f4`
help: consider borrowing the argument
|
LL | f4(|_: &(), _: ()| {});
| ~~~
help: consider borrowing the argument
|
LL | f4(|_: (), _: &'r ()| {});
| ~~~~~~
LL | f4(|_: &(), _: &'r ()| {});
| ~~~ ~~~~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:6:5
@ -111,19 +95,17 @@ LL | fn f5<F>(_: F) where F: for<'r> Fn(&'r (), &'r ()) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `f5`
help: consider borrowing the argument
|
LL | f5(|_: &'r (), _: ()| {});
| ~~~~~~
help: consider borrowing the argument
|
LL | f5(|_: (), _: &'r ()| {});
| ~~~~~~
LL | f5(|_: &'r (), _: &'r ()| {});
| ~~~~~~ ~~~~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:7:5
|
LL | g1(|_: (), _: ()| {});
| ^^ -------------- found signature defined here
| |
| ^^ --------------
| | | |
| | | help: consider borrowing the argument: `&()`
| | found signature defined here
| expected due to this
|
= note: expected closure signature `for<'a> fn(&'a (), Box<(dyn for<'a> Fn(&'a ()) + 'static)>) -> _`
@ -133,17 +115,15 @@ note: required by a bound in `g1`
|
LL | fn g1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g1`
help: consider borrowing the argument
|
LL | g1(|_: &(), _: ()| {});
| ~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:8:5
|
LL | g2(|_: (), _: ()| {});
| ^^ -------------- found signature defined here
| |
| ^^ --------------
| | | |
| | | help: consider borrowing the argument: `&()`
| | found signature defined here
| expected due to this
|
= note: expected closure signature `for<'a> fn(&'a (), for<'a> fn(&'a ())) -> _`
@ -153,17 +133,15 @@ note: required by a bound in `g2`
|
LL | fn g2<F>(_: F) where F: Fn(&(), fn(&())) {}
| ^^^^^^^^^^^^^^^^ required by this bound in `g2`
help: consider borrowing the argument
|
LL | g2(|_: &(), _: ()| {});
| ~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:9:5
|
LL | g3(|_: (), _: ()| {});
| ^^ -------------- found signature defined here
| |
| ^^ --------------
| | | |
| | | help: consider borrowing the argument: `&'s ()`
| | found signature defined here
| expected due to this
|
= note: expected closure signature `for<'s> fn(&'s (), Box<(dyn for<'a> Fn(&'a ()) + 'static)>) -> _`
@ -173,17 +151,15 @@ note: required by a bound in `g3`
|
LL | fn g3<F>(_: F) where F: for<'s> Fn(&'s (), Box<dyn Fn(&())>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g3`
help: consider borrowing the argument
|
LL | g3(|_: &'s (), _: ()| {});
| ~~~~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:10:5
|
LL | g4(|_: (), _: ()| {});
| ^^ -------------- found signature defined here
| |
| ^^ --------------
| | | |
| | | help: consider borrowing the argument: `&()`
| | found signature defined here
| expected due to this
|
= note: expected closure signature `for<'a> fn(&'a (), for<'r> fn(&'r ())) -> _`
@ -193,10 +169,6 @@ note: required by a bound in `g4`
|
LL | fn g4<F>(_: F) where F: Fn(&(), for<'r> fn(&'r ())) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `g4`
help: consider borrowing the argument
|
LL | g4(|_: &(), _: ()| {});
| ~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:11:5
@ -215,12 +187,8 @@ LL | fn h1<F>(_: F) where F: Fn(&(), Box<dyn Fn(&())>, &(), fn(&(), &())) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h1`
help: consider borrowing the argument
|
LL | h1(|_: &(), _: (), _: (), _: ()| {});
| ~~~
help: consider borrowing the argument
|
LL | h1(|_: (), _: (), _: &(), _: ()| {});
| ~~~
LL | h1(|_: &(), _: (), _: &(), _: ()| {});
| ~~~ ~~~
error[E0631]: type mismatch in closure arguments
--> $DIR/anonymous-higher-ranked-lifetime.rs:12:5
@ -239,12 +207,8 @@ LL | fn h2<F>(_: F) where F: for<'t0> Fn(&(), Box<dyn Fn(&())>, &'t0 (), fn(&(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `h2`
help: consider borrowing the argument
|
LL | h2(|_: &(), _: (), _: (), _: ()| {});
| ~~~
help: consider borrowing the argument
|
LL | h2(|_: (), _: (), _: &'t0 (), _: ()| {});
| ~~~~~~~
LL | h2(|_: &(), _: (), _: &'t0 (), _: ()| {});
| ~~~ ~~~~~~~
error: aborting due to 11 previous errors

View File

@ -2,8 +2,10 @@ error[E0631]: type mismatch in closure arguments
--> $DIR/multiple-fn-bounds.rs:10:5
|
LL | foo(move |x| v);
| ^^^ -------- found signature defined here
| |
| ^^^ --------
| | | |
| | | help: do not borrow the argument: `char`
| | found signature defined here
| expected due to this
|
= note: expected closure signature `fn(char) -> _`
@ -18,10 +20,6 @@ note: required by a bound in `foo`
|
LL | fn foo<F: Fn(&char) -> bool + Fn(char) -> bool>(f: F) {
| ^^^^^^^^^^^^^^^^ required by this bound in `foo`
help: do not borrow the argument
|
LL | foo(move |char| v);
| ~~~~
error: aborting due to previous error

View File

@ -2,8 +2,10 @@ error[E0631]: type mismatch in closure arguments
--> $DIR/closure-arg-type-mismatch.rs:3:14
|
LL | a.iter().map(|_: (u32, u32)| 45);
| ^^^ --------------- found signature defined here
| |
| ^^^ ---------------
| | | |
| | | help: consider borrowing the argument: `&(u32, u32)`
| | found signature defined here
| expected due to this
|
= note: expected closure signature `fn(&(u32, u32)) -> _`

View File

@ -2,8 +2,10 @@ error[E0631]: type mismatch in closure arguments
--> $DIR/issue-36053-2.rs:7:32
|
LL | once::<&str>("str").fuse().filter(|a: &str| true).count();
| ^^^^^^ --------- found signature defined here
| |
| ^^^^^^ ---------
| | | |
| | | help: consider borrowing the argument: `&&str`
| | found signature defined here
| expected due to this
|
= note: expected closure signature `for<'a> fn(&'a &str) -> _`