Rollup merge of #67247 - JohnTitor:fix-sugg, r=estebank
Don't suggest wrong snippet in closure Fixes #67190 r? @estebank
This commit is contained in:
commit
98df677c3f
|
@ -223,18 +223,24 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
fn report(&mut self, error: GroupedMoveError<'tcx>) {
|
fn report(&mut self, error: GroupedMoveError<'tcx>) {
|
||||||
let (mut err, err_span) = {
|
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 {
|
match error {
|
||||||
GroupedMoveError::MovesFromPlace { span, ref original_path, ref kind, .. } |
|
GroupedMoveError::MovesFromPlace { span, ref original_path, ref kind, .. } |
|
||||||
GroupedMoveError::MovesFromValue { 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 {
|
GroupedMoveError::OtherIllegalMove {
|
||||||
use_spans,
|
use_spans,
|
||||||
ref original_path,
|
ref original_path,
|
||||||
ref kind
|
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={:?} \
|
debug!("report: original_path={:?} span={:?}, kind={:?} \
|
||||||
|
@ -250,6 +256,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
original_path,
|
original_path,
|
||||||
target_place,
|
target_place,
|
||||||
span,
|
span,
|
||||||
|
use_spans,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
IllegalMoveOriginKind::InteriorOfTypeWithDestructor { container_ty: ty } => {
|
IllegalMoveOriginKind::InteriorOfTypeWithDestructor { container_ty: ty } => {
|
||||||
|
@ -296,6 +303,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
move_place: &Place<'tcx>,
|
move_place: &Place<'tcx>,
|
||||||
deref_target_place: &Place<'tcx>,
|
deref_target_place: &Place<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
|
use_spans: Option<UseSpans>,
|
||||||
) -> DiagnosticBuilder<'a> {
|
) -> DiagnosticBuilder<'a> {
|
||||||
// Inspect the type of the content behind the
|
// Inspect the type of the content behind the
|
||||||
// borrow to provide feedback about why this
|
// borrow to provide feedback about why this
|
||||||
|
@ -416,7 +424,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
||||||
if let Ok(snippet) = self.infcx.tcx.sess.source_map().span_to_snippet(span) {
|
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_option = move_ty.starts_with("std::option::Option");
|
||||||
let is_result = move_ty.starts_with("std::result::Result");
|
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(
|
err.span_suggestion(
|
||||||
span,
|
span,
|
||||||
&format!("consider borrowing the `{}`'s content", if is_option {
|
&format!("consider borrowing the `{}`'s content", if is_option {
|
||||||
|
|
|
@ -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() {}
|
|
@ -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`.
|
Loading…
Reference in New Issue