use rustc::ty::{self, TyCtxt};
use rustc::ty::maps::Providers;
+use syntax_pos::DUMMY_SP;
+
use std::fmt;
use std::rc::Rc;
use std::hash::{Hash, Hasher};
MovedInCapture => ("capture", "captured"),
};
- let (_ol, _moved_lp_msg, mut err) = match the_move.kind {
+ let (_ol, _moved_lp_msg, mut err, need_note) = match the_move.kind {
move_data::Declared => {
// If this is an uninitialized variable, just emit a simple warning
// and return.
let msg = if !has_fork && partial { "partially " }
else if has_fork && !has_common { "collaterally "}
else { "" };
- let err = struct_span_err!(
+ let mut err = struct_span_err!(
self.tcx.sess, use_span, E0382,
"{} of {}moved value: `{}`",
verb, msg, nl);
- (ol, moved_lp_msg, err)}
+ let need_note = match lp.ty.sty {
+ ty::TypeVariants::TyClosure(id, _) => {
+ if let Ok(ty::ClosureKind::FnOnce) =
+ ty::queries::closure_kind::try_get(self.tcx, DUMMY_SP, id) {
+ err.help("closure was moved because it only implements `FnOnce`");
+ false
+ } else {
+ true
+ }
+ }
+ _ => true,
+ };
+ (ol, moved_lp_msg, err, need_note)
+ }
};
// Get type of value and span where it was previously
err
};
- err.note(&format!("move occurs because `{}` has type `{}`, \
- which does not implement the `Copy` trait",
- self.loan_path_to_string(moved_lp),
- moved_lp.ty));
+ if need_note {
+ err.note(&format!("move occurs because `{}` has type `{}`, \
+ which does not implement the `Copy` trait",
+ self.loan_path_to_string(moved_lp),
+ moved_lp.ty));
+ }
// Note: we used to suggest adding a `ref binding` or calling
// `clone` but those suggestions have been removed because
--- /dev/null
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use std::collections::HashMap;
+
+fn main() {
+ let dict: HashMap<i32, i32> = HashMap::new();
+ let debug_dump_dict = || {
+ for (key, value) in dict {
+ println!("{:?} - {:?}", key, value);
+ }
+ };
+ debug_dump_dict();
+ debug_dump_dict();
+ //~^ ERROR use of moved value: `debug_dump_dict`
+ //~| NOTE closure was moved because it only implements `FnOnce`
+}