Skip to content

Commit

Permalink
Rollup merge of rust-lang#67247 - JohnTitor:fix-sugg, r=estebank
Browse files Browse the repository at this point in the history
Don't suggest wrong snippet in closure

Fixes rust-lang#67190

r? @estebank
  • Loading branch information
Centril authored Dec 13, 2019
2 parents 87f3b16 + fa199c5 commit 98df677
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 4 deletions.
16 changes: 12 additions & 4 deletions src/librustc_mir/borrow_check/diagnostics/move_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,18 +223,24 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {

fn report(&mut self, error: GroupedMoveError<'tcx>) {
let (mut err, err_span) = {
let (span, original_path, kind): (Span, &Place<'tcx>, &IllegalMoveOriginKind<'_>) =
let (span, use_spans, original_path, kind,):
(
Span,
Option<UseSpans>,
&Place<'tcx>,
&IllegalMoveOriginKind<'_>,
) =
match error {
GroupedMoveError::MovesFromPlace { span, ref original_path, ref kind, .. } |
GroupedMoveError::MovesFromValue { span, ref original_path, ref kind, .. } => {
(span, original_path, kind)
(span, None, original_path, kind)
}
GroupedMoveError::OtherIllegalMove {
use_spans,
ref original_path,
ref kind
} => {
(use_spans.args_or_use(), original_path, kind)
(use_spans.args_or_use(), Some(use_spans), original_path, kind)
},
};
debug!("report: original_path={:?} span={:?}, kind={:?} \
Expand All @@ -250,6 +256,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
original_path,
target_place,
span,
use_spans,
)
}
IllegalMoveOriginKind::InteriorOfTypeWithDestructor { container_ty: ty } => {
Expand Down Expand Up @@ -296,6 +303,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
move_place: &Place<'tcx>,
deref_target_place: &Place<'tcx>,
span: Span,
use_spans: Option<UseSpans>,
) -> DiagnosticBuilder<'a> {
// Inspect the type of the content behind the
// borrow to provide feedback about why this
Expand Down Expand Up @@ -416,7 +424,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
if let Ok(snippet) = self.infcx.tcx.sess.source_map().span_to_snippet(span) {
let is_option = move_ty.starts_with("std::option::Option");
let is_result = move_ty.starts_with("std::result::Result");
if is_option || is_result {
if (is_option || is_result) && use_spans.map_or(true, |v| !v.for_closure()) {
err.span_suggestion(
span,
&format!("consider borrowing the `{}`'s content", if is_option {
Expand Down
16 changes: 16 additions & 0 deletions src/test/ui/suggestions/option-content-move2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
struct NotCopyable;

fn func<F: FnMut() -> H, H: FnMut()>(_: F) {}

fn parse() {
let mut var = None;
func(|| {
// Shouldn't suggest `move ||.as_ref()` here
move || {
//~^ ERROR: cannot move out of `var`
var = Some(NotCopyable);
}
});
}

fn main() {}
18 changes: 18 additions & 0 deletions src/test/ui/suggestions/option-content-move2.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
error[E0507]: cannot move out of `var`, a captured variable in an `FnMut` closure
--> $DIR/option-content-move2.rs:9:9
|
LL | let mut var = None;
| ------- captured outer variable
...
LL | move || {
| ^^^^^^^ move out of `var` occurs here
LL |
LL | var = Some(NotCopyable);
| ---
| |
| move occurs because `var` has type `std::option::Option<NotCopyable>`, which does not implement the `Copy` trait
| move occurs due to use in closure

error: aborting due to previous error

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

0 comments on commit 98df677

Please sign in to comment.