6beb376b5c
This alters the borrow checker's requirements on invoking closures from requiring an immutable borrow to requiring a unique immutable borrow. This means that it is illegal to invoke a closure through a `&` pointer because there is no guarantee that is not aliased. This does not mean that a closure is required to be in a mutable location, but rather a location which can be proven to be unique (often through a mutable pointer). For example, the following code is unsound and is no longer allowed: type Fn<'a> = ||:'a; fn call(f: |Fn|) { f(|| { f(|| {}) }); } fn main() { call(|a| { a(); }); } There is no replacement for this pattern. For all closures which are stored in structures, it was previously allowed to invoke the closure through `&self` but it now requires invocation through `&mut self`. The standard library has a good number of violations of this new rule, but the fixes will be separated into multiple breaking change commits. Closes #12224 |
||
---|---|---|
.. | ||
borrowck | ||
cfg | ||
trans | ||
typeck | ||
astencode.rs | ||
check_const.rs | ||
check_loop.rs | ||
check_match.rs | ||
check_static.rs | ||
const_eval.rs | ||
dataflow.rs | ||
dead.rs | ||
effect.rs | ||
entry.rs | ||
freevars.rs | ||
graph.rs | ||
kind.rs | ||
lang_items.rs | ||
lint.rs | ||
liveness.rs | ||
mem_categorization.rs | ||
moves.rs | ||
pat_util.rs | ||
privacy.rs | ||
reachable.rs | ||
region.rs | ||
resolve_lifetime.rs | ||
resolve.rs | ||
subst.rs | ||
ty_fold.rs | ||
ty.rs |