Auto merge of #52115 - Dylan-DPC:feature/nll-liveness-regions, r=nikomatsakis
only compute liveness for variables whose types include regions Closes #52034 r? @nikomatsakis
This commit is contained in:
commit
874dec25ed
11 changed files with 304 additions and 359 deletions
|
|
@ -1,45 +0,0 @@
|
|||
// Copyright 2012-2016 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.
|
||||
|
||||
// compile-flags:-Zborrowck=mir
|
||||
|
||||
fn can_panic() -> Box<usize> {
|
||||
Box::new(44)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut x = Box::new(22);
|
||||
x = can_panic();
|
||||
}
|
||||
|
||||
// Check that:
|
||||
// - `_1` is the variable corresponding to `x`
|
||||
// and
|
||||
// - `_1` is live when `can_panic` is called (because it may be dropped)
|
||||
//
|
||||
// END RUST SOURCE
|
||||
// START rustc.main.nll.0.mir
|
||||
// bb0: {
|
||||
// | Live variables on entry to bb0[0]: []
|
||||
// StorageLive(_1);
|
||||
// | Live variables on entry to bb0[1]: []
|
||||
// _1 = const <std::boxed::Box<T>>::new(const 22usize) -> [return: bb2, unwind: bb1];
|
||||
// | Live variables on exit from bb0: [_1 (drop)]
|
||||
// }
|
||||
// END rustc.main.nll.0.mir
|
||||
// START rustc.main.nll.0.mir
|
||||
// bb2: {
|
||||
// | Live variables on entry to bb2[0]: [_1 (drop)]
|
||||
// StorageLive(_2);
|
||||
// | Live variables on entry to bb2[1]: [_1 (drop)]
|
||||
// _2 = const can_panic() -> [return: bb3, unwind: bb4];
|
||||
// | Live variables on exit from bb2: [_1 (drop), _2]
|
||||
// }
|
||||
// END rustc.main.nll.0.mir
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
// Copyright 2012-2016 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.
|
||||
|
||||
// compile-flags:-Zborrowck=mir
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
fn use_x(_: usize) -> bool { true }
|
||||
|
||||
fn main() {
|
||||
let mut x = 22;
|
||||
loop {
|
||||
// Key point: `x` not live on entry to this basic block.
|
||||
x = 55;
|
||||
if use_x(x) { break; }
|
||||
}
|
||||
}
|
||||
|
||||
// END RUST SOURCE
|
||||
// START rustc.main.nll.0.mir
|
||||
// bb3: {
|
||||
// | Live variables on entry to bb3[0]: []
|
||||
// _1 = const 55usize;
|
||||
// | Live variables on entry to bb3[1]: [_1]
|
||||
// StorageLive(_3);
|
||||
// | Live variables on entry to bb3[2]: [_1]
|
||||
// StorageLive(_4);
|
||||
// | Live variables on entry to bb3[3]: [_1]
|
||||
// _4 = _1;
|
||||
// | Live variables on entry to bb3[4]: [_4]
|
||||
// _3 = const use_x(move _4) -> [return: bb4, unwind: bb1];
|
||||
// | Live variables on exit from bb3: [_3]
|
||||
// }
|
||||
// END rustc.main.nll.0.mir
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
// Copyright 2012-2016 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.
|
||||
|
||||
// compile-flags:-Zborrowck=mir
|
||||
|
||||
fn cond() -> bool { false }
|
||||
|
||||
fn make_live(_: usize) { }
|
||||
|
||||
fn make_dead() { }
|
||||
|
||||
fn main() {
|
||||
let x = 5;
|
||||
|
||||
if cond() {
|
||||
make_live(x);
|
||||
} else {
|
||||
// x should be dead on entry to this block
|
||||
make_dead();
|
||||
}
|
||||
}
|
||||
|
||||
// END RUST SOURCE
|
||||
// START rustc.main.nll.0.mir
|
||||
// bb3: {
|
||||
// | Live variables on entry to bb3[0]: [_1]
|
||||
// StorageLive(_4);
|
||||
// | Live variables on entry to bb3[1]: [_1]
|
||||
// _4 = _1;
|
||||
// | Live variables on entry to bb3[2]: [_4]
|
||||
// _3 = const make_live(move _4) -> [return: bb5, unwind: bb1];
|
||||
// | Live variables on exit from bb3: []
|
||||
// }
|
||||
// END rustc.main.nll.0.mir
|
||||
// START rustc.main.nll.0.mir
|
||||
// bb4: {
|
||||
// | Live variables on entry to bb4[0]: []
|
||||
// _5 = const make_dead() -> [return: bb6, unwind: bb1];
|
||||
// | Live variables on exit from bb4: []
|
||||
// }
|
||||
// END rustc.main.nll.0.mir
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
// Copyright 2012-2016 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.
|
||||
|
||||
// Basic test for liveness constraints: the region (`R1`) that appears
|
||||
// in the type of `p` includes the points after `&v[0]` up to (but not
|
||||
// including) the call to `use_x`. The `else` branch is not included.
|
||||
|
||||
// compile-flags:-Zborrowck=mir -Zverbose
|
||||
// ^^^^^^^^^ force compiler to dump more region information
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
fn use_x(_: usize) -> bool { true }
|
||||
|
||||
fn main() {
|
||||
let mut v = [1, 2, 3];
|
||||
let p = &v[0];
|
||||
if true {
|
||||
use_x(*p);
|
||||
} else {
|
||||
use_x(22);
|
||||
}
|
||||
}
|
||||
|
||||
// END RUST SOURCE
|
||||
// START rustc.main.nll.0.mir
|
||||
// | '_#2r | {bb2[0..=1], bb3[0..=1]}
|
||||
// | '_#3r | {bb2[1], bb3[0..=1]}
|
||||
// ...
|
||||
// let _2: &'_#3r usize;
|
||||
// END rustc.main.nll.0.mir
|
||||
// START rustc.main.nll.0.mir
|
||||
// bb2: {
|
||||
// | Live variables on entry to bb2[0]: [_1, _3]
|
||||
// _2 = &'_#2r _1[_3];
|
||||
// | Live variables on entry to bb2[1]: [_2]
|
||||
// switchInt(const true) -> [false: bb4, otherwise: bb3];
|
||||
// | Live variables on exit from bb2: [_2]
|
||||
// }
|
||||
// END rustc.main.nll.0.mir
|
||||
// START rustc.main.nll.0.mir
|
||||
// bb3: {
|
||||
// | Live variables on entry to bb3[0]: [_2]
|
||||
// StorageLive(_7);
|
||||
// | Live variables on entry to bb3[1]: [_2]
|
||||
// _7 = (*_2);
|
||||
// | Live variables on entry to bb3[2]: [_7]
|
||||
// _6 = const use_x(move _7) -> [return: bb5, unwind: bb1];
|
||||
// | Live variables on exit from bb3: []
|
||||
// }
|
||||
// END rustc.main.nll.0.mir
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
// Copyright 2012-2016 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.
|
||||
|
||||
// Test for the subregion constraints. In this case, the region R3 on
|
||||
// `p` includes two disjoint regions of the control-flow graph. The
|
||||
// borrows in `&v[0]` and `&v[1]` each (in theory) have to outlive R3,
|
||||
// but only at a particular point, and hence they wind up including
|
||||
// distinct regions.
|
||||
//
|
||||
// FIXME(#43234) -- Well, this used to be true, but we modified NLL
|
||||
// for the time being to not take location into account.
|
||||
|
||||
// compile-flags:-Zborrowck=mir -Zverbose
|
||||
// ^^^^^^^^^ force compiler to dump more region information
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
fn use_x(_: usize) -> bool { true }
|
||||
|
||||
fn main() {
|
||||
let mut v = [1, 2, 3];
|
||||
let mut p = &v[0];
|
||||
if true {
|
||||
use_x(*p);
|
||||
} else {
|
||||
use_x(22);
|
||||
}
|
||||
|
||||
p = &v[1];
|
||||
use_x(*p);
|
||||
}
|
||||
|
||||
// END RUST SOURCE
|
||||
// START rustc.main.nll.0.mir
|
||||
// | '_#2r | {bb2[0..=1], bb3[0..=1], bb8[2..=4]}
|
||||
// ...
|
||||
// | '_#4r | {bb2[1], bb3[0..=1], bb8[1..=4]}
|
||||
// | '_#5r | {bb2[1], bb3[0..=1], bb8[2..=4]}
|
||||
// ...
|
||||
// let mut _2: &'_#5r usize;
|
||||
// ...
|
||||
// _2 = &'_#2r _1[_3];
|
||||
// ...
|
||||
// _2 = &'_#4r (*_10);
|
||||
// END rustc.main.nll.0.mir
|
||||
Loading…
Add table
Add a link
Reference in a new issue