Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
b43aa96
Print failure message on all tests that should panic, but don't
johanngan Jan 10, 2021
2624b3e
Improve diagnostics for Precise Capture
ChrisPardy Nov 23, 2020
3056dd0
fix tidy
ChrisPardy Jan 16, 2021
b8115b8
fix line numbers
ChrisPardy Jan 16, 2021
63a1eee
Reset LateContext enclosing body in nested items
camsteffen Jan 18, 2021
21fb586
Query for TypeckResults in LateContext::qpath_res
camsteffen Jan 18, 2021
eaba3da
Remove qpath_res util function
camsteffen Jan 18, 2021
9abcfa5
Don't link with --export-dynamic on wasm32-wasi
sunfishcode Jan 21, 2021
e25959b
Make more traits of the From/Into family diagnostic items
flip1995 Jan 22, 2021
435b909
Split JSON into separately versioned crate
CraftSpider Jan 22, 2021
bb65513
Update cargo.lock
CraftSpider Jan 22, 2021
d6909e1
Allow rustc::default_hash_types in the offending statement
CraftSpider Jan 22, 2021
1a78a89
Move into src/etc
CraftSpider Jan 22, 2021
c28427a
Simplify conversion
CraftSpider Jan 22, 2021
3b8f1b7
Make `-Z time-passes` less noisy
jyn514 Jan 22, 2021
f241c10
Improve flatten-fuse tests
SkiFire13 Jan 23, 2021
5aa625b
Manually fuse the inner iterator in FlattenCompat
SkiFire13 Jan 23, 2021
36284a3
`src/etc/json-types` -> `src/rustdoc-json-types`
CraftSpider Jan 24, 2021
26b4baf
Point to span of upvar making closure FnMut
sledgehammervampire Jan 18, 2021
6cbc4c2
Update crate name and add README
CraftSpider Jan 25, 2021
cf71d83
add tests
ChrisPardy Jan 26, 2021
cdcf92f
rustc: Stabilize `-Zrun-dsymutil` as `-Csplit-debuginfo`
alexcrichton Nov 30, 2020
2e846d6
Point only at generic arguments when they are unexpected
estebank Dec 1, 2020
2abb695
Rollup merge of #79570 - alexcrichton:split-debuginfo, r=bjorn3
Dylan-DPC Jan 27, 2021
fcbf3c0
Rollup merge of #79591 - estebank:unexpected-generics, r=oli-obk
Dylan-DPC Jan 27, 2021
e5cf216
Rollup merge of #80868 - johanngan:should-panic-msg-with-expected, r=…
Dylan-DPC Jan 27, 2021
6e50c94
Rollup merge of #81062 - sexxi-goose:precise_capture_diagnostics, r=n…
Dylan-DPC Jan 27, 2021
f852e71
Rollup merge of #81158 - 1000teslas:issue-80313-fix, r=Aaron1011
Dylan-DPC Jan 27, 2021
a886234
Rollup merge of #81176 - camsteffen:qpath-res, r=oli-obk
Dylan-DPC Jan 27, 2021
66a315f
Rollup merge of #81255 - sunfishcode:wasi-no-export-dynamic, r=alexcr…
Dylan-DPC Jan 27, 2021
b8a6a62
Rollup merge of #81277 - flip1995:from_diag_items, r=matthewjasper
Dylan-DPC Jan 27, 2021
b762665
Rollup merge of #81284 - jyn514:impl-times, r=wesleywiser
Dylan-DPC Jan 27, 2021
bfd4280
Rollup merge of #81287 - CraftSpider:json-crate, r=jyn514
Dylan-DPC Jan 27, 2021
7062fe0
Rollup merge of #81306 - SkiFire13:fuse-flatten, r=cuviper
Dylan-DPC Jan 27, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Point to span of upvar making closure FnMut
Add expected error

Add comment

Tweak comment wording

Fix after rebase to updated master

Fix after rebase to updated master

Distinguish mutation in normal and move closures

Tweak error message

Fix error message for nested closures

Refactor code showing mutated upvar in closure

Remove debug assert

B
  • Loading branch information
