Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Explain that ? converts the error type using From
  • Loading branch information
estebank committed May 17, 2019
1 parent 1962ade commit 65b7319
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 3 deletions.
9 changes: 6 additions & 3 deletions src/librustc/traits/error_reporting.rs
Expand Up @@ -643,13 +643,16 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
.map(|s| &s == "?")
.unwrap_or(false);
let is_from = format!("{}", trait_ref).starts_with("std::convert::From<");
let message = if is_try && is_from {
Some(format!(
let (message, note) = if is_try && is_from {
(Some(format!(
"`?` couldn't convert the error to `{}`",
trait_ref.self_ty(),
)), Some(
"the question mark operation (`?`) implicitly performs a \
conversion on the error value using the `From` trait".to_owned()
))
} else {
message
(message, note)
};

let mut err = struct_span_err!(
Expand Down
1 change: 1 addition & 0 deletions src/test/ui/issues/issue-32709.stderr
Expand Up @@ -4,6 +4,7 @@ error[E0277]: `?` couldn't convert the error to `()`
LL | Err(5)?;
| ^ the trait `std::convert::From<{integer}>` 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`

error: aborting due to previous error
Expand Down
1 change: 1 addition & 0 deletions src/test/ui/try-block/try-block-bad-type.stderr
Expand Up @@ -4,6 +4,7 @@ error[E0277]: `?` couldn't convert the error to `i32`
LL | Err("")?;
| ^ the trait `std::convert::From<&str>` is not implemented for `i32`
|
= note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
= help: the following implementations were found:
<i32 as std::convert::From<bool>>
<i32 as std::convert::From<i16>>
Expand Down
1 change: 1 addition & 0 deletions src/test/ui/try-on-option.stderr
Expand Up @@ -4,6 +4,7 @@ error[E0277]: `?` couldn't convert the error to `()`
LL | x?;
| ^ 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`

error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`)
Expand Down

0 comments on commit 65b7319

Please sign in to comment.