ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => {
let found_kind = self.closure_kind(closure_def_id, closure_substs).unwrap();
- let closure_span = self.tcx.hir.span_if_local(closure_def_id).unwrap();
+ let closure_span = self.tcx.sess.codemap()
+ .def_span(self.tcx.hir.span_if_local(closure_def_id).unwrap());
let node_id = self.tcx.hir.as_local_node_id(closure_def_id).unwrap();
let mut err = struct_span_err!(
self.tcx.sess, closure_span, E0525,
kind,
found_kind);
+ err.span_label(
+ closure_span,
+ format!("this closure implements `{}`, not `{}`", found_kind, kind));
err.span_label(
obligation.cause.span,
format!("the requirement to implement `{}` derives from here", kind));
let closure_hir_id = self.tcx.hir.node_to_hir_id(node_id);
match (found_kind, tables.closure_kind_origins().get(closure_hir_id)) {
(ty::ClosureKind::FnOnce, Some((span, name))) => {
- err.span_note(*span, &format!(
+ err.span_label(*span, format!(
"closure is `FnOnce` because it moves the \
variable `{}` out of its environment", name));
},
(ty::ClosureKind::FnMut, Some((span, name))) => {
- err.span_note(*span, &format!(
+ err.span_label(*span, format!(
"closure is `FnMut` because it mutates the \
variable `{}` here", name));
},
error[E0525]: expected a closure that implements the `Fn` trait, but this closure only implements `FnMut`
--> $DIR/issue-26046-fn-mut.rs:14:19
|
-14 | let closure = || { //~ ERROR expected a closure that
- | ___________________^
-15 | | num += 1;
-16 | | };
- | |_____^
-17 |
-18 | Box::new(closure)
- | ----------------- the requirement to implement `Fn` derives from here
- |
-note: closure is `FnMut` because it mutates the variable `num` here
- --> $DIR/issue-26046-fn-mut.rs:15:9
- |
+14 | let closure = || { //~ ERROR expected a closure that
+ | ^^ this closure implements `FnMut`, not `Fn`
15 | num += 1;
- | ^^^
+ | --- closure is `FnMut` because it mutates the variable `num` here
+...
+18 | Box::new(closure)
+ | ----------------- the requirement to implement `Fn` derives from here
error: aborting due to previous error
error[E0525]: expected a closure that implements the `Fn` trait, but this closure only implements `FnOnce`
--> $DIR/issue-26046-fn-once.rs:14:19
|
-14 | let closure = move || { //~ ERROR expected a closure
- | ___________________^
-15 | | vec
-16 | | };
- | |_____^
-17 |
-18 | Box::new(closure)
- | ----------------- the requirement to implement `Fn` derives from here
- |
-note: closure is `FnOnce` because it moves the variable `vec` out of its environment
- --> $DIR/issue-26046-fn-once.rs:15:9
- |
+14 | let closure = move || { //~ ERROR expected a closure
+ | ^^^^^^^ this closure implements `FnOnce`, not `Fn`
15 | vec
- | ^^^
+ | --- closure is `FnOnce` because it moves the variable `vec` out of its environment
+...
+18 | Box::new(closure)
+ | ----------------- the requirement to implement `Fn` derives from here
error: aborting due to previous error
--> $DIR/unboxed-closures-infer-fn-once-move-from-projection.rs:24:13
|
24 | let c = || drop(y.0); //~ ERROR expected a closure that implements the `Fn` trait
- | ^^^^^^^^^^^^
+ | ^^^^^^^^-^^^
+ | | |
+ | | closure is `FnOnce` because it moves the variable `y` out of its environment
+ | this closure implements `FnOnce`, not `Fn`
25 | foo(c);
| --- the requirement to implement `Fn` derives from here
- |
-note: closure is `FnOnce` because it moves the variable `y` out of its environment
- --> $DIR/unboxed-closures-infer-fn-once-move-from-projection.rs:24:21
- |
-24 | let c = || drop(y.0); //~ ERROR expected a closure that implements the `Fn` trait
- | ^
error: aborting due to previous error