Skip to content

Commit

Permalink
Suggest the right help message for as_ref
Browse files Browse the repository at this point in the history
  • Loading branch information
chenyukang committed Aug 20, 2022
1 parent 1603a70 commit 3de74f7
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
3 changes: 2 additions & 1 deletion compiler/rustc_infer/src/infer/error_reporting/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2078,7 +2078,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
diag.span_suggestion(
span,
*msg,
format!("{}.as_ref()", snippet),
// HACK: fix issue# 100605, suggesting convert from &Option<T> to Option<&T>, remove the extra `&`
format!("{}.as_ref()", snippet.trim_start_matches('&')),
Applicability::MachineApplicable,
);
}
Expand Down
9 changes: 9 additions & 0 deletions src/test/ui/issues/issue-100605.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
fn takes_option(_arg: Option<&String>) {}

fn main() {
takes_option(&None); //~ ERROR 4:18: 4:23: mismatched types [E0308]

let x = String::from("x");
let res = Some(x);
takes_option(&res); //~ ERROR 8:18: 8:22: mismatched types [E0308]
}
46 changes: 46 additions & 0 deletions src/test/ui/issues/issue-100605.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
error[E0308]: mismatched types
--> $DIR/issue-100605.rs:4:18
|
LL | takes_option(&None);
| ------------ ^^^^^ expected enum `Option`, found `&Option<_>`
| |
| arguments to this function are incorrect
|
= note: expected enum `Option<&String>`
found reference `&Option<_>`
note: function defined here
--> $DIR/issue-100605.rs:1:4
|
LL | fn takes_option(_arg: Option<&String>) {}
| ^^^^^^^^^^^^ ---------------------
help: you can convert from `&Option<T>` to `Option<&T>` using `.as_ref()`
|
LL | takes_option(None.as_ref());
| ~~~~~~~~~~~~~
help: consider removing the borrow
|
LL - takes_option(&None);
LL + takes_option(None);
|

error[E0308]: mismatched types
--> $DIR/issue-100605.rs:8:18
|
LL | takes_option(&res);
| ------------ ^^^^
| | |
| | expected enum `Option`, found `&Option<String>`
| | help: you can convert from `&Option<T>` to `Option<&T>` using `.as_ref()`: `res.as_ref()`
| arguments to this function are incorrect
|
= note: expected enum `Option<&String>`
found reference `&Option<String>`
note: function defined here
--> $DIR/issue-100605.rs:1:4
|
LL | fn takes_option(_arg: Option<&String>) {}
| ^^^^^^^^^^^^ ---------------------

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.

0 comments on commit 3de74f7

Please sign in to comment.