sledgehammervampire committed Jan 25, 2021
commit 26b4baf46ea66d3651281c8b66d76853e6362c65
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
use rustc_hir as hir;
use rustc_hir::Node;
use rustc_index::vec::Idx;
use rustc_middle::mir::{self, ClearCrossCrate, Local, LocalDecl, LocalInfo, Location};
use rustc_middle::mir::{Mutability, Place, PlaceRef, ProjectionElem};
use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_middle::{
hir::place::PlaceBase,
mir::{self, ClearCrossCrate, Local, LocalDecl, LocalInfo, Location},
};
use rustc_span::source_map::DesugaringKind;
use rustc_span::symbol::{kw, Symbol};
use rustc_span::Span;
Expand Down Expand Up @@ -241,6 +244,10 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
format!("mut {}", self.local_names[local].unwrap()),
Applicability::MachineApplicable,
);
let tcx = self.infcx.tcx;
if let ty::Closure(id, _) = the_place_err.ty(self.body, tcx).ty.kind() {
self.show_mutating_upvar(tcx, id, the_place_err, &mut err);
}
}

// Also suggest adding mut for upvars
Expand Down Expand Up @@ -271,6 +278,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
);
}
}

let tcx = self.infcx.tcx;
if let ty::Ref(_, ty, Mutability::Mut) = the_place_err.ty(self.body, tcx).ty.kind()
{
if let ty::Closure(id, _) = ty.kind() {
self.show_mutating_upvar(tcx, id, the_place_err, &mut err);
}
}
}

// complete hack to approximate old AST-borrowck
Expand Down Expand Up @@ -463,6 +478,45 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
err.buffer(&mut self.errors_buffer);
}

// point to span of upvar making closure call require mutable borrow
fn show_mutating_upvar(
&self,
tcx: TyCtxt<'_>,
id: &hir::def_id::DefId,
the_place_err: PlaceRef<'tcx>,
err: &mut DiagnosticBuilder<'_>,
) {
let id = id.expect_local();
let tables = tcx.typeck(id);
let hir_id = tcx.hir().local_def_id_to_hir_id(id);
let (span, place) = &tables.closure_kind_origins()[hir_id];
let reason = if let PlaceBase::Upvar(upvar_id) = place.base {
let upvar = ty::place_to_string_for_capture(tcx, place);
match tables.upvar_capture(upvar_id) {
ty::UpvarCapture::ByRef(ty::UpvarBorrow {
kind: ty::BorrowKind::MutBorrow,
..
}) => {
format!("mutable borrow of `{}`", upvar)
}
ty::UpvarCapture::ByValue(_) => {
format!("possible mutation of `{}`", upvar)
}
_ => bug!("upvar `{}` borrowed, but not mutably", upvar),
}
} else {
bug!("not an upvar")
};
err.span_label(
*span,
format!(
"calling `{}` requires mutable binding due to {}",
self.describe_place(the_place_err).unwrap(),
reason
),
);
}

