From 26478c81fd3152eb0d272209dc02cdacfcb22aba Mon Sep 17 00:00:00 2001 From: Henry Boisdequin <65845077+henryboisdequin@users.noreply.github.com> Date: Tue, 9 Mar 2021 20:12:47 +0530 Subject: [PATCH] Don't show note if `span` is `DUMMY_SP` --- .../diagnostics/conflict_errors.rs | 13 ++++++----- src/test/ui/loops/issue-82916.rs | 10 ++++++++ src/test/ui/loops/issue-82916.stderr | 23 +++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 src/test/ui/loops/issue-82916.rs create mode 100644 src/test/ui/loops/issue-82916.stderr diff --git a/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs b/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs index 24b9408ffb6..eb942b195b2 100644 --- a/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs +++ b/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs @@ -13,7 +13,7 @@ use rustc_middle::mir::{ use rustc_middle::ty::{self, suggest_constraining_type_param, Ty, TypeFoldable}; use rustc_span::source_map::DesugaringKind; use rustc_span::symbol::sym; -use rustc_span::Span; +use rustc_span::{Span, DUMMY_SP}; use crate::dataflow::drop_flag_effects; use crate::dataflow::indexes::{MoveOutIndex, MovePathIndex}; @@ -216,12 +216,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ); } // Avoid pointing to the same function in multiple different - // error messages - if self.fn_self_span_reported.insert(self_arg.span) { + // error messages. + if span != DUMMY_SP && self.fn_self_span_reported.insert(self_arg.span) + { err.span_note( - self_arg.span, - &format!("this function takes ownership of the receiver `self`, which moves {}", place_name) - ); + self_arg.span, + &format!("this function takes ownership of the receiver `self`, which moves {}", place_name) + ); } } // Deref::deref takes &self, which cannot cause a move diff --git a/src/test/ui/loops/issue-82916.rs b/src/test/ui/loops/issue-82916.rs new file mode 100644 index 00000000000..8633ea1e8cb --- /dev/null +++ b/src/test/ui/loops/issue-82916.rs @@ -0,0 +1,10 @@ +struct S(i32); + +fn foo(x: Vec) { + for y in x { + + } + let z = x; //~ ERROR use of moved value: `x` +} + +fn main() {} diff --git a/src/test/ui/loops/issue-82916.stderr b/src/test/ui/loops/issue-82916.stderr new file mode 100644 index 00000000000..ad42cce71f6 --- /dev/null +++ b/src/test/ui/loops/issue-82916.stderr @@ -0,0 +1,23 @@ +error[E0382]: use of moved value: `x` + --> $DIR/issue-82916.rs:7:13 + | +LL | fn foo(x: Vec) { + | - move occurs because `x` has type `Vec`, which does not implement the `Copy` trait +LL | for y in x { + | - + | | + | `x` moved due to this implicit call to `.into_iter()` + | help: consider borrowing to avoid moving into the for loop: `&x` +... +LL | let z = x; + | ^ value used here after move + | +note: this function takes ownership of the receiver `self`, which moves `x` + --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL + | +LL | fn into_iter(self) -> Self::IntoIter; + | ^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0382`.