mirror of
https://github.com/rust-lang/rust
synced 2024-10-01 06:14:33 +00:00
Provide better compiler output when using ?
on Option
in fn returning Result
and vice-versa
This commit is contained in:
parent
6805906fba
commit
ce994b633d
|
@ -292,7 +292,7 @@ fn report_selection_error(
|
|||
)),
|
||||
Some(
|
||||
"the question mark operation (`?`) implicitly performs a \
|
||||
conversion on the error value using the `From` trait"
|
||||
conversion on the error value using the `From` trait"
|
||||
.to_owned(),
|
||||
),
|
||||
)
|
||||
|
@ -312,6 +312,27 @@ fn report_selection_error(
|
|||
))
|
||||
);
|
||||
|
||||
let should_convert_option_to_result =
|
||||
format!("{}", trait_ref.print_only_trait_path())
|
||||
.starts_with("std::convert::From<std::option::NoneError");
|
||||
let should_convert_result_to_option = format!("{}", trait_ref)
|
||||
.starts_with("<std::option::NoneError as std::convert::From<");
|
||||
if is_try && is_from && should_convert_option_to_result {
|
||||
err.span_suggestion_verbose(
|
||||
span.shrink_to_lo(),
|
||||
"consider converting the `Option<T>` into a `Result<T, _>` using `Option::ok_or` or `Option::ok_or_else`",
|
||||
".ok_or_else(|_| /* error value */)".to_string(),
|
||||
Applicability::HasPlaceholders,
|
||||
);
|
||||
} else if is_try && is_from && should_convert_result_to_option {
|
||||
err.span_suggestion_verbose(
|
||||
span.shrink_to_lo(),
|
||||
"consider converting the `Result<T, _>` into an `Option<T>` using `Result::ok`",
|
||||
".ok()".to_string(),
|
||||
Applicability::HasPlaceholders,
|
||||
);
|
||||
}
|
||||
|
||||
let explanation =
|
||||
if obligation.cause.code == ObligationCauseCode::MainFunctionType {
|
||||
"consider using `()`, or a `Result`".to_owned()
|
||||
|
|
13
src/test/ui/option-to-result.rs
Normal file
13
src/test/ui/option-to-result.rs
Normal file
|
@ -0,0 +1,13 @@
|
|||
fn main(){ }
|
||||
|
||||
fn test_result() -> Result<(),()> {
|
||||
let a:Option<()> = Some(());
|
||||
a?;//~ ERROR `?` couldn't convert the error
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn test_option() -> Option<i32>{
|
||||
let a:Result<i32, i32> = Ok(5);
|
||||
a?;//~ ERROR `?` couldn't convert the error
|
||||
Some(5)
|
||||
}
|
29
src/test/ui/option-to-result.stderr
Normal file
29
src/test/ui/option-to-result.stderr
Normal file
|
@ -0,0 +1,29 @@
|
|||
error[E0277]: `?` couldn't convert the error to `()`
|
||||
--> $DIR/option-to-result.rs:5:6
|
||||
|
|
||||
LL | a?;
|
||||
| ^ the trait `std::convert::From<std::option::NoneError>` is not implemented for `()`
|
||||
|
|
||||
= note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
|
||||
= note: required by `std::convert::From::from`
|
||||
help: consider converting the `Option<T>` into a `Result<T, _>` using `Option::ok_or` or `Option::ok_or_else`
|
||||
|
|
||||
LL | a.ok_or_else(|_| /* error value */)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0277]: `?` couldn't convert the error to `std::option::NoneError`
|
||||
--> $DIR/option-to-result.rs:11:6
|
||||
|
|
||||
LL | a?;
|
||||
| ^ the trait `std::convert::From<i32>` is not implemented for `std::option::NoneError`
|
||||
|
|
||||
= note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
|
||||
= note: required by `std::convert::From::from`
|
||||
help: consider converting the `Result<T, _>` into an `Option<T>` using `Result::ok`
|
||||
|
|
||||
LL | a.ok()?;
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
|
@ -6,6 +6,10 @@ LL | x?;
|
|||
|
|
||||
= note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
|
||||
= note: required by `std::convert::From::from`
|
||||
help: consider converting the `Option<T>` into a `Result<T, _>` using `Option::ok_or` or `Option::ok_or_else`
|
||||
|
|
||||
LL | x.ok_or_else(|_| /* error value */)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`)
|
||||
--> $DIR/try-on-option.rs:13:5
|
||||
|
|
Loading…
Reference in a new issue