1
Fork 0

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:
Dylan DPC 2023-02-03 23:04:52 +05:30 committed by GitHub
commit c9270272df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 88 additions and 13 deletions

View 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]
}

View file

@ -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]
}

View file

@ -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`.