-
Notifications
You must be signed in to change notification settings - Fork 13.3k
MIR borrowck: AST error message refers to kind of item that can't be borrowed #46629
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
I think the mc code sometimes generates ugly error messages - it should be called on the lvalue that causes the mutability error, not on the full lvalue - but you can use it as a reference to improve the errors. |
Note: if you do this correctly, you should also be able to reroute closure errors into things like E0387 - "cannot assign to data in a captured outer variable in an // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(unboxed_closures)]
// Tests that we can't assign to or mutably borrow upvars from `Fn`
// closures (issue #17780)
fn set(x: &mut usize) { *x = 5; }
fn to_fn<A,F:Fn<A>>(f: F) -> F { f }
fn to_fn_mut<A,F:FnMut<A>>(f: F) -> F { f }
fn main() {
// By-ref captures
{
let mut x = 0;
let _f = to_fn(|| x = 42); //~ ERROR cannot assign
let mut y = 0;
let _g = to_fn(|| set(&mut y)); //~ ERROR cannot borrow
let mut z = 0;
let _h = to_fn_mut(|| { set(&mut z); to_fn(|| z = 42); }); //~ ERROR cannot assign
}
// By-value captures
{
let mut x = 0;
let _f = to_fn(move || x = 42); //~ ERROR cannot assign
let mut y = 0;
let _g = to_fn(move || set(&mut y)); //~ ERROR cannot borrow
let mut z = 0;
let _h = to_fn_mut(move || { set(&mut z); to_fn(move || z = 42); }); //~ ERROR cannot assign
}
} |
In that case, the error message we emit is especially terrible, because it is not obvious that the problem is with the closure:
|
Semi-dup of #47388 |
It seems like we still say things like "immutable item". This doesn't seem great. Tagging for release candidate. |
|
Honestly, I think I would prefer to see this phrased rather differently. Something like: "cannot borrow |
e.g. in E0596:
AST borrowck knows that
x
is an "immutable local variable", but MIR semi-inaccurately calls it an immutable item:The AST code for doing that is actually in
mem_categorization
, and should be ported to MIR borrowck:rust/src/librustc/middle/mem_categorization.rs
Line 1450 in 02b4d3d
The text was updated successfully, but these errors were encountered: