thread through an implicit region body of the fn body

This commit is contained in:
Niko Matsakis 2017-12-04 05:40:43 -05:00
parent 154cd94197
commit c7cfa2367b
20 changed files with 135 additions and 45 deletions

View file

@ -27,16 +27,18 @@ fn main() {
// END RUST SOURCE
// START rustc.use_x.nll.0.mir
// | Free Region Mapping
// | '_#0r | Global | ['_#2r, '_#1r, '_#0r, '_#3r]
// | '_#1r | External | ['_#1r]
// | '_#2r | External | ['_#2r, '_#1r]
// | '_#3r | Local | ['_#3r]
// | '_#0r | Global | ['_#2r, '_#1r, '_#0r, '_#4r, '_#3r]
// | '_#1r | External | ['_#1r, '_#4r]
// | '_#2r | External | ['_#2r, '_#1r, '_#4r]
// | '_#3r | Local | ['_#4r, '_#3r]
// | '_#4r | Local | ['_#4r]
// |
// | Inferred Region Values
// | '_#0r | {'_#0r, bb0[0], bb0[1]}
// | '_#1r | {'_#1r, bb0[0], bb0[1]}
// | '_#2r | {'_#2r, bb0[0], bb0[1]}
// | '_#3r | {'_#3r, bb0[0], bb0[1]}
// | '_#4r | {'_#4r, bb0[0], bb0[1]}
// |
// ...
// fn use_x(_1: &'_#1r mut i32, _2: &'_#2r u32, _3: &'_#1r u32, _4: &'_#3r u32) -> bool {

View file

@ -28,11 +28,11 @@ fn main() {
// END RUST SOURCE
// START rustc.main.nll.0.mir
// | '_#6r | {bb0[6], bb0[7], bb0[8], bb0[9], bb0[10], bb0[11], bb0[12], bb0[13], bb0[14]}
// | '_#7r | {bb0[6], bb0[7], bb0[8], bb0[9], bb0[10], bb0[11], bb0[12], bb0[13], bb0[14]}
// ...
// | '_#8r | {bb0[11], bb0[12], bb0[13], bb0[14]}
// | '_#9r | {bb0[11], bb0[12], bb0[13], bb0[14]}
// ...
// let _2: &'_#6r mut i32;
// let _2: &'_#7r mut i32;
// ...
// let _4: &'_#8r mut i32;
// let _4: &'_#9r mut i32;
// END rustc.main.nll.0.mir

View file

@ -31,15 +31,15 @@ fn main() {
// END RUST SOURCE
// START rustc.main.nll.0.mir
// | '_#1r | {bb2[0], bb2[1], bb3[0], bb3[1]}
// | '_#2r | {bb2[1], bb3[0], bb3[1]}
// | '_#2r | {bb2[0], bb2[1], bb3[0], bb3[1]}
// | '_#3r | {bb2[1], bb3[0], bb3[1]}
// ...
// let _2: &'_#2r usize;
// 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 = &'_#1r _1[_3];
// _2 = &'_#2r _1[_3];
// | Live variables on entry to bb2[1]: [_2]
// switchInt(const true) -> [0u8: bb4, otherwise: bb3];
// }

View file

@ -44,5 +44,7 @@ unsafe impl<#[may_dangle] T> Drop for Wrap<T> {
// END RUST SOURCE
// START rustc.main.nll.0.mir
// | '_#5r | {bb2[3], bb2[4], bb2[5], bb3[0], bb3[1]}
// | '_#6r | {bb2[3], bb2[4], bb2[5], bb3[0], bb3[1]}
// ...
// let _2: Wrap<&'_#6r usize>;
// END rustc.main.nll.0.mir

View file

@ -46,5 +46,7 @@ impl<T> Drop for Wrap<T> {
// END RUST SOURCE
// START rustc.main.nll.0.mir
// | '_#5r | {bb2[3], bb2[4], bb2[5], bb3[0], bb3[1], bb3[2], bb4[0], bb5[0], bb5[1], bb5[2], bb6[0], bb7[0], bb7[1], bb8[0]}
// | '_#6r | {bb2[3], bb2[4], bb2[5], bb3[0], bb3[1], bb3[2], bb4[0], bb5[0], bb5[1], bb5[2], bb6[0], bb7[0], bb7[1], bb8[0]}
// ...
// let _2: Wrap<&'_#6r usize>;
// END rustc.main.nll.0.mir

View file

@ -36,14 +36,14 @@ fn main() {
// END RUST SOURCE
// START rustc.main.nll.0.mir
// | '_#1r | {bb2[0], bb2[1], bb3[0], bb3[1]}
// | '_#2r | {bb2[0], bb2[1], bb3[0], bb3[1]}
// ...
// | '_#3r | {bb8[1], bb8[2], bb8[3], bb8[4]}
// | '_#4r | {bb2[1], bb3[0], bb3[1], bb8[2], bb8[3], bb8[4]}
// | '_#4r | {bb8[1], bb8[2], bb8[3], bb8[4]}
// | '_#5r | {bb2[1], bb3[0], bb3[1], bb8[2], bb8[3], bb8[4]}
// ...
// let mut _2: &'_#4r usize;
// let mut _2: &'_#5r usize;
// ...
// _2 = &'_#1r _1[_3];
// _2 = &'_#2r _1[_3];
// ...
// _2 = &'_#3r (*_10);
// _2 = &'_#4r (*_10);
// END rustc.main.nll.0.mir

View file

@ -32,16 +32,16 @@ fn main() {
// END RUST SOURCE
// START rustc.main.nll.0.mir
// | '_#1r | {bb2[0], bb2[1], bb2[2], bb2[3], bb2[4], bb2[5], bb2[6], bb3[0], bb3[1]}
// | '_#2r | {bb2[1], bb2[2], bb2[3], bb2[4], bb2[5], bb2[6], bb3[0], bb3[1]}
// | '_#3r | {bb2[5], bb2[6], bb3[0], bb3[1]}
// | '_#2r | {bb2[0], bb2[1], bb2[2], bb2[3], bb2[4], bb2[5], bb2[6], bb3[0], bb3[1]}
// | '_#3r | {bb2[1], bb2[2], bb2[3], bb2[4], bb2[5], bb2[6], bb3[0], bb3[1]}
// | '_#4r | {bb2[5], bb2[6], bb3[0], bb3[1]}
// END rustc.main.nll.0.mir
// START rustc.main.nll.0.mir
// let _2: &'_#2r usize;
// let _2: &'_#3r usize;
// ...
// let _6: &'_#3r usize;
// let _6: &'_#4r usize;
// ...
// _2 = &'_#1r _1[_3];
// _2 = &'_#2r _1[_3];
// ...
// _7 = _2;
// ...

View file

@ -7,7 +7,7 @@ error[E0597]: `y` does not live long enough
37 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for lifetime '_#4r...
= note: borrowed value must be valid for lifetime '_#5r...
error: aborting due to previous error

View file

@ -32,7 +32,7 @@ error[E0597]: `y` does not live long enough
39 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for lifetime '_#5r...
= note: borrowed value must be valid for lifetime '_#6r...
error: aborting due to previous error

View file

@ -59,7 +59,7 @@ error[E0597]: `y` does not live long enough
36 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for lifetime '_#3r...
= note: borrowed value must be valid for lifetime '_#4r...
error: aborting due to previous error

View file

@ -36,7 +36,7 @@ error[E0597]: `y` does not live long enough
36 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for lifetime '_#3r...
= note: borrowed value must be valid for lifetime '_#4r...
error: aborting due to previous error

View file

@ -79,7 +79,7 @@ error[E0597]: `a` does not live long enough
49 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for lifetime '_#1r...
= note: borrowed value must be valid for lifetime '_#2r...
error: aborting due to 2 previous errors

View file

@ -10,13 +10,13 @@ warning: not reporting region error due to -Znll
40 | Box::new(x.next())
| ^^^^^^^^^^^^^^^^^^
error: failed type test: TypeTest { generic_kind: ProjectionTy { substs: Slice([T]), item_def_id: DefId(2/0:1695 ~ core[2633]::iter[0]::iterator[0]::Iterator[0]::Item[0]) }, lower_bound: '_#3r, point: bb5[0], span: $DIR/projection-fn.rs:24:5: 24:23, test: IsOutlivedByAnyRegionIn([]) }
error: failed type test: TypeTest { generic_kind: ProjectionTy { substs: Slice([T]), item_def_id: DefId(2/0:1695 ~ core[2633]::iter[0]::iterator[0]::Iterator[0]::Item[0]) }, lower_bound: '_#4r, point: bb5[0], span: $DIR/projection-fn.rs:24:5: 24:23, test: IsOutlivedByAnyRegionIn(['_#2r]) }
--> $DIR/projection-fn.rs:24:5
|
24 | Box::new(x.next())
| ^^^^^^^^^^^^^^^^^^
error: failed type test: TypeTest { generic_kind: ProjectionTy { substs: Slice([T]), item_def_id: DefId(2/0:1695 ~ core[2633]::iter[0]::iterator[0]::Iterator[0]::Item[0]) }, lower_bound: '_#4r, point: bb5[0], span: $DIR/projection-fn.rs:40:5: 40:23, test: IsOutlivedByAnyRegionIn(['_#2r]) }
error: failed type test: TypeTest { generic_kind: ProjectionTy { substs: Slice([T]), item_def_id: DefId(2/0:1695 ~ core[2633]::iter[0]::iterator[0]::Iterator[0]::Item[0]) }, lower_bound: '_#5r, point: bb5[0], span: $DIR/projection-fn.rs:40:5: 40:23, test: IsOutlivedByAnyRegionIn(['_#2r, '_#3r]) }
--> $DIR/projection-fn.rs:40:5
|
40 | Box::new(x.next())

View file

@ -0,0 +1,41 @@
// Copyright 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:-Znll -Zborrowck=mir
// Test that we assume that universal types like `T` outlive the
// function body.
#![allow(warnings)]
#![feature(dyn_trait)]
use std::cell::Cell;
// No errors here, because `'a` is local to the body.
fn region_within_body<T>(t: T) {
let some_int = 22;
let cell = Cell::new(&some_int);
outlives(cell, t)
}
// Error here, because T: 'a is not satisfied.
fn region_static<'a, T>(cell: Cell<&'a usize>, t: T) {
outlives(cell, t)
//~^ WARNING not reporting region error due to -Znll
//~| ERROR failed type test
}
fn outlives<'a, T>(x: Cell<&'a usize>, y: T)
where
T: 'a,
{
}
fn main() {}

View file

@ -0,0 +1,14 @@
warning: not reporting region error due to -Znll
--> $DIR/ty-param-fn-body.rs:30:5
|
30 | outlives(cell, t)
| ^^^^^^^^
error: failed type test: TypeTest { generic_kind: T/#0, lower_bound: '_#4r, point: bb0[4], span: $DIR/ty-param-fn-body.rs:30:5: 30:22, test: IsOutlivedByAnyRegionIn(['_#2r]) }
--> $DIR/ty-param-fn-body.rs:30:5
|
30 | outlives(cell, t)
| ^^^^^^^^^^^^^^^^^
error: aborting due to previous error

View file

@ -10,13 +10,13 @@ warning: not reporting region error due to -Znll
38 | x
| ^
error: failed type test: TypeTest { generic_kind: T/#1, lower_bound: '_#2r, point: bb0[3], span: $DIR/ty-param-fn.rs:22:5: 22:6, test: IsOutlivedByAnyRegionIn([]) }
error: failed type test: TypeTest { generic_kind: T/#1, lower_bound: '_#3r, point: bb0[3], span: $DIR/ty-param-fn.rs:22:5: 22:6, test: IsOutlivedByAnyRegionIn(['_#2r]) }
--> $DIR/ty-param-fn.rs:22:5
|
22 | x
| ^
error: failed type test: TypeTest { generic_kind: T/#2, lower_bound: '_#3r, point: bb0[3], span: $DIR/ty-param-fn.rs:38:5: 38:6, test: IsOutlivedByAnyRegionIn(['_#2r]) }
error: failed type test: TypeTest { generic_kind: T/#2, lower_bound: '_#4r, point: bb0[3], span: $DIR/ty-param-fn.rs:38:5: 38:6, test: IsOutlivedByAnyRegionIn(['_#2r, '_#3r]) }
--> $DIR/ty-param-fn.rs:38:5
|
38 | x