let partial = moved_lp.depth() > lp.depth();
let msg = if !has_fork && partial { "partially " }
else if has_fork && !has_common { "collaterally "}
- else { "" };
- let mut err = struct_span_err!(
- self.tcx.sess, use_span, E0382,
- "{} of {}moved value: `{}`",
- verb, msg, nl);
+ else { "" };
+ let mut err = self.cannot_act_on_moved_value(use_span,
+ verb,
+ msg,
+ &format!("{}", nl));
let need_note = match lp.ty.sty {
ty::TypeVariants::TyClosure(id, _) => {
let node_id = self.tcx.hir.as_local_node_id(id).unwrap();
&self,
span: Span,
lp: &LoanPath<'tcx>) {
- span_err!(
- self.tcx.sess, span, E0383,
- "partial reinitialization of uninitialized structure `{}`",
- self.loan_path_to_string(lp));
+ self.cannot_partially_reinit_an_uninit_struct(span, &self.loan_path_to_string(lp))
+ .emit();
}
pub fn report_reassigned_immutable_variable(&self,
self.cannot_assign(error_span, &descr, Origin::Ast)
}
BorrowViolation(euv::ClosureCapture(_)) => {
- struct_span_err!(self.tcx.sess, error_span, E0595,
- "closure cannot assign to {}", descr)
+ self.closure_cannot_assign_to_borrowed(error_span, &descr)
}
BorrowViolation(euv::OverloadedOperator) |
BorrowViolation(euv::AddrOf) |
BorrowViolation(euv::AutoUnsafe) |
BorrowViolation(euv::ForLoop) |
BorrowViolation(euv::MatchDiscriminant) => {
- struct_span_err!(self.tcx.sess, error_span, E0596,
- "cannot borrow {} as mutable", descr)
+ self.cannot_borrow_path_as_mutable(error_span, &descr)
}
BorrowViolation(euv::ClosureInvocation) => {
span_bug!(err.span,
if let Some((yield_span, _)) = maybe_borrow_across_yield {
debug!("err_out_of_scope: opt_yield_span = {:?}", yield_span);
- struct_span_err!(self.tcx.sess,
- error_span,
- E0626,
- "borrow may still be in use when generator yields")
- .span_label(yield_span, "possible yield occurs here")
+ self.cannot_borrow_across_generator_yield(error_span, yield_span)
.emit();
return;
}
- let mut db = struct_span_err!(self.tcx.sess,
- error_span,
- E0597,
- "{} does not live long enough",
- msg);
-
+ let mut db = self.path_does_not_live_long_enough(error_span, &msg);
let (value_kind, value_msg) = match err.cmt.cat {
mc::Categorization::Rvalue(..) =>
("temporary value", "temporary value created here"),
}
err_borrowed_pointer_too_short(loan_scope, ptr_scope) => {
let descr = self.cmt_to_path_or_string(&err.cmt);
- let mut db = struct_span_err!(self.tcx.sess, error_span, E0598,
- "lifetime of {} is too short to guarantee \
- its contents can be safely reborrowed",
- descr);
-
+ let mut db = self.lifetime_too_short_for_reborrow(error_span, &descr);
let descr = match opt_loan_path(&err.cmt) {
Some(lp) => {
format!("`{}`", self.loan_path_to_string(&lp))
let blame = cmt.immutability_blame();
let mut err = match blame {
Some(ImmutabilityBlame::ClosureEnv(id)) => {
- let mut err = struct_span_err!(
- self.tcx.sess, span, E0387,
- "{} in a captured outer variable in an `Fn` closure", prefix);
-
// FIXME: the distinction between these 2 messages looks wrong.
- let help = if let BorrowViolation(euv::ClosureCapture(_)) = kind {
+ let help_msg = if let BorrowViolation(euv::ClosureCapture(_)) = kind {
// The aliasability violation with closure captures can
// happen for nested closures, so we know the enclosing
// closure incorrectly accepts an `Fn` while it needs to
"consider changing this closure to take self by mutable reference"
};
let node_id = self.tcx.hir.def_index_to_node_id(id);
- err.span_help(self.tcx.hir.span(node_id), help);
- err
+ let help_span = self.tcx.hir.span(node_id);
+ self.cannot_act_on_capture_in_sharable_fn(span, prefix, (help_span, help_msg))
}
_ => {
- let mut err = struct_span_err!(
- self.tcx.sess, span, E0389,
- "{} in a `&` reference", prefix);
- err.span_label(span, "assignment into an immutable reference");
- err
+ self.cannot_assign_into_immutable_reference(span, prefix)
}
};
self.note_immutability_blame(&mut err, blame);
Err(_) => format!("move |<args>| <body>")
};
- struct_span_err!(self.tcx.sess, err.span, E0373,
- "closure may outlive the current function, \
- but it borrows {}, \
- which is owned by the current function",
- cmt_path_or_string)
- .span_label(capture_span,
- format!("{} is borrowed here",
- cmt_path_or_string))
- .span_label(err.span,
- format!("may outlive borrowed value {}",
- cmt_path_or_string))
+ self.cannot_capture_in_long_lived_closure(err.span,
+ &cmt_path_or_string,
+ capture_span)
.span_suggestion(err.span,
&format!("to force the closure to take ownership of {} \
(and any other referenced variables), \
err.span_label(move_from_span, "cannot move out of here");
err
}
+
+ fn cannot_act_on_moved_value(&self,
+ use_span: Span,
+ verb: &str,
+ optional_adverb_for_moved: &str,
+ moved_path: &str)
+ -> DiagnosticBuilder
+ {
+ let err = struct_span_err!(self, use_span, E0382,
+ "{} of {}moved value: `{}`",
+ verb, optional_adverb_for_moved, moved_path);
+ err
+ }
+
+ fn cannot_partially_reinit_an_uninit_struct(&self,
+ span: Span,
+ uninit_path: &str)
+ -> DiagnosticBuilder
+ {
+ let err = struct_span_err!(self,
+ span,
+ E0383,
+ "partial reinitialization of uninitialized structure `{}`",
+ uninit_path);
+ err
+ }
+
+ fn closure_cannot_assign_to_borrowed(&self,
+ span: Span,
+ descr: &str)
+ -> DiagnosticBuilder
+ {
+ let err = struct_span_err!(self, span, E0595, "closure cannot assign to {}", descr);
+ err
+ }
+
+ fn cannot_borrow_path_as_mutable(&self,
+ span: Span,
+ path: &str)
+ -> DiagnosticBuilder
+ {
+ let err = struct_span_err!(self, span, E0596, "cannot borrow {} as mutable", path);
+ err
+ }
+
+ fn cannot_borrow_across_generator_yield(&self,
+ span: Span,
+ yield_span: Span)
+ -> DiagnosticBuilder
+ {
+ let mut err = struct_span_err!(self,
+ span,
+ E0626,
+ "borrow may still be in use when generator yields");
+ err.span_label(yield_span, "possible yield occurs here");
+ err
+ }
+
+ fn path_does_not_live_long_enough(&self,
+ span: Span,
+ path: &str)
+ -> DiagnosticBuilder
+ {
+ let err = struct_span_err!(self, span, E0597, "{} does not live long enough", path);
+ err
+ }
+
+ fn lifetime_too_short_for_reborrow(&self,
+ span: Span,
+ path: &str)
+ -> DiagnosticBuilder
+ {
+ let err = struct_span_err!(self, span, E0598,
+ "lifetime of {} is too short to guarantee \
+ its contents can be safely reborrowed",
+ path);
+ err
+ }
+
+ fn cannot_act_on_capture_in_sharable_fn(&self,
+ span: Span,
+ bad_thing: &str,
+ help: (Span, &str))
+ -> DiagnosticBuilder
+ {
+ let (help_span, help_msg) = help;
+ let mut err = struct_span_err!(self, span, E0387,
+ "{} in a captured outer variable in an `Fn` closure",
+ bad_thing);
+ err.span_help(help_span, help_msg);
+ err
+ }
+
+ fn cannot_assign_into_immutable_reference(&self,
+ span: Span,
+ bad_thing: &str)
+ -> DiagnosticBuilder
+ {
+ let mut err = struct_span_err!(self, span, E0389, "{} in a `&` reference", bad_thing);
+ err.span_label(span, "assignment into an immutable reference");
+ err
+ }
+
+ fn cannot_capture_in_long_lived_closure(&self,
+ closure_span: Span,
+ borrowed_path: &str,
+ capture_span: Span)
+ -> DiagnosticBuilder
+ {
+ let mut err = struct_span_err!(self, closure_span, E0373,
+ "closure may outlive the current function, \
+ but it borrows {}, \
+ which is owned by the current function",
+ borrowed_path);
+ err.span_label(capture_span, format!("{} is borrowed here", borrowed_path))
+ .span_label(closure_span, format!("may outlive borrowed value {}", borrowed_path));
+ err
+ }
}
impl<'b, 'tcx, 'gcx> BorrowckErrors for TyCtxt<'b, 'tcx, 'gcx> {