diff options
| author | bors <bors@rust-lang.org> | 2014-04-23 12:01:53 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-04-23 12:01:53 -0700 |
| commit | 6beb376b5c27c6b028092f227f865ba564fea17b (patch) | |
| tree | b52fa55b56bb4c1b21d1753c7d5c2402894d3c9b /src/rustllvm/RustWrapper.cpp | |
| parent | b5dd3f05fe95168b5569d0f519636149479eb6ac (diff) | |
| parent | 823c7eee6a040862abb5a5309693030394200e62 (diff) | |
| download | rust-6beb376b5c27c6b028092f227f865ba564fea17b.tar.gz rust-6beb376b5c27c6b028092f227f865ba564fea17b.zip | |
auto merge of #13686 : alexcrichton/rust/issue-12224, r=nikomatsakis
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
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
0 files changed, 0 insertions, 0 deletions
