Include bounds from promoted constants in NLL

Previously, a promoted that contains a function item wouldn't have the
function items bounds propagated to
the main function body.
This commit is contained in:
Matthew Jasper 2019-01-17 20:03:58 +00:00
parent c1d2d83ca3
commit 60eeed34af
9 changed files with 185 additions and 22 deletions

View file

@ -1,14 +1,12 @@
// Regression test for #48697
// compile-pass
#![feature(nll)]
fn foo(x: &i32) -> &i32 {
let z = 4;
let f = &|y| y;
let k = f(&z);
f(x)
f(x) //~ cannot return value referencing local variable
}
fn main() {}

View file

@ -0,0 +1,11 @@
error[E0515]: cannot return value referencing local variable `z`
--> $DIR/issue-48697.rs:9:5
|
LL | let k = f(&z);
| -- `z` is borrowed here
LL | f(x) //~ cannot return value referencing local variable
| ^^^^ returns a value referencing data owned by the current function
error: aborting due to previous error
For more information about this error, try `rustc --explain E0515`.

View file

@ -0,0 +1,27 @@
#![feature(nll)]
fn shorten_lifetime<'a, 'b, 'min>(a: &'a i32, b: &'b i32) -> &'min i32
where
'a: 'min,
'b: 'min,
{
if *a < *b {
&a
} else {
&b
}
}
fn main() {
let promoted_fn_item_ref = &shorten_lifetime;
let a = &5;
let ptr = {
let l = 3;
let b = &l; //~ ERROR does not live long enough
let c = promoted_fn_item_ref(a, b);
c
};
println!("ptr = {:?}", ptr);
}

View file

@ -0,0 +1,15 @@
error[E0597]: `l` does not live long enough
--> $DIR/promoted-bounds.rs:21:17
|
LL | let ptr = {
| --- borrow later stored here
LL | let l = 3;
LL | let b = &l; //~ ERROR does not live long enough
| ^^ borrowed value does not live long enough
...
LL | };
| - `l` dropped here while still borrowed
error: aborting due to previous error
For more information about this error, try `rustc --explain E0597`.

View file

@ -0,0 +1,12 @@
// Check that we handle multiple closures in the same promoted constant.
#![feature(nll)]
fn foo() -> &'static i32 {
let z = 0;
let p = &(|y| y, |y| y);
p.0(&z);
p.1(&z) //~ ERROR cannot return
}
fn main() {}

View file

@ -0,0 +1,12 @@
error[E0515]: cannot return value referencing local variable `z`
--> $DIR/promoted-closure-pair.rs:9:5
|
LL | p.1(&z) //~ ERROR cannot return
| ^^^^--^
| | |
| | `z` is borrowed here
| returns a value referencing data owned by the current function
error: aborting due to previous error
For more information about this error, try `rustc --explain E0515`.