Skip to content

Treatment of bound / free regions is wrong #2981

Closed

Description

@nikomatsakis

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

Activity

  1. nikomatsakis commented on Jul 21, 2012

    @nikomatsakis
    ContributorAuthor

    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];
    }
    
  2. nikomatsakis commented on Dec 7, 2012

    @nikomatsakis
    ContributorAuthor

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

  3. added a commit that references this issue on Jun 4, 2024
    54f9267
  4. added a commit that references this issue on Aug 21, 2026
  5. added a commit that references this issue on Sep 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-lifetimesArea: Lifetimes / regions

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions