From 1cc42ea6750affbef2bca699bde30ac321e15939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 24 May 2019 19:30:25 -0700 Subject: [PATCH] Add support for suggesting as_ref to Result accesses --- src/librustc_mir/borrow_check/move_errors.rs | 10 ++++++++-- .../ui/suggestions/option-content-move.fixed | 18 ++++++++++++++++++ src/test/ui/suggestions/option-content-move.rs | 18 ++++++++++++++++++ .../ui/suggestions/option-content-move.stderr | 11 ++++++++++- 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/librustc_mir/borrow_check/move_errors.rs b/src/librustc_mir/borrow_check/move_errors.rs index 19ad92a8275f..f060e1931829 100644 --- a/src/librustc_mir/borrow_check/move_errors.rs +++ b/src/librustc_mir/borrow_check/move_errors.rs @@ -319,10 +319,16 @@ impl<'a, 'gcx, 'tcx> MirBorrowckCtxt<'a, 'gcx, 'tcx> { original_path.ty(self.mir, self.infcx.tcx).ty, ); let snippet = self.infcx.tcx.sess.source_map().span_to_snippet(span).unwrap(); - if orig_path_ty.starts_with("std::option::Option") { + let is_option = orig_path_ty.starts_with("std::option::Option"); + let is_result = orig_path_ty.starts_with("std::result::Result"); + if is_option || is_result { err.span_suggestion( span, - "consider borrowing the `Option`'s content", + &format!("consider borrowing the `{}`'s content", if is_option { + "Option" + } else { + "Result" + }), format!("{}.as_ref()", snippet), Applicability::MaybeIncorrect, ); diff --git a/src/test/ui/suggestions/option-content-move.fixed b/src/test/ui/suggestions/option-content-move.fixed index 7113de9f4148..f163cd104ffa 100644 --- a/src/test/ui/suggestions/option-content-move.fixed +++ b/src/test/ui/suggestions/option-content-move.fixed @@ -18,4 +18,22 @@ impl LipogramCorpora { } } +pub struct LipogramCorpora2 { + selections: Vec<(char, Result)>, +} + +impl LipogramCorpora2 { + pub fn validate_all(&mut self) -> Result<(), char> { + for selection in &self.selections { + if selection.1.is_ok() { + if selection.1.as_ref().unwrap().contains(selection.0) { + //~^ ERROR cannot move out of borrowed content + return Err(selection.0); + } + } + } + Ok(()) + } +} + fn main() {} diff --git a/src/test/ui/suggestions/option-content-move.rs b/src/test/ui/suggestions/option-content-move.rs index 5a38376ffa60..350486a802d3 100644 --- a/src/test/ui/suggestions/option-content-move.rs +++ b/src/test/ui/suggestions/option-content-move.rs @@ -18,4 +18,22 @@ impl LipogramCorpora { } } +pub struct LipogramCorpora2 { + selections: Vec<(char, Result)>, +} + +impl LipogramCorpora2 { + pub fn validate_all(&mut self) -> Result<(), char> { + for selection in &self.selections { + if selection.1.is_ok() { + if selection.1.unwrap().contains(selection.0) { + //~^ ERROR cannot move out of borrowed content + return Err(selection.0); + } + } + } + Ok(()) + } +} + fn main() {} diff --git a/src/test/ui/suggestions/option-content-move.stderr b/src/test/ui/suggestions/option-content-move.stderr index 7f019c3b5b92..0a325ac54eaf 100644 --- a/src/test/ui/suggestions/option-content-move.stderr +++ b/src/test/ui/suggestions/option-content-move.stderr @@ -7,6 +7,15 @@ LL | if selection.1.unwrap().contains(selection.0) { | cannot move out of borrowed content | help: consider borrowing the `Option`'s content: `selection.1.as_ref()` -error: aborting due to previous error +error[E0507]: cannot move out of borrowed content + --> $DIR/option-content-move.rs:29:20 + | +LL | if selection.1.unwrap().contains(selection.0) { + | ^^^^^^^^^^^ + | | + | cannot move out of borrowed content + | help: consider borrowing the `Result`'s content: `selection.1.as_ref()` + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0507`.