/// Targeted error when encountering an `FnMut` closure where an `Fn` closure was expected.
fn expected_fn_found_fn_mut_call(&self, err: &mut DiagnosticBuilder<'_>, sp: Span, act: &str) {
err.span_label(sp, format!("cannot {}", act));
Expand Down
4 changes: 3 additions & 1 deletion src/test/ui/borrowck/borrow-raw-address-of-mutability.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ error[E0596]: cannot borrow `f` as mutable, as it is not declared as mutable
|
LL | let f = || {
| - help: consider changing this to be mutable: `mut f`
...
LL | let y = &raw mut x;
| - calling `f` requires mutable binding due to mutable borrow of `x`
LL | };
LL | f();
| ^ cannot borrow as mutable

Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/closures/issue-80313-mutable-borrow-in-closure.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fn main() {
let mut my_var = false;
let callback = || {
&mut my_var;
};
callback(); //~ ERROR E0596
}
14 changes: 14 additions & 0 deletions src/test/ui/closures/issue-80313-mutable-borrow-in-closure.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0596]: cannot borrow `callback` as mutable, as it is not declared as mutable
--> $DIR/issue-80313-mutable-borrow-in-closure.rs:6:5
|
LL | let callback = || {
| -------- help: consider changing this to be mutable: `mut callback`
LL | &mut my_var;
| ------ calling `callback` requires mutable binding due to mutable borrow of `my_var`
LL | };
LL | callback();
| ^^^^^^^^ cannot borrow as mutable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0596`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fn main() {
let mut my_var = false;
let callback = move || {
&mut my_var;
};
callback(); //~ ERROR E0596
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0596]: cannot borrow `callback` as mutable, as it is not declared as mutable
--> $DIR/issue-80313-mutable-borrow-in-move-closure.rs:6:5
|
LL | let callback = move || {
| -------- help: consider changing this to be mutable: `mut callback`
LL | &mut my_var;
| ------ calling `callback` requires mutable binding due to possible mutation of `my_var`
LL | };
LL | callback();
| ^^^^^^^^ cannot borrow as mutable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0596`.
7 changes: 7 additions & 0 deletions src/test/ui/closures/issue-80313-mutation-in-closure.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fn main() {
let mut my_var = false;
let callback = || {
my_var = true;
};
callback(); //~ ERROR E0596
}
14 changes: 14 additions & 0 deletions src/test/ui/closures/issue-80313-mutation-in-closure.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0596]: cannot borrow `callback` as mutable, as it is not declared as mutable
--> $DIR/issue-80313-mutation-in-closure.rs:6:5
|
LL | let callback = || {
| -------- help: consider changing this to be mutable: `mut callback`
LL | my_var = true;
| ------ calling `callback` requires mutable binding due to mutable borrow of `my_var`
LL | };
LL | callback();
| ^^^^^^^^ cannot borrow as mutable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0596`.
7 changes: 7 additions & 0 deletions src/test/ui/closures/issue-80313-mutation-in-move-closure.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fn main() {
let mut my_var = false;
let callback = move || {
my_var = true;
};
callback(); //~ ERROR E0596
}
14 changes: 14 additions & 0 deletions src/test/ui/closures/issue-80313-mutation-in-move-closure.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0596]: cannot borrow `callback` as mutable, as it is not declared as mutable
--> $DIR/issue-80313-mutation-in-move-closure.rs:6:5
|
LL | let callback = move || {
| -------- help: consider changing this to be mutable: `mut callback`
LL | my_var = true;
| ------ calling `callback` requires mutable binding due to possible mutation of `my_var`
LL | };
LL | callback();
| ^^^^^^^^ cannot borrow as mutable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0596`.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ error[E0596]: cannot borrow `tick1` as mutable, as it is not declared as mutable
|
LL | let tick1 = || {
| ----- help: consider changing this to be mutable: `mut tick1`
LL | counter += 1;
| ------- calling `tick1` requires mutable binding due to mutable borrow of `counter`
...
LL | tick1();
| ^^^^^ cannot borrow as mutable
Expand All @@ -12,6 +14,8 @@ error[E0596]: cannot borrow `tick2` as mutable, as it is not declared as mutable
|
LL | let tick2 = || {
| ----- help: consider changing this to be mutable: `mut tick2`
LL | tick1();
| ----- calling `tick2` requires mutable binding due to mutable borrow of `tick1`
...
LL | tick2();
| ^^^^^ cannot borrow as mutable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ error[E0596]: cannot borrow `tick` as mutable, as it is not declared as mutable
--> $DIR/unboxed-closures-infer-fnmut-missing-mut.rs:7:5
|
LL | let tick = || counter += 1;
| ---- help: consider changing this to be mutable: `mut tick`
| ---- ------- calling `tick` requires mutable binding due to mutable borrow of `counter`
| |
| help: consider changing this to be mutable: `mut tick`
LL | tick();
| ^^^^ cannot borrow as mutable

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ error[E0596]: cannot borrow `tick` as mutable, as it is not declared as mutable
--> $DIR/unboxed-closures-infer-fnmut-move-missing-mut.rs:7:5
|
LL | let tick = move || counter += 1;
| ---- help: consider changing this to be mutable: `mut tick`
| ---- ------- calling `tick` requires mutable binding due to possible mutation of `counter`
| |
| help: consider changing this to be mutable: `mut tick`
LL | tick();
| ^^^^ cannot borrow as mutable

Expand Down