Rollup merge of #107633 - clubby789:option-string-coerce-fix, r=Nilstrieb
Fix suggestion for coercing Option<&String> to Option<&str> Fixes #107604 This also makes the diagnostic `MachineApplicable`, and runs `rustfix` to check we're not producing incorrect code. ``@rustbot`` label +A-diagnostics
This commit is contained in:
commit
c9270272df
5 changed files with 88 additions and 13 deletions
18
tests/ui/typeck/issue-89856.fixed
Normal file
18
tests/ui/typeck/issue-89856.fixed
Normal file
|
@ -0,0 +1,18 @@
|
|||
// run-rustfix
|
||||
|
||||
fn take_str_maybe(_: Option<&str>) { }
|
||||
fn main() {
|
||||
let string = String::from("Hello, world");
|
||||
|
||||
let option: Option<String> = Some(string.clone());
|
||||
take_str_maybe(option.as_deref());
|
||||
//~^ ERROR: mismatched types [E0308]
|
||||
|
||||
let option_ref = Some(&string);
|
||||
take_str_maybe(option_ref.map(|x| x.as_str()));
|
||||
//~^ ERROR: mismatched types [E0308]
|
||||
|
||||
let option_ref_ref = option_ref.as_ref();
|
||||
take_str_maybe(option_ref_ref.map(|x| x.as_str()));
|
||||
//~^ ERROR: mismatched types [E0308]
|
||||
}
|
|
@ -1,8 +1,18 @@
|
|||
fn take_str_maybe(x: Option<&str>) -> Option<&str> { None }
|
||||
// run-rustfix
|
||||
|
||||
fn take_str_maybe(_: Option<&str>) { }
|
||||
fn main() {
|
||||
let string = String::from("Hello, world");
|
||||
let option = Some(&string);
|
||||
|
||||
let option: Option<String> = Some(string.clone());
|
||||
take_str_maybe(option);
|
||||
//~^ ERROR: mismatched types [E0308]
|
||||
|
||||
let option_ref = Some(&string);
|
||||
take_str_maybe(option_ref);
|
||||
//~^ ERROR: mismatched types [E0308]
|
||||
|
||||
let option_ref_ref = option_ref.as_ref();
|
||||
take_str_maybe(option_ref_ref);
|
||||
//~^ ERROR: mismatched types [E0308]
|
||||
}
|
||||
|
|
|
@ -1,23 +1,63 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-89856.rs:6:20
|
||||
--> $DIR/issue-89856.rs:8:20
|
||||
|
|
||||
LL | take_str_maybe(option);
|
||||
| -------------- ^^^^^^ expected `Option<&str>`, found `Option<&String>`
|
||||
| -------------- ^^^^^^ expected `Option<&str>`, found `Option<String>`
|
||||
| |
|
||||
| arguments to this function are incorrect
|
||||
|
|
||||
= note: expected enum `Option<&str>`
|
||||
found enum `Option<String>`
|
||||
note: function defined here
|
||||
--> $DIR/issue-89856.rs:3:4
|
||||
|
|
||||
LL | fn take_str_maybe(_: Option<&str>) { }
|
||||
| ^^^^^^^^^^^^^^ ---------------
|
||||
help: try converting the passed type into a `&str`
|
||||
|
|
||||
LL | take_str_maybe(option.as_deref());
|
||||
| +++++++++++
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-89856.rs:12:20
|
||||
|
|
||||
LL | take_str_maybe(option_ref);
|
||||
| -------------- ^^^^^^^^^^ expected `Option<&str>`, found `Option<&String>`
|
||||
| |
|
||||
| arguments to this function are incorrect
|
||||
|
|
||||
= note: expected enum `Option<&str>`
|
||||
found enum `Option<&String>`
|
||||
note: function defined here
|
||||
--> $DIR/issue-89856.rs:1:4
|
||||
--> $DIR/issue-89856.rs:3:4
|
||||
|
|
||||
LL | fn take_str_maybe(x: Option<&str>) -> Option<&str> { None }
|
||||
LL | fn take_str_maybe(_: Option<&str>) { }
|
||||
| ^^^^^^^^^^^^^^ ---------------
|
||||
help: try converting the passed type into a `&str`
|
||||
|
|
||||
LL | take_str_maybe(option.map(|x| &**x));
|
||||
| ++++++++++++++
|
||||
LL | take_str_maybe(option_ref.map(|x| x.as_str()));
|
||||
| ++++++++++++++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-89856.rs:16:20
|
||||
|
|
||||
LL | take_str_maybe(option_ref_ref);
|
||||
| -------------- ^^^^^^^^^^^^^^ expected `Option<&str>`, found `Option<&&String>`
|
||||
| |
|
||||
| arguments to this function are incorrect
|
||||
|
|
||||
= note: expected enum `Option<&str>`
|
||||
found enum `Option<&&String>`
|
||||
note: function defined here
|
||||
--> $DIR/issue-89856.rs:3:4
|
||||
|
|
||||
LL | fn take_str_maybe(_: Option<&str>) { }
|
||||
| ^^^^^^^^^^^^^^ ---------------
|
||||
help: try converting the passed type into a `&str`
|
||||
|
|
||||
LL | take_str_maybe(option_ref_ref.map(|x| x.as_str()));
|
||||
| ++++++++++++++++++++
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue