Auto merge of #112945 - compiler-errors:tighten-span-of-adjustment-error, r=oli-obk
(re-)tighten sourceinfo span of adjustments in MIR Diagnostics rely on the spans of MIR statements being (approximately) correct in order to give suggestions relative to that span (i.e. `shrink_to_hi` and `shrink_to_lo`). I discovered that we're *intentionally* lowering THIR exprs with their parent expr's span if they come from adjustments that are due to a parent expression. While I understand why that may be desirable to demonstrate the relationship of an adjustment and the expression that requires it, it leads to 1. very verbose borrowck output 2. incorrect spans for suggestions Some diagnostics get around that by giving suggestions relative to other spans we've collected during MIR lowering, such as the span of the method's identifier (e.g. `name` in `.name()`), but this doesn't work too well when things come from desugaring. I assume it also has lead to numerous tweaks and complications to diagnostics code down the road, which this PR doesn't necessarily aim to fix but may open the gates to fixing later... The last three commits are simplifications due to the fact that we can assume that the move span actually points to what is being moved (and a test). This regressed in #89110, which was debated somewhat in #90286. cc `@Aaron1011` who originally made this change. r? diagnostics Fixes #113547 Fixes #111016
This commit is contained in:
commit
da1d099f91
@ -1121,7 +1121,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
err.eager_subdiagnostic(
|
||||
&self.infcx.tcx.sess.parse_sess.span_diagnostic,
|
||||
CaptureReasonSuggest::FreshReborrow {
|
||||
span: fn_call_span.shrink_to_lo(),
|
||||
span: move_span.shrink_to_hi(),
|
||||
});
|
||||
}
|
||||
if let Some(clone_trait) = tcx.lang_items().clone_trait()
|
||||
@ -1135,10 +1135,10 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
&& self.infcx.predicate_must_hold_modulo_regions(&o)
|
||||
{
|
||||
err.span_suggestion_verbose(
|
||||
fn_call_span.shrink_to_lo(),
|
||||
move_span.shrink_to_hi(),
|
||||
"you can `clone` the value and consume it, but this might not be \
|
||||
your desired behavior",
|
||||
"clone().".to_string(),
|
||||
".clone()".to_string(),
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
|
@ -398,7 +398,7 @@ pub(crate) enum CaptureReasonSuggest<'tcx> {
|
||||
#[suggestion(
|
||||
borrowck_suggest_create_freash_reborrow,
|
||||
applicability = "maybe-incorrect",
|
||||
code = "as_mut().",
|
||||
code = ".as_mut()",
|
||||
style = "verbose"
|
||||
)]
|
||||
FreshReborrow {
|
||||
|
@ -41,11 +41,6 @@ impl<'tcx> Cx<'tcx> {
|
||||
|
||||
let mut expr = self.make_mirror_unadjusted(hir_expr);
|
||||
|
||||
let adjustment_span = match self.adjustment_span {
|
||||
Some((hir_id, span)) if hir_id == hir_expr.hir_id => Some(span),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
trace!(?expr.ty);
|
||||
|
||||
// Now apply adjustments, if any.
|
||||
@ -53,12 +48,7 @@ impl<'tcx> Cx<'tcx> {
|
||||
for adjustment in self.typeck_results.expr_adjustments(hir_expr) {
|
||||
trace!(?expr, ?adjustment);
|
||||
let span = expr.span;
|
||||
expr = self.apply_adjustment(
|
||||
hir_expr,
|
||||
expr,
|
||||
adjustment,
|
||||
adjustment_span.unwrap_or(span),
|
||||
);
|
||||
expr = self.apply_adjustment(hir_expr, expr, adjustment, span);
|
||||
}
|
||||
}
|
||||
|
||||
@ -274,7 +264,6 @@ impl<'tcx> Cx<'tcx> {
|
||||
fn make_mirror_unadjusted(&mut self, expr: &'tcx hir::Expr<'tcx>) -> Expr<'tcx> {
|
||||
let tcx = self.tcx;
|
||||
let expr_ty = self.typeck_results().expr_ty(expr);
|
||||
let expr_span = expr.span;
|
||||
let temp_lifetime =
|
||||
self.rvalue_scopes.temporary_scope(self.region_scope_tree, expr.hir_id.local_id);
|
||||
|
||||
@ -283,17 +272,11 @@ impl<'tcx> Cx<'tcx> {
|
||||
hir::ExprKind::MethodCall(segment, receiver, ref args, fn_span) => {
|
||||
// Rewrite a.b(c) into UFCS form like Trait::b(a, c)
|
||||
let expr = self.method_callee(expr, segment.ident.span, None);
|
||||
// When we apply adjustments to the receiver, use the span of
|
||||
// the overall method call for better diagnostics. args[0]
|
||||
// is guaranteed to exist, since a method call always has a receiver.
|
||||
let old_adjustment_span =
|
||||
self.adjustment_span.replace((receiver.hir_id, expr_span));
|
||||
info!("Using method span: {:?}", expr.span);
|
||||
let args = std::iter::once(receiver)
|
||||
.chain(args.iter())
|
||||
.map(|expr| self.mirror_expr(expr))
|
||||
.collect();
|
||||
self.adjustment_span = old_adjustment_span;
|
||||
ExprKind::Call {
|
||||
ty: expr.ty,
|
||||
fun: self.thir.exprs.push(expr),
|
||||
|
@ -16,7 +16,6 @@ use rustc_hir::Node;
|
||||
use rustc_middle::middle::region;
|
||||
use rustc_middle::thir::*;
|
||||
use rustc_middle::ty::{self, RvalueScopes, Ty, TyCtxt};
|
||||
use rustc_span::Span;
|
||||
|
||||
pub(crate) fn thir_body(
|
||||
tcx: TyCtxt<'_>,
|
||||
@ -62,14 +61,6 @@ struct Cx<'tcx> {
|
||||
typeck_results: &'tcx ty::TypeckResults<'tcx>,
|
||||
rvalue_scopes: &'tcx RvalueScopes,
|
||||
|
||||
/// When applying adjustments to the expression
|
||||
/// with the given `HirId`, use the given `Span`,
|
||||
/// instead of the usual span. This is used to
|
||||
/// assign the span of an overall method call
|
||||
/// (e.g. `my_val.foo()`) to the adjustment expressions
|
||||
/// for the receiver.
|
||||
adjustment_span: Option<(HirId, Span)>,
|
||||
|
||||
/// False to indicate that adjustments should not be applied. Only used for `custom_mir`
|
||||
apply_adjustments: bool,
|
||||
|
||||
@ -110,7 +101,6 @@ impl<'tcx> Cx<'tcx> {
|
||||
typeck_results,
|
||||
rvalue_scopes: &typeck_results.rvalue_scopes,
|
||||
body_owner: def.to_def_id(),
|
||||
adjustment_span: None,
|
||||
apply_adjustments: hir
|
||||
.attrs(hir_id)
|
||||
.iter()
|
||||
|
@ -2,7 +2,7 @@ error: Undefined Behavior: trying to retag from <TAG> for SharedReadWrite permis
|
||||
--> $DIR/box-cell-alias.rs:LL:CC
|
||||
|
|
||||
LL | unsafe { (*ptr).set(20) };
|
||||
| ^^^^^^^^^^^^^^
|
||||
| ^^^^^^
|
||||
| |
|
||||
| trying to retag from <TAG> for SharedReadWrite permission at ALLOC[0x0], but that tag does not exist in the borrow stack for this location
|
||||
| this error occurs as part of retag at ALLOC[0x0..0x1]
|
||||
|
@ -2,7 +2,7 @@ error: Undefined Behavior: trying to retag from <TAG> for SharedReadWrite permis
|
||||
--> $DIR/illegal_read7.rs:LL:CC
|
||||
|
|
||||
LL | let _val = *x.get_mut();
|
||||
| ^^^^^^^^^^^
|
||||
| ^
|
||||
| |
|
||||
| trying to retag from <TAG> for SharedReadWrite permission at ALLOC[0x0], but that tag does not exist in the borrow stack for this location
|
||||
| this error occurs as part of two-phase retag at ALLOC[0x0..0x4]
|
||||
|
@ -2,7 +2,7 @@ error: Undefined Behavior: trying to retag from <TAG> for SharedReadWrite permis
|
||||
--> $DIR/interior_mut1.rs:LL:CC
|
||||
|
|
||||
LL | let _val = *inner_shr.get();
|
||||
| ^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^
|
||||
| |
|
||||
| trying to retag from <TAG> for SharedReadWrite permission at ALLOC[0x0], but that tag does not exist in the borrow stack for this location
|
||||
| this error occurs as part of retag at ALLOC[0x0..0x4]
|
||||
|
@ -2,7 +2,7 @@ error: Undefined Behavior: trying to retag from <TAG> for SharedReadWrite permis
|
||||
--> $DIR/interior_mut2.rs:LL:CC
|
||||
|
|
||||
LL | let _val = *inner_shr.get();
|
||||
| ^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^
|
||||
| |
|
||||
| trying to retag from <TAG> for SharedReadWrite permission at ALLOC[0x0], but that tag does not exist in the borrow stack for this location
|
||||
| this error occurs as part of retag at ALLOC[0x0..0x4]
|
||||
|
@ -2,7 +2,7 @@ error: Undefined Behavior: trying to retag from <TAG> for SharedReadWrite permis
|
||||
--> $DIR/shared_rw_borrows_are_weak1.rs:LL:CC
|
||||
|
|
||||
LL | y.get_mut();
|
||||
| ^^^^^^^^^^^
|
||||
| ^
|
||||
| |
|
||||
| trying to retag from <TAG> for SharedReadWrite permission at ALLOC[0x0], but that tag does not exist in the borrow stack for this location
|
||||
| this error occurs as part of two-phase retag at ALLOC[0x0..0x4]
|
||||
|
@ -21,7 +21,7 @@ help: the accessed tag <TAG> later transitioned to Frozen due to a reborrow (act
|
||||
--> $DIR/fnentry_invalidation.rs:LL:CC
|
||||
|
|
||||
LL | x.do_bad();
|
||||
| ^^^^^^^^^^
|
||||
| ^
|
||||
= help: this transition corresponds to a loss of write permissions
|
||||
= note: BACKTRACE (of the first span):
|
||||
= note: inside `main` at $DIR/fnentry_invalidation.rs:LL:CC
|
||||
|
@ -9,15 +9,8 @@ LL | fn add(&mut self, n: u64) -> u64 {
|
||||
help: the accessed tag <TAG> was created here, in the initial state Reserved
|
||||
--> $DIR/write-during-2phase.rs:LL:CC
|
||||
|
|
||||
LL | let _res = f.add(unsafe {
|
||||
| ________________^
|
||||
LL | | let n = f.0;
|
||||
LL | | // This is the access at fault, but it's not immediately apparent because
|
||||
LL | | // the reference that got invalidated is not under a Protector.
|
||||
LL | | *inner = 42;
|
||||
LL | | n
|
||||
LL | | });
|
||||
| |______^
|
||||
LL | let _res = f.add(unsafe {
|
||||
| ^
|
||||
help: the accessed tag <TAG> later transitioned to Disabled due to a foreign write access at offsets [0x0..0x8]
|
||||
--> $DIR/write-during-2phase.rs:LL:CC
|
||||
|
|
||||
|
@ -7,7 +7,7 @@ LL | for x in &mut xs {
|
||||
| first mutable borrow occurs here
|
||||
| first borrow later used here
|
||||
LL | xs.push(1)
|
||||
| ^^^^^^^^^^ second mutable borrow occurs here
|
||||
| ^^ second mutable borrow occurs here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -13,7 +13,7 @@ note: `into_future` takes ownership of the receiver `self`, which moves `f`
|
||||
help: you can `clone` the value and consume it, but this might not be your desired behavior
|
||||
|
|
||||
LL | f.clone().await;
|
||||
| ++++++++
|
||||
| ++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `x` as mutable, as it is not declared as mutable
|
||||
--> $DIR/issue-61452.rs:4:5
|
||||
|
|
||||
LL | x.take();
|
||||
| ^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `data` as mutable, as it is not declared as mutable
|
||||
--> $DIR/issue-61187.rs:6:5
|
||||
|
|
||||
LL | data.reverse();
|
||||
| ^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
|
@ -27,7 +27,7 @@ LL | x
|
||||
| - value moved here
|
||||
LL | +
|
||||
LL | x.clone();
|
||||
| ^^^^^^^^^ value borrowed here after move
|
||||
| ^ value borrowed here after move
|
||||
|
|
||||
help: consider cloning the value if the performance cost is acceptable
|
||||
|
|
||||
|
@ -9,7 +9,7 @@ LL | let y = x;
|
||||
| ^ move out of `x` occurs here
|
||||
LL |
|
||||
LL | r.use_ref();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x.0` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/borrow-tuple-fields.rs:18:13
|
||||
@ -19,7 +19,7 @@ LL | let a = &x.0;
|
||||
LL | let b = &mut x.0;
|
||||
| ^^^^^^^^ mutable borrow occurs here
|
||||
LL | a.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `x.0` as mutable more than once at a time
|
||||
--> $DIR/borrow-tuple-fields.rs:23:13
|
||||
@ -29,7 +29,7 @@ LL | let a = &mut x.0;
|
||||
LL | let b = &mut x.0;
|
||||
| ^^^^^^^^ second mutable borrow occurs here
|
||||
LL | a.use_ref();
|
||||
| ----------- first borrow later used here
|
||||
| - first borrow later used here
|
||||
|
||||
error[E0505]: cannot move out of `x` because it is borrowed
|
||||
--> $DIR/borrow-tuple-fields.rs:28:13
|
||||
@ -41,7 +41,7 @@ LL | let r = &x.0;
|
||||
LL | let y = x;
|
||||
| ^ move out of `x` occurs here
|
||||
LL | r.use_ref();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x.0` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/borrow-tuple-fields.rs:33:13
|
||||
@ -51,7 +51,7 @@ LL | let a = &x.0;
|
||||
LL | let b = &mut x.0;
|
||||
| ^^^^^^^^ mutable borrow occurs here
|
||||
LL | a.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `x.0` as mutable more than once at a time
|
||||
--> $DIR/borrow-tuple-fields.rs:38:13
|
||||
@ -61,7 +61,7 @@ LL | let a = &mut x.0;
|
||||
LL | let b = &mut x.0;
|
||||
| ^^^^^^^^ second mutable borrow occurs here
|
||||
LL | a.use_mut();
|
||||
| ----------- first borrow later used here
|
||||
| - first borrow later used here
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `arg` as mutable, as it is not declared as mutable
|
||||
--> $DIR/borrowck-argument.rs:10:5
|
||||
|
|
||||
LL | arg.mutate();
|
||||
| ^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
@ -13,7 +13,7 @@ error[E0596]: cannot borrow `arg` as mutable, as it is not declared as mutable
|
||||
--> $DIR/borrowck-argument.rs:15:9
|
||||
|
|
||||
LL | arg.mutate();
|
||||
| ^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
@ -24,7 +24,7 @@ error[E0596]: cannot borrow `arg` as mutable, as it is not declared as mutable
|
||||
--> $DIR/borrowck-argument.rs:21:9
|
||||
|
|
||||
LL | arg.mutate();
|
||||
| ^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
@ -35,7 +35,7 @@ error[E0596]: cannot borrow `arg` as mutable, as it is not declared as mutable
|
||||
--> $DIR/borrowck-argument.rs:32:17
|
||||
|
|
||||
LL | (|arg: S| { arg.mutate() })(s);
|
||||
| ^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `x` as mutable, as it is not declared as mutable
|
||||
--> $DIR/borrowck-auto-mut-ref-to-immut-var.rs:15:5
|
||||
|
|
||||
LL | x.printme();
|
||||
| ^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `*a` as mutable, as `a` is not declared as mutable
|
||||
--> $DIR/borrowck-borrow-immut-deref-of-box-as-mut.rs:12:5
|
||||
|
|
||||
LL | a.foo();
|
||||
| ^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
|
@ -2,11 +2,11 @@ error[E0499]: cannot borrow `*x` as mutable more than once at a time
|
||||
--> $DIR/borrowck-borrow-mut-object-twice.rs:13:5
|
||||
|
|
||||
LL | let y = x.f1();
|
||||
| ------ first mutable borrow occurs here
|
||||
| - first mutable borrow occurs here
|
||||
LL | x.f2();
|
||||
| ^^^^^^ second mutable borrow occurs here
|
||||
| ^ second mutable borrow occurs here
|
||||
LL | y.use_ref();
|
||||
| ----------- first borrow later used here
|
||||
| - first borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -58,7 +58,7 @@ error[E0596]: cannot borrow data in an `Rc` as mutable
|
||||
--> $DIR/borrowck-borrow-overloaded-auto-deref.rs:72:5
|
||||
|
|
||||
LL | x.set(0, 0);
|
||||
| ^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Rc<Point>`
|
||||
|
||||
@ -66,7 +66,7 @@ error[E0596]: cannot borrow data in an `Rc` as mutable
|
||||
--> $DIR/borrowck-borrow-overloaded-auto-deref.rs:76:5
|
||||
|
|
||||
LL | x.set(0, 0);
|
||||
| ^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Rc<Point>`
|
||||
|
||||
@ -74,7 +74,7 @@ error[E0596]: cannot borrow data in an `Rc` as mutable
|
||||
--> $DIR/borrowck-borrow-overloaded-auto-deref.rs:84:5
|
||||
|
|
||||
LL | x.y_mut()
|
||||
| ^^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Rc<Point>`
|
||||
|
||||
@ -82,7 +82,7 @@ error[E0596]: cannot borrow data in an `Rc` as mutable
|
||||
--> $DIR/borrowck-borrow-overloaded-auto-deref.rs:88:5
|
||||
|
|
||||
LL | x.y_mut()
|
||||
| ^^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Rc<Point>`
|
||||
|
||||
@ -90,7 +90,7 @@ error[E0596]: cannot borrow data in an `Rc` as mutable
|
||||
--> $DIR/borrowck-borrow-overloaded-auto-deref.rs:92:6
|
||||
|
|
||||
LL | *x.y_mut() = 3;
|
||||
| ^^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Rc<Point>`
|
||||
|
||||
@ -98,7 +98,7 @@ error[E0596]: cannot borrow data in an `Rc` as mutable
|
||||
--> $DIR/borrowck-borrow-overloaded-auto-deref.rs:96:6
|
||||
|
|
||||
LL | *x.y_mut() = 3;
|
||||
| ^^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Rc<Point>`
|
||||
|
||||
@ -106,7 +106,7 @@ error[E0596]: cannot borrow data in an `Rc` as mutable
|
||||
--> $DIR/borrowck-borrow-overloaded-auto-deref.rs:100:6
|
||||
|
|
||||
LL | *x.y_mut() = 3;
|
||||
| ^^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Rc<Point>`
|
||||
|
||||
|
@ -7,7 +7,7 @@ LL | buggy_map.insert(42, &*Box::new(1));
|
||||
| creates a temporary value which is freed while still in use
|
||||
...
|
||||
LL | buggy_map.insert(43, &*tmp);
|
||||
| --------------------------- borrow later used here
|
||||
| --------- borrow later used here
|
||||
|
|
||||
help: consider using a `let` binding to create a longer lived value
|
||||
|
|
||||
|
@ -6,7 +6,7 @@ LL | let p = &this.x;
|
||||
LL | &mut this.x;
|
||||
| ^^^^^^^^^^^ mutable borrow occurs here
|
||||
LL | p.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -45,7 +45,7 @@ error[E0503]: cannot use `f.x` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:37:9
|
||||
|
|
||||
LL | let x = f.x();
|
||||
| ----- `f` is borrowed here
|
||||
| - `f` is borrowed here
|
||||
LL | f.x;
|
||||
| ^^^ use of borrowed `f`
|
||||
LL | drop(x);
|
||||
@ -55,7 +55,7 @@ error[E0503]: cannot use `g.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:44:9
|
||||
|
|
||||
LL | let x = g.x();
|
||||
| ----- `g` is borrowed here
|
||||
| - `g` is borrowed here
|
||||
LL | g.0;
|
||||
| ^^^ use of borrowed `g`
|
||||
LL | drop(x);
|
||||
@ -75,7 +75,7 @@ error[E0503]: cannot use `e.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:59:20
|
||||
|
|
||||
LL | let x = e.x();
|
||||
| ----- `e` is borrowed here
|
||||
| - `e` is borrowed here
|
||||
LL | match e {
|
||||
LL | Baz::X(value) => value
|
||||
| ^^^^^ use of borrowed `e`
|
||||
@ -97,7 +97,7 @@ error[E0503]: cannot use `f.x` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:74:9
|
||||
|
|
||||
LL | let x = f.x();
|
||||
| ----- `*f` is borrowed here
|
||||
| - `*f` is borrowed here
|
||||
LL | f.x;
|
||||
| ^^^ use of borrowed `*f`
|
||||
LL | drop(x);
|
||||
@ -107,7 +107,7 @@ error[E0503]: cannot use `g.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:81:9
|
||||
|
|
||||
LL | let x = g.x();
|
||||
| ----- `*g` is borrowed here
|
||||
| - `*g` is borrowed here
|
||||
LL | g.0;
|
||||
| ^^^ use of borrowed `*g`
|
||||
LL | drop(x);
|
||||
@ -127,7 +127,7 @@ error[E0503]: cannot use `e.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:96:20
|
||||
|
|
||||
LL | let x = e.x();
|
||||
| ----- `*e` is borrowed here
|
||||
| - `*e` is borrowed here
|
||||
LL | match *e {
|
||||
LL | Baz::X(value) => value
|
||||
| ^^^^^ use of borrowed `*e`
|
||||
|
@ -16,17 +16,15 @@ LL | | })
|
||||
error[E0500]: closure requires unique access to `f` but it is already borrowed
|
||||
--> $DIR/borrowck-insert-during-each.rs:18:9
|
||||
|
|
||||
LL | f.foo(
|
||||
| - --- first borrow later used by call
|
||||
| _____|
|
||||
| |
|
||||
LL | |
|
||||
LL | | |a| {
|
||||
| | ^^^ closure construction occurs here
|
||||
LL | | f.n.insert(*a);
|
||||
| | --- second borrow occurs due to use of `f` in closure
|
||||
LL | | })
|
||||
| |__________- borrow occurs here
|
||||
LL | f.foo(
|
||||
| - --- first borrow later used by call
|
||||
| |
|
||||
| borrow occurs here
|
||||
LL |
|
||||
LL | |a| {
|
||||
| ^^^ closure construction occurs here
|
||||
LL | f.n.insert(*a);
|
||||
| --- second borrow occurs due to use of `f` in closure
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -6,7 +6,7 @@ LL | Some(ref _y) => {
|
||||
LL | let _a = x;
|
||||
| ^ move out of `x` occurs here
|
||||
LL | _y.use_ref();
|
||||
| ------------ borrow later used here
|
||||
| -- borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -7,7 +7,7 @@ LL | }
|
||||
LL | borrow_mut(&mut *v);
|
||||
| ^^^^^^^ mutable borrow occurs here
|
||||
LL | _w.use_ref();
|
||||
| ------------ immutable borrow later used here
|
||||
| -- immutable borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,7 +6,7 @@ LL | let _w = &v;
|
||||
LL | borrow_mut(&mut *v);
|
||||
| ^^^^^^^ mutable borrow occurs here
|
||||
LL | _w.use_ref();
|
||||
| ------------ immutable borrow later used here
|
||||
| -- immutable borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -12,7 +12,7 @@ LL | println!("v={}", *v);
|
||||
| -- move occurs due to use in closure
|
||||
LL | });
|
||||
LL | w.use_ref();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error[E0505]: cannot move out of `v` because it is borrowed
|
||||
--> $DIR/borrowck-loan-blocks-move-cc.rs:24:19
|
||||
@ -28,7 +28,7 @@ LL | println!("v={}", *v);
|
||||
| -- move occurs due to use in closure
|
||||
LL | });
|
||||
LL | w.use_ref();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -8,7 +8,7 @@ LL | let w = &v;
|
||||
LL | take(v);
|
||||
| ^ move out of `v` occurs here
|
||||
LL | w.use_ref();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,7 +4,7 @@ error[E0382]: borrow of moved value: `x`
|
||||
LL | let x = Foo(Box::new(3));
|
||||
| - move occurs because `x` has type `Foo`, which does not implement the `Copy` trait
|
||||
LL | let _y = {x} + x.clone(); // the `{x}` forces a move to occur
|
||||
| - ^^^^^^^^^ value borrowed here after move
|
||||
| - ^ value borrowed here after move
|
||||
| |
|
||||
| value moved here
|
||||
|
|
||||
|
@ -17,7 +17,7 @@ LL | let q = &mut p;
|
||||
| ------ mutable borrow occurs here
|
||||
...
|
||||
LL | p.times(3);
|
||||
| ^^^^^^^^^^ immutable borrow occurs here
|
||||
| ^ immutable borrow occurs here
|
||||
LL |
|
||||
LL | *q + 3; // OK to use the new alias `q`
|
||||
| -- mutable borrow later used here
|
||||
|
@ -1,15 +1,13 @@
|
||||
error[E0502]: cannot borrow `p` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/borrowck-loan-rcvr.rs:23:14
|
||||
|
|
||||
LL | p.blockm(|| {
|
||||
| - ------ ^^ mutable borrow occurs here
|
||||
| | |
|
||||
| _____| immutable borrow later used by call
|
||||
| |
|
||||
LL | | p.x = 10;
|
||||
| | --- second borrow occurs due to use of `p` in closure
|
||||
LL | | })
|
||||
| |______- immutable borrow occurs here
|
||||
LL | p.blockm(|| {
|
||||
| - ------ ^^ mutable borrow occurs here
|
||||
| | |
|
||||
| | immutable borrow later used by call
|
||||
| immutable borrow occurs here
|
||||
LL | p.x = 10;
|
||||
| --- second borrow occurs due to use of `p` in closure
|
||||
|
||||
error[E0502]: cannot borrow `p` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-loan-rcvr.rs:34:5
|
||||
@ -17,7 +15,7 @@ error[E0502]: cannot borrow `p` as immutable because it is also borrowed as muta
|
||||
LL | let l = &mut p;
|
||||
| ------ mutable borrow occurs here
|
||||
LL | p.impurem();
|
||||
| ^^^^^^^^^^^ immutable borrow occurs here
|
||||
| ^ immutable borrow occurs here
|
||||
LL |
|
||||
LL | l.x += 1;
|
||||
| -------- mutable borrow later used here
|
||||
|
@ -9,7 +9,7 @@ LL |
|
||||
LL | let z = *a;
|
||||
| ^^ move out of `*a` occurs here
|
||||
LL | b.use_ref();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -9,7 +9,7 @@ LL | let t1 = t0;
|
||||
| ^^ move out of `t0` occurs here
|
||||
LL | *t1 = 22;
|
||||
LL | p.use_ref();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,9 +2,8 @@ error[E0507]: cannot move out of an `Rc`
|
||||
--> $DIR/borrowck-move-out-of-overloaded-auto-deref.rs:4:14
|
||||
|
|
||||
LL | let _x = Rc::new(vec![1, 2]).into_iter();
|
||||
| ^^^^^^^^^^^^^^^^^^^^-----------
|
||||
| | |
|
||||
| | value moved due to this method call
|
||||
| ^^^^^^^^^^^^^^^^^^^ ----------- value moved due to this method call
|
||||
| |
|
||||
| move occurs because value has type `Vec<i32>`, which does not implement the `Copy` trait
|
||||
|
|
||||
note: `into_iter` takes ownership of the receiver `self`, which moves value
|
||||
@ -12,7 +11,7 @@ note: `into_iter` takes ownership of the receiver `self`, which moves value
|
||||
help: you can `clone` the value and consume it, but this might not be your desired behavior
|
||||
|
|
||||
LL | let _x = Rc::new(vec![1, 2]).clone().into_iter();
|
||||
| ++++++++
|
||||
| ++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,9 +5,8 @@ LL | 1 => { addr.push(&mut x); }
|
||||
| ^^^^^^ second mutable borrow occurs here
|
||||
LL | 2 => { addr.push(&mut x); }
|
||||
LL | _ => { addr.push(&mut x); }
|
||||
| -----------------
|
||||
| | |
|
||||
| | first mutable borrow occurs here
|
||||
| ---- ------ first mutable borrow occurs here
|
||||
| |
|
||||
| first borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `x` as mutable more than once at a time
|
||||
@ -16,18 +15,16 @@ error[E0499]: cannot borrow `x` as mutable more than once at a time
|
||||
LL | 2 => { addr.push(&mut x); }
|
||||
| ^^^^^^ second mutable borrow occurs here
|
||||
LL | _ => { addr.push(&mut x); }
|
||||
| -----------------
|
||||
| | |
|
||||
| | first mutable borrow occurs here
|
||||
| ---- ------ first mutable borrow occurs here
|
||||
| |
|
||||
| first borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `x` as mutable more than once at a time
|
||||
--> $DIR/borrowck-mut-borrow-linear-errors.rs:12:30
|
||||
|
|
||||
LL | _ => { addr.push(&mut x); }
|
||||
| ----------^^^^^^-
|
||||
| | |
|
||||
| | `x` was mutably borrowed here in the previous iteration of the loop
|
||||
| ---- ^^^^^^ `x` was mutably borrowed here in the previous iteration of the loop
|
||||
| |
|
||||
| first borrow used here, in later iteration of loop
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
@ -7,7 +7,7 @@ LL | let mut t2 = &mut t0;
|
||||
| ^^^^^^^ mutable borrow occurs here
|
||||
LL | **t2 += 1; // Mutates `*t0`
|
||||
LL | p.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `t0` as mutable more than once at a time
|
||||
--> $DIR/borrowck-mut-borrow-of-mut-base-ptr.rs:19:18
|
||||
@ -18,7 +18,7 @@ LL | let mut t2 = &mut t0;
|
||||
| ^^^^^^^ second mutable borrow occurs here
|
||||
LL | **t2 += 1; // Mutates `*t0` but not through `*p`
|
||||
LL | p.use_mut();
|
||||
| ----------- first borrow later used here
|
||||
| - first borrow later used here
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -2,21 +2,21 @@ error[E0502]: cannot borrow `*x` as mutable because it is also borrowed as immut
|
||||
--> $DIR/borrowck-object-lifetime.rs:20:13
|
||||
|
|
||||
LL | let y = x.borrowed();
|
||||
| ------------ immutable borrow occurs here
|
||||
| - immutable borrow occurs here
|
||||
LL | let z = x.mut_borrowed();
|
||||
| ^^^^^^^^^^^^^^^^ mutable borrow occurs here
|
||||
LL | y.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/borrowck-object-lifetime.rs:26:13
|
||||
|
|
||||
LL | let y = x.borrowed();
|
||||
| ------------ immutable borrow occurs here
|
||||
| - immutable borrow occurs here
|
||||
LL | let z = &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
LL | y.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -6,7 +6,7 @@ LL | let p = &mut f[&s];
|
||||
LL | let q = &f[&s];
|
||||
| ^ immutable borrow occurs here
|
||||
LL | p.use_mut();
|
||||
| ----------- mutable borrow later used here
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `*f` as mutable more than once at a time
|
||||
--> $DIR/borrowck-overloaded-index-autoderef.rs:43:18
|
||||
@ -16,7 +16,7 @@ LL | let p = &mut f[&s];
|
||||
LL | let q = &mut f[&s];
|
||||
| ^ second mutable borrow occurs here
|
||||
LL | p.use_mut();
|
||||
| ----------- first borrow later used here
|
||||
| - first borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `f.foo` as mutable more than once at a time
|
||||
--> $DIR/borrowck-overloaded-index-autoderef.rs:53:18
|
||||
@ -26,7 +26,7 @@ LL | let p = &mut f.foo[&s];
|
||||
LL | let q = &mut f.foo[&s];
|
||||
| ^^^^^ second mutable borrow occurs here
|
||||
LL | p.use_mut();
|
||||
| ----------- first borrow later used here
|
||||
| - first borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `f.foo` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/borrowck-overloaded-index-autoderef.rs:65:18
|
||||
@ -36,7 +36,7 @@ LL | let p = &f.foo[&s];
|
||||
LL | let q = &mut f.foo[&s];
|
||||
| ^^^^^ mutable borrow occurs here
|
||||
LL | p.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0506]: cannot assign to `f.foo` because it is borrowed
|
||||
--> $DIR/borrowck-overloaded-index-autoderef.rs:71:5
|
||||
@ -46,7 +46,7 @@ LL | let p = &f.foo[&s];
|
||||
LL | f.foo = g;
|
||||
| ^^^^^^^^^ `f.foo` is assigned to here but it was already borrowed
|
||||
LL | p.use_ref();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error[E0506]: cannot assign to `*f` because it is borrowed
|
||||
--> $DIR/borrowck-overloaded-index-autoderef.rs:77:5
|
||||
@ -56,7 +56,7 @@ LL | let p = &f.foo[&s];
|
||||
LL | *f = g;
|
||||
| ^^^^^^ `*f` is assigned to here but it was already borrowed
|
||||
LL | p.use_ref();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error[E0506]: cannot assign to `f.foo` because it is borrowed
|
||||
--> $DIR/borrowck-overloaded-index-autoderef.rs:83:5
|
||||
@ -66,7 +66,7 @@ LL | let p = &mut f.foo[&s];
|
||||
LL | f.foo = g;
|
||||
| ^^^^^^^^^ `f.foo` is assigned to here but it was already borrowed
|
||||
LL | p.use_mut();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error[E0506]: cannot assign to `*f` because it is borrowed
|
||||
--> $DIR/borrowck-overloaded-index-autoderef.rs:89:5
|
||||
@ -76,7 +76,7 @@ LL | let p = &mut f.foo[&s];
|
||||
LL | *f = g;
|
||||
| ^^^^^^ `*f` is assigned to here but it was already borrowed
|
||||
LL | p.use_mut();
|
||||
| ----------- borrow later used here
|
||||
| - borrow later used here
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
|
@ -8,7 +8,7 @@ LL | let z = &x;
|
||||
| ^^ immutable borrow occurs here
|
||||
...
|
||||
LL | y.use_mut();
|
||||
| ----------- mutable borrow later used here
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/borrowck-report-with-custom-diagnostic.rs:21:21
|
||||
@ -20,7 +20,7 @@ LL | let z = &mut x;
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
...
|
||||
LL | y.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `x` as mutable more than once at a time
|
||||
--> $DIR/borrowck-report-with-custom-diagnostic.rs:36:17
|
||||
@ -32,7 +32,7 @@ LL | let z = &mut x;
|
||||
| ^^^^^^ second mutable borrow occurs here
|
||||
...
|
||||
LL | y.use_mut();
|
||||
| ----------- first borrow later used here
|
||||
| - first borrow later used here
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
@ -7,7 +7,7 @@ LL | swap(&mut t0, &mut t1);
|
||||
| ^^^^^^^ mutable borrow occurs here
|
||||
LL | *t1 = 22;
|
||||
LL | p.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,7 +6,7 @@ LL | let ra = &mut u.s.a;
|
||||
LL | let b = u.c;
|
||||
| ^^^ use of borrowed `u.s.a`
|
||||
LL | ra.use_mut();
|
||||
| ------------ borrow later used here
|
||||
| -- borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,7 +6,7 @@ LL | let w = &mut v;
|
||||
LL | borrow(&*v);
|
||||
| ^^^ immutable borrow occurs here
|
||||
LL | w.use_mut();
|
||||
| ----------- mutable borrow later used here
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `*v` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-uniq-via-lend.rs:53:12
|
||||
@ -16,7 +16,7 @@ LL | x = &mut v;
|
||||
LL | borrow(&*v);
|
||||
| ^^^ immutable borrow occurs here
|
||||
LL | x.use_mut();
|
||||
| ----------- mutable borrow later used here
|
||||
| - mutable borrow later used here
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -5,9 +5,8 @@ LL | let vb: &mut [isize] = &mut v;
|
||||
| ------ first mutable borrow occurs here
|
||||
...
|
||||
LL | v.push(tail[0] + tail[1]);
|
||||
| ^^^^^^^-------^^^^^^^^^^^
|
||||
| | |
|
||||
| | first borrow later used here
|
||||
| ^ ------- first borrow later used here
|
||||
| |
|
||||
| second mutable borrow occurs here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -8,7 +8,7 @@ LL | vec[0] = Box::new(4);
|
||||
| ^^^^^^ `vec[_]` is assigned to here but it was already borrowed
|
||||
LL |
|
||||
LL | _a.use_ref();
|
||||
| ------------ borrow later used here
|
||||
| -- borrow later used here
|
||||
|
||||
error[E0506]: cannot assign to `vec[_]` because it is borrowed
|
||||
--> $DIR/borrowck-vec-pattern-nesting.rs:23:13
|
||||
@ -20,7 +20,7 @@ LL | vec[0] = Box::new(4);
|
||||
| ^^^^^^ `vec[_]` is assigned to here but it was already borrowed
|
||||
LL |
|
||||
LL | _b.use_ref();
|
||||
| ------------ borrow later used here
|
||||
| -- borrow later used here
|
||||
|
||||
error[E0508]: cannot move out of type `[Box<isize>]`, a non-copy slice
|
||||
--> $DIR/borrowck-vec-pattern-nesting.rs:34:11
|
||||
|
11
tests/ui/borrowck/clone-span-on-try-operator.fixed
Normal file
11
tests/ui/borrowck/clone-span-on-try-operator.fixed
Normal file
@ -0,0 +1,11 @@
|
||||
// run-rustfix
|
||||
|
||||
#[derive(Clone)]
|
||||
struct Foo;
|
||||
impl Foo {
|
||||
fn foo(self) {}
|
||||
}
|
||||
fn main() {
|
||||
let foo = &Foo;
|
||||
(*foo).clone().foo(); //~ ERROR cannot move out
|
||||
}
|
11
tests/ui/borrowck/clone-span-on-try-operator.rs
Normal file
11
tests/ui/borrowck/clone-span-on-try-operator.rs
Normal file
@ -0,0 +1,11 @@
|
||||
// run-rustfix
|
||||
|
||||
#[derive(Clone)]
|
||||
struct Foo;
|
||||
impl Foo {
|
||||
fn foo(self) {}
|
||||
}
|
||||
fn main() {
|
||||
let foo = &Foo;
|
||||
(*foo).foo(); //~ ERROR cannot move out
|
||||
}
|
21
tests/ui/borrowck/clone-span-on-try-operator.stderr
Normal file
21
tests/ui/borrowck/clone-span-on-try-operator.stderr
Normal file
@ -0,0 +1,21 @@
|
||||
error[E0507]: cannot move out of `*foo` which is behind a shared reference
|
||||
--> $DIR/clone-span-on-try-operator.rs:10:5
|
||||
|
|
||||
LL | (*foo).foo();
|
||||
| ^^^^^^ ----- `*foo` moved due to this method call
|
||||
| |
|
||||
| move occurs because `*foo` has type `Foo`, which does not implement the `Copy` trait
|
||||
|
|
||||
note: `Foo::foo` takes ownership of the receiver `self`, which moves `*foo`
|
||||
--> $DIR/clone-span-on-try-operator.rs:6:12
|
||||
|
|
||||
LL | fn foo(self) {}
|
||||
| ^^^^
|
||||
help: you can `clone` the value and consume it, but this might not be your desired behavior
|
||||
|
|
||||
LL | (*foo).clone().foo();
|
||||
| ++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0507`.
|
@ -5,7 +5,7 @@ LL | let helpers = [vec![], vec![]];
|
||||
| ------- move occurs because `helpers` has type `[Vec<&i64>; 2]`, which does not implement the `Copy` trait
|
||||
LL |
|
||||
LL | HelperStruct { helpers, is_empty: helpers[0].is_empty() }
|
||||
| ------- ^^^^^^^^^^^^^^^^^^^^^ value borrowed here after move
|
||||
| ------- ^^^^^^^^^^ value borrowed here after move
|
||||
| |
|
||||
| value moved here
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow data in a `&` reference as mutable
|
||||
--> $DIR/index-mut-help-with-impl.rs:9:5
|
||||
|
|
||||
LL | Index::index(&v, 1..2).make_ascii_uppercase();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,13 +2,10 @@ error[E0596]: cannot borrow data in an index of `HashMap<&str, String>` as mutab
|
||||
--> $DIR/index-mut-help.rs:10:5
|
||||
|
|
||||
LL | map["peter"].clear();
|
||||
| ^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^^^^^^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `IndexMut` is required to modify indexed content, but it is not implemented for `HashMap<&str, String>`
|
||||
help: to modify a `HashMap<&str, String>` use `.get_mut()`
|
||||
|
|
||||
LL | map.get_mut("peter").map(|val| val.clear());
|
||||
| ~~~~~~~~~ ~~~~~~~~~~~~~~~ +
|
||||
= help: to modify a `HashMap<&str, String>`, use `.get_mut()`, `.insert()` or the entry API
|
||||
|
||||
error[E0594]: cannot assign to data in an index of `HashMap<&str, String>`
|
||||
--> $DIR/index-mut-help.rs:11:5
|
||||
|
@ -26,9 +26,8 @@ error[E0499]: cannot borrow `v` as mutable more than once at a time
|
||||
--> $DIR/issue-109271-pass-self-into-closure.rs:21:12
|
||||
|
|
||||
LL | v.call(|(), this: &mut S| v.set());
|
||||
| -------^^^^^^^^^^^^^^^^^^---------
|
||||
| | | | |
|
||||
| | | | second borrow occurs due to use of `v` in closure
|
||||
| - ---- ^^^^^^^^^^^^^^^^^^ - second borrow occurs due to use of `v` in closure
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
@ -63,21 +62,14 @@ LL ~ S::get(&this);
|
||||
error[E0499]: cannot borrow `v` as mutable more than once at a time
|
||||
--> $DIR/issue-109271-pass-self-into-closure.rs:25:12
|
||||
|
|
||||
LL | v.call(|(), this: &mut S| {
|
||||
| - ---- ^^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| _____| first borrow later used by call
|
||||
| |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | _ = v;
|
||||
LL | | v.set();
|
||||
| | - second borrow occurs due to use of `v` in closure
|
||||
... |
|
||||
LL | | _ = v.add(3);
|
||||
LL | | });
|
||||
| |______- first mutable borrow occurs here
|
||||
LL | v.call(|(), this: &mut S| {
|
||||
| - ---- ^^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
...
|
||||
LL | v.set();
|
||||
| - second borrow occurs due to use of `v` in closure
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `*TAB[_]` as mutable, as `TAB` is an immutable stati
|
||||
--> $DIR/issue-42344.rs:4:5
|
||||
|
|
||||
LL | TAB[0].iter_mut();
|
||||
| ^^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^^^^ cannot borrow as mutable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0502]: cannot borrow `heap` as immutable because it is also borrowed as m
|
||||
--> $DIR/issue-47646.rs:9:30
|
||||
|
|
||||
LL | let borrow = heap.peek_mut();
|
||||
| --------------- mutable borrow occurs here
|
||||
| ---- mutable borrow occurs here
|
||||
LL |
|
||||
LL | match (borrow, ()) {
|
||||
| ------------ a temporary with access to the mutable borrow is created here ...
|
||||
|
@ -4,7 +4,7 @@ error[E0499]: cannot borrow `*bar` as mutable more than once at a time
|
||||
LL | Some(baz) => {
|
||||
| --- first mutable borrow occurs here
|
||||
LL | bar.take();
|
||||
| ^^^^^^^^^^ second mutable borrow occurs here
|
||||
| ^^^ second mutable borrow occurs here
|
||||
LL | drop(baz);
|
||||
| --- first borrow later used here
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0506]: cannot assign to `self.container_field` because it is borrowed
|
||||
--> $DIR/issue-81365-10.rs:21:9
|
||||
|
|
||||
LL | let first = &self.deref().target_field;
|
||||
| ------------ `self.container_field` is borrowed here
|
||||
| ---- `self.container_field` is borrowed here
|
||||
LL | self.container_field = true;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ `self.container_field` is assigned to here but it was already borrowed
|
||||
LL | first;
|
||||
|
@ -2,7 +2,7 @@ error[E0506]: cannot assign to `self.container_field` because it is borrowed
|
||||
--> $DIR/issue-81365-5.rs:28:9
|
||||
|
|
||||
LL | let first = self.get();
|
||||
| ---------- `self.container_field` is borrowed here
|
||||
| ---- `self.container_field` is borrowed here
|
||||
LL | self.container_field = true;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ `self.container_field` is assigned to here but it was already borrowed
|
||||
LL | first;
|
||||
|
@ -7,7 +7,7 @@ LL | for v in self.0.values() {
|
||||
| | help: use mutable method: `values_mut()`
|
||||
| this iterator yields `&` references
|
||||
LL | v.flush();
|
||||
| ^^^^^^^^^ `v` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
| ^ `v` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -7,7 +7,7 @@ LL | match heap.peek_mut() {
|
||||
| first mutable borrow occurs here
|
||||
| a temporary with access to the first borrow is created here ...
|
||||
LL | Some(_) => { heap.pop(); },
|
||||
| ^^^^^^^^^^ second mutable borrow occurs here
|
||||
| ^^^^ second mutable borrow occurs here
|
||||
...
|
||||
LL | }
|
||||
| - ... and the first borrow might be used here, when that temporary is dropped and runs the destructor for type `Option<PeekMut<'_, i32>>`
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `*rofl` as mutable, as it is behind a `&` reference
|
||||
--> $DIR/issue-85765.rs:5:5
|
||||
|
|
||||
LL | rofl.push(Vec::new());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ `rofl` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
| ^^^^ `rofl` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
|
|
||||
help: consider changing this binding's type
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `*inner` as mutable, as it is behind a `&` reference
|
||||
--> $DIR/issue-91206.rs:13:5
|
||||
|
|
||||
LL | inner.clear();
|
||||
| ^^^^^^^^^^^^^ `inner` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
| ^^^^^ `inner` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
|
|
||||
help: consider specifying this binding's type
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `self` as mutable, as it is not declared as mutable
|
||||
--> $DIR/issue-93078.rs:11:9
|
||||
|
|
||||
LL | self.modify();
|
||||
| ^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^^ cannot borrow as mutable
|
||||
|
|
||||
= note: as `Self` may be unsized, this call attempts to take `&mut &mut self`
|
||||
= note: however, `&mut self` expands to `self: &mut Self`, therefore `self` cannot be borrowed mutably
|
||||
|
@ -4,23 +4,23 @@ error[E0596]: cannot borrow `v` as mutable, as it is not declared as mutable
|
||||
LL | let v = Vec::new();
|
||||
| ^ not mutable
|
||||
LL | v.push(0);
|
||||
| --------- cannot borrow as mutable
|
||||
| - cannot borrow as mutable
|
||||
LL | v.push(0);
|
||||
| --------- cannot borrow as mutable
|
||||
| - cannot borrow as mutable
|
||||
LL | v.push(0);
|
||||
| --------- cannot borrow as mutable
|
||||
| - cannot borrow as mutable
|
||||
LL | v.push(0);
|
||||
| --------- cannot borrow as mutable
|
||||
| - cannot borrow as mutable
|
||||
LL | v.push(0);
|
||||
| --------- cannot borrow as mutable
|
||||
| - cannot borrow as mutable
|
||||
LL | v.push(0);
|
||||
| --------- cannot borrow as mutable
|
||||
| - cannot borrow as mutable
|
||||
LL | v.push(0);
|
||||
| --------- cannot borrow as mutable
|
||||
| - cannot borrow as mutable
|
||||
LL | v.push(0);
|
||||
| --------- cannot borrow as mutable
|
||||
| - cannot borrow as mutable
|
||||
LL | v.push(0);
|
||||
| --------- cannot borrow as mutable
|
||||
| - cannot borrow as mutable
|
||||
|
|
||||
= note: ...and 5 other attempted mutable borrows
|
||||
help: consider changing this to be mutable
|
||||
|
@ -47,7 +47,7 @@ error[E0596]: cannot borrow `f` as mutable, as it is not declared as mutable
|
||||
--> $DIR/mut-borrow-of-mut-ref.rs:34:5
|
||||
|
|
||||
LL | f.bar();
|
||||
| ^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
|
||||
help: consider making the binding mutable
|
||||
|
|
||||
|
@ -6,7 +6,7 @@ LL | let first = &mut void;
|
||||
LL | let second = &mut void;
|
||||
| ^^^^^^^^^ second mutable borrow occurs here
|
||||
LL | first.use_mut();
|
||||
| --------------- first borrow later used here
|
||||
| ----- first borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `inner_void` as mutable more than once at a time
|
||||
--> $DIR/mut-borrow-outside-loop.rs:15:28
|
||||
@ -17,7 +17,7 @@ LL | let inner_second = &mut inner_void;
|
||||
| ^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
LL | inner_second.use_mut();
|
||||
LL | inner_first.use_mut();
|
||||
| --------------------- first borrow later used here
|
||||
| ----------- first borrow later used here
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -2,9 +2,8 @@ error[E0507]: cannot move out of `*cb` which is behind a mutable reference
|
||||
--> $DIR/suggest-as-ref-on-mut-closure.rs:7:5
|
||||
|
|
||||
LL | cb.map(|cb| cb());
|
||||
| ^^^--------------
|
||||
| | |
|
||||
| | `*cb` moved due to this method call
|
||||
| ^^ -------------- `*cb` moved due to this method call
|
||||
| |
|
||||
| help: consider calling `.as_ref()` or `.as_mut()` to borrow the type's contents
|
||||
| move occurs because `*cb` has type `Option<&mut dyn FnMut()>`, which does not implement the `Copy` trait
|
||||
|
|
||||
|
@ -2,9 +2,8 @@ error[E0499]: cannot borrow `*self` as mutable more than once at a time
|
||||
--> $DIR/suggest-local-var-double-mut.rs:12:22
|
||||
|
|
||||
LL | self.foo(self.bar());
|
||||
| ---------^^^^^^^^^^-
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| ---- --- ^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0502]: cannot borrow `vec` as immutable because it is also borrowed as mu
|
||||
--> $DIR/suggest-local-var-for-vector.rs:3:9
|
||||
|
|
||||
LL | vec[vec.len() - 1] = 123;
|
||||
| ----^^^^^^^^^-----
|
||||
| ----^^^-----------
|
||||
| | |
|
||||
| | immutable borrow occurs here
|
||||
| mutable borrow occurs here
|
||||
|
@ -2,9 +2,8 @@ error[E0502]: cannot borrow `*self` as mutable because it is also borrowed as im
|
||||
--> $DIR/suggest-local-var-imm-and-mut.rs:12:22
|
||||
|
|
||||
LL | self.foo(self.bar());
|
||||
| ---------^^^^^^^^^^-
|
||||
| | | |
|
||||
| | | mutable borrow occurs here
|
||||
| ---- --- ^^^^^^^^^^ mutable borrow occurs here
|
||||
| | |
|
||||
| | immutable borrow later used by call
|
||||
| immutable borrow occurs here
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0502]: cannot borrow `vec` as immutable because it is also borrowed as mu
|
||||
--> $DIR/suggest-storing-local-var-for-vector.rs:3:9
|
||||
|
|
||||
LL | vec[vec.len() - 1] = 123;
|
||||
| ----^^^^^^^^^-----
|
||||
| ----^^^-----------
|
||||
| | |
|
||||
| | immutable borrow occurs here
|
||||
| mutable borrow occurs here
|
||||
|
@ -2,9 +2,8 @@ error[E0499]: cannot borrow `foo` as mutable more than once at a time
|
||||
--> $DIR/two-phase-across-loop.rs:17:22
|
||||
|
|
||||
LL | strings.push(foo.get_string());
|
||||
| -------------^^^^^^^^^^^^^^^^-
|
||||
| | |
|
||||
| | `foo` was mutably borrowed here in the previous iteration of the loop
|
||||
| ------- ^^^ `foo` was mutably borrowed here in the previous iteration of the loop
|
||||
| |
|
||||
| first borrow used here, in later iteration of loop
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,18 +1,13 @@
|
||||
error[E0502]: cannot borrow `vec` as mutable because it is also borrowed as immutable
|
||||
--> $DIR/two-phase-cannot-nest-mut-self-calls.rs:14:9
|
||||
|
|
||||
LL | vec.get({
|
||||
| - --- immutable borrow later used by call
|
||||
| _____|
|
||||
| |
|
||||
LL | |
|
||||
LL | | vec.push(2);
|
||||
| | ^^^^^^^^^^^ mutable borrow occurs here
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | 0
|
||||
LL | | });
|
||||
| |______- immutable borrow occurs here
|
||||
LL | vec.get({
|
||||
| --- --- immutable borrow later used by call
|
||||
| |
|
||||
| immutable borrow occurs here
|
||||
LL |
|
||||
LL | vec.push(2);
|
||||
| ^^^^^^^^^^^ mutable borrow occurs here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -12,9 +12,8 @@ error[E0499]: cannot borrow `foo` as mutable more than once at a time
|
||||
--> $DIR/two-phase-multi-mut.rs:11:16
|
||||
|
|
||||
LL | foo.method(&mut foo);
|
||||
| -----------^^^^^^^^-
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| --- ------ ^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
||||
|
@ -7,7 +7,7 @@ LL | v[0].push_str({
|
||||
| first mutable borrow occurs here
|
||||
LL |
|
||||
LL | v.push(format!("foo"));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| ^ second mutable borrow occurs here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -13,7 +13,7 @@ error[E0502]: cannot borrow `*self` as mutable because it is also borrowed as im
|
||||
--> $DIR/two-phase-surprise-no-conflict.rs:57:17
|
||||
|
|
||||
LL | self.hash_expr(&self.cx_mut.body(eid).value);
|
||||
| ^^^^^---------^^---------------------^^^^^^^
|
||||
| ^^^^^---------^^-----------^^^^^^^^^^^^^^^^^
|
||||
| | | |
|
||||
| | | immutable borrow occurs here
|
||||
| | immutable borrow later used by call
|
||||
@ -23,9 +23,8 @@ error[E0499]: cannot borrow `reg.sess_mut` as mutable more than once at a time
|
||||
--> $DIR/two-phase-surprise-no-conflict.rs:119:51
|
||||
|
|
||||
LL | reg.register_static(Box::new(TrivialPass::new(&mut reg.sess_mut)));
|
||||
| ----------------------------------------------^^^^^^^^^^^^^^^^^---
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| --- --------------- ^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
||||
@ -33,9 +32,8 @@ error[E0499]: cannot borrow `reg.sess_mut` as mutable more than once at a time
|
||||
--> $DIR/two-phase-surprise-no-conflict.rs:122:54
|
||||
|
|
||||
LL | reg.register_bound(Box::new(TrivialPass::new_mut(&mut reg.sess_mut)));
|
||||
| -------------------------------------------------^^^^^^^^^^^^^^^^^---
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| --- -------------- ^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
||||
@ -43,9 +41,8 @@ error[E0499]: cannot borrow `reg.sess_mut` as mutable more than once at a time
|
||||
--> $DIR/two-phase-surprise-no-conflict.rs:125:53
|
||||
|
|
||||
LL | reg.register_univ(Box::new(TrivialPass::new_mut(&mut reg.sess_mut)));
|
||||
| ------------------------------------------------^^^^^^^^^^^^^^^^^---
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| --- ------------- ^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
||||
@ -53,9 +50,8 @@ error[E0499]: cannot borrow `reg.sess_mut` as mutable more than once at a time
|
||||
--> $DIR/two-phase-surprise-no-conflict.rs:128:44
|
||||
|
|
||||
LL | reg.register_ref(&TrivialPass::new_mut(&mut reg.sess_mut));
|
||||
| ---------------------------------------^^^^^^^^^^^^^^^^^--
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| --- ------------ ^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
||||
@ -106,9 +102,8 @@ error[E0499]: cannot borrow `reg.sess_mut` as mutable more than once at a time
|
||||
--> $DIR/two-phase-surprise-no-conflict.rs:154:54
|
||||
|
|
||||
LL | reg.register_bound(Box::new(CapturePass::new_mut(&mut reg.sess_mut)));
|
||||
| -------------------------------------------------^^^^^^^^^^^^^^^^^---
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| --- -------------- ^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
||||
@ -129,9 +124,8 @@ error[E0499]: cannot borrow `reg.sess_mut` as mutable more than once at a time
|
||||
--> $DIR/two-phase-surprise-no-conflict.rs:158:53
|
||||
|
|
||||
LL | reg.register_univ(Box::new(CapturePass::new_mut(&mut reg.sess_mut)));
|
||||
| ------------------------------------------------^^^^^^^^^^^^^^^^^---
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| --- ------------- ^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
||||
@ -149,9 +143,8 @@ error[E0499]: cannot borrow `reg.sess_mut` as mutable more than once at a time
|
||||
--> $DIR/two-phase-surprise-no-conflict.rs:162:44
|
||||
|
|
||||
LL | reg.register_ref(&CapturePass::new_mut(&mut reg.sess_mut));
|
||||
| ---------------------------------------^^^^^^^^^^^^^^^^^--
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| --- ------------ ^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
||||
|
@ -15,7 +15,7 @@ note: `into_iter` takes ownership of the receiver `self`, which moves `y`
|
||||
help: you can `clone` the value and consume it, but this might not be your desired behavior
|
||||
|
|
||||
LL | y.clone().into_iter();
|
||||
| ++++++++
|
||||
| ++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,7 +4,7 @@ error[E0505]: cannot move out of `alloc` because it is borrowed
|
||||
LL | let alloc = Alloc {};
|
||||
| ----- binding `alloc` declared here
|
||||
LL | let boxed = Box::new_in(10, alloc.by_ref());
|
||||
| -------------- borrow of `alloc` occurs here
|
||||
| ----- borrow of `alloc` occurs here
|
||||
LL | let theref = Box::leak(boxed);
|
||||
LL | drop(alloc);
|
||||
| ^^^^^ move out of `alloc` occurs here
|
||||
|
@ -12,7 +12,7 @@ error[E0596]: cannot borrow `s` as mutable, as it is not declared as mutable
|
||||
LL | let s = std::io::stdin();
|
||||
| - help: consider changing this to be mutable: `mut s`
|
||||
LL | to_fn_once(move|| { s.read_to_end(&mut Vec::new()); });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^ cannot borrow as mutable
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -7,7 +7,7 @@ LL | let z = &mut x;
|
||||
| ^^^^^^ second mutable borrow occurs here
|
||||
LL | z.use_mut();
|
||||
LL | y.use_mut();
|
||||
| ----------- first borrow later used here
|
||||
| - first borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,9 +2,8 @@ error[E0499]: cannot borrow `v` as mutable more than once at a time
|
||||
--> $DIR/one_line.rs:3:12
|
||||
|
|
||||
LL | v.push(v.pop().unwrap());
|
||||
| -------^^^^^^^----------
|
||||
| | | |
|
||||
| | | second mutable borrow occurs here
|
||||
| - ---- ^ second mutable borrow occurs here
|
||||
| | |
|
||||
| | first borrow later used by call
|
||||
| first mutable borrow occurs here
|
||||
|
|
||||
|
@ -15,7 +15,7 @@ note: `into_iter` takes ownership of the receiver `self`, which moves `some_vec`
|
||||
help: you can `clone` the value and consume it, but this might not be your desired behavior
|
||||
|
|
||||
LL | some_vec.clone().into_iter();
|
||||
| ++++++++
|
||||
| ++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0381]: used binding `s` isn't initialized
|
||||
--> $DIR/const-generic-default-wont-borrowck.rs:2:26
|
||||
|
|
||||
LL | let s: &'static str; s.len()
|
||||
| - ^^^^^^^ `*s` used here but it isn't initialized
|
||||
| - ^ `*s` used here but it isn't initialized
|
||||
| |
|
||||
| binding declared here but left uninitialized
|
||||
|
|
||||
|
@ -13,7 +13,7 @@ error[E0596]: cannot borrow `*self.0` as mutable, as it is behind a `&` referenc
|
||||
--> $DIR/issue-109141.rs:6:9
|
||||
|
|
||||
LL | self.0.iter_mut()
|
||||
| ^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
| ^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
|
|
||||
help: consider changing this to be a mutable reference
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error: overly complex generic constant
|
||||
--> $DIR/issue-67375.rs:7:17
|
||||
|
|
||||
LL | inner: [(); { [|_: &T| {}; 0].len() }],
|
||||
| ^^---------------------^^
|
||||
| ^^---------------^^^^^^^^
|
||||
| |
|
||||
| pointer casts are not allowed in generic constants
|
||||
|
|
||||
|
@ -11,7 +11,7 @@ error[E0658]: mutable references are not allowed in constants
|
||||
--> $DIR/const_let_assign3.rs:14:5
|
||||
|
|
||||
LL | s.foo(3);
|
||||
| ^^^^^^^^
|
||||
| ^
|
||||
|
|
||||
= note: see issue #57349 <https://github.com/rust-lang/rust/issues/57349> for more information
|
||||
= help: add `#![feature(const_mut_refs)]` to the crate attributes to enable
|
||||
|
@ -19,9 +19,8 @@ error[E0502]: cannot borrow `self` as mutable because it is also borrowed as imm
|
||||
--> $DIR/issue-34126.rs:6:18
|
||||
|
|
||||
LL | self.run(&mut self);
|
||||
| ---------^^^^^^^^^-
|
||||
| | | |
|
||||
| | | mutable borrow occurs here
|
||||
| ---- --- ^^^^^^^^^ mutable borrow occurs here
|
||||
| | |
|
||||
| | immutable borrow later used by call
|
||||
| immutable borrow occurs here
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `f.v` as mutable, as `f` is not declared as mutable
|
||||
--> $DIR/issue-35937.rs:7:5
|
||||
|
|
||||
LL | f.v.push("cat".to_string());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `*self.s` as mutable, as it is behind a `&` referenc
|
||||
--> $DIR/issue-38147-1.rs:17:9
|
||||
|
|
||||
LL | self.s.push('x');
|
||||
| ^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
| ^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
|
|
||||
help: consider changing this to be a mutable reference
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `*self.s` as mutable, as it is behind a `&` referenc
|
||||
--> $DIR/issue-38147-2.rs:9:9
|
||||
|
|
||||
LL | self.s.push('x');
|
||||
| ^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^^^^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
@ -13,7 +13,7 @@ error[E0596]: cannot borrow `*self.longer_name` as mutable, as it is behind a `&
|
||||
--> $DIR/issue-38147-2.rs:12:9
|
||||
|
|
||||
LL | self.longer_name.push(13);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `*self.s` as mutable, as it is behind a `&` referenc
|
||||
--> $DIR/issue-38147-3.rs:7:9
|
||||
|
|
||||
LL | self.s.push('x');
|
||||
| ^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
||||
| ^^^^^^ cannot borrow as mutable
|
||||
|
|
||||
help: consider changing this to be mutable
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `*f.s` as mutable, as it is behind a `&` reference
|
||||
--> $DIR/issue-38147-4.rs:6:5
|
||||
|
|
||||
LL | f.s.push('x');
|
||||
| ^^^^^^^^^^^^^ `f` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
| ^^^ `f` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
|
|
||||
help: consider changing this to be a mutable reference
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error[E0596]: cannot borrow `*buf` as mutable, as it is behind a `&` reference
|
||||
--> $DIR/issue-40823.rs:3:5
|
||||
|
|
||||
LL | buf.iter_mut();
|
||||
| ^^^^^^^^^^^^^^ `buf` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
| ^^^ `buf` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
||||
|
|
||||
help: consider changing this to be a mutable reference
|
||||
|
|
||||
|
@ -4,7 +4,7 @@ error[E0505]: cannot move out of `a` because it is borrowed
|
||||
LL | let a = "".to_string();
|
||||
| - binding `a` declared here
|
||||
LL | let b: Vec<&str> = a.lines().collect();
|
||||
| --------- borrow of `a` occurs here
|
||||
| - borrow of `a` occurs here
|
||||
LL | drop(a);
|
||||
| ^ move out of `a` occurs here
|
||||
LL | for s in &b {
|
||||
|
@ -2,7 +2,7 @@ error[E0515]: cannot return value referencing local variable `raw_lines`
|
||||
--> $DIR/drop-with-active-borrows-2.rs:3:5
|
||||
|
|
||||
LL | raw_lines.iter().map(|l| l.trim()).collect()
|
||||
| ----------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ---------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| returns a value referencing data owned by the current function
|
||||
| `raw_lines` is borrowed here
|
||||
|
@ -2,7 +2,7 @@ error[E0161]: cannot move a value of type `dyn Bar`
|
||||
--> $DIR/E0161.rs:16:5
|
||||
|
|
||||
LL | x.f();
|
||||
| ^^^^^ the size of `dyn Bar` cannot be statically determined
|
||||
| ^ the size of `dyn Bar` cannot be statically determined
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -7,7 +7,7 @@ LL | let mut a = &mut i;
|
||||
| ^^^^^^ second mutable borrow occurs here
|
||||
LL | a.use_mut();
|
||||
LL | x.use_mut();
|
||||
| ----------- first borrow later used here
|
||||
| - first borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,7 +6,7 @@ LL | let ref y = a;
|
||||
LL | bar(a);
|
||||
| ^^^^^^ mutable borrow occurs here
|
||||
LL | y.use_ref();
|
||||
| ----------- immutable borrow later used here
|
||||
| - immutable borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,7 +6,7 @@ LL | let _borrow = &mut value;
|
||||
LL | let _sum = value + 1;
|
||||
| ^^^^^ use of borrowed `value`
|
||||
LL | _borrow.use_mut();
|
||||
| ----------------- borrow later used here
|
||||
| ------- borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user