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:
parent
c1d2d83ca3
commit
60eeed34af
9 changed files with 185 additions and 22 deletions
|
|
@ -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() {}
|
||||
|
|
|
|||
11
src/test/ui/nll/issue-48697.stderr
Normal file
11
src/test/ui/nll/issue-48697.stderr
Normal 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`.
|
||||
27
src/test/ui/nll/promoted-bounds.rs
Normal file
27
src/test/ui/nll/promoted-bounds.rs
Normal 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);
|
||||
}
|
||||
15
src/test/ui/nll/promoted-bounds.stderr
Normal file
15
src/test/ui/nll/promoted-bounds.stderr
Normal 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`.
|
||||
12
src/test/ui/nll/promoted-closure-pair.rs
Normal file
12
src/test/ui/nll/promoted-closure-pair.rs
Normal 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() {}
|
||||
12
src/test/ui/nll/promoted-closure-pair.stderr
Normal file
12
src/test/ui/nll/promoted-closure-pair.stderr
Normal 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`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue