Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Treatment of bound / free regions is wrong #2981

Closed
nikomatsakis opened this issue Jul 21, 2012 · 2 comments
Closed

Treatment of bound / free regions is wrong #2981

nikomatsakis opened this issue Jul 21, 2012 · 2 comments
Assignees
Labels
A-lifetimes Area: Lifetimes / regions
Milestone

Comments

@nikomatsakis
Copy link
Contributor

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];
}
@nikomatsakis
Copy link
Contributor Author

Another test case:

// 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];
}

@nikomatsakis
Copy link
Contributor Author

This is fixed, although I'd still to convert the codebase to using debruijn indices or something similar.

RalfJung pushed a commit to RalfJung/rust that referenced this issue Jul 23, 2023
style checks: use latest rustc for cron job
celinval pushed a commit to celinval/rust-dev that referenced this issue Jun 4, 2024
The values of environment variables in the benchcomp configuration file
can now contain strings of the form '${var}'. Benchcomp will replace
these strings with the value of the environment variable 'var'. This is
intended to allow users to have several benchcomp variants, each of
which differs only in the environment.

This fixes rust-lang#2981.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-lifetimes Area: Lifetimes / regions
Projects
None yet
Development

No branches or pull requests

1 participant