You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The current code for handling bound regions is not right. We need to track node-ids uniformly and not only for free regions. Here is an example of a test case that fails. I have a partial fix for this, but not yet committed.
// Ensure that you cannot use generic types to return a region outside
// of its bound. Here, in the `return_it()` fn, we call with() but
// with R bound to &int from the return_it. Meanwhile, with()
// provides a value that is only good within its own stack frame. This
// used to successfully compile because we failed to account for the
// fact that fn(x: &int) rebound the region &.
fn with<R>(f: fn(x: &int) -> R) -> R {
f(&3)
}
fn return_it() -> &int {
with(|o| o) //~ ERROR mismatched types
//~^ ERROR reference is not valid outside of its lifetime
}
fn main() {
let x = return_it();
#debug["foo=%d", *x];
}
// Similar to regions-ret-borrowed.rs, but using a named lifetime. At
// some point regions-ret-borrowed reported an error but this file did
// not, due to special hardcoding around the anonymous region.
fn with<R>(f: fn(x: &a/int) -> R) -> R {
f(&3)
}
fn return_it() -> &a/int {
with(|o| o) //~ ERROR mismatched types
//~^ ERROR reference is not valid outside of its lifetime
}
fn main() {
let x = return_it();
#debug["foo=%d", *x];
}
Activity
nikomatsakis commentedon Jul 21, 2012
Another test case:
avoid capture of bound regions when infering types for closure
avoid capture of bound regions when infering types for closure
nikomatsakis commentedon Dec 7, 2012
This is fixed, although I'd still to convert the codebase to using debruijn indices or something similar.
Expand ${var} in benchcomp variant `env` (rust-lang#3090)
Merge rust-lang#2981
Merge pull request rust-lang#2981 from rust-lang/rustc-pull