Skip to content

Borrowed pointers inside enums #3166

Description

@Emm

The following code fails with:

argparse.rs:31:24: 34:21 error: mismatched types: expected `core::option::option<&str>` but found `core::option::option<&selfstr>` (reference with lifetime &self as defined on the block at 21:45 does not necessarily outlive reference with lifetime & as defined on the block at 21:45)
argparse.rs:31                 banner: match self.banner {
argparse.rs:32                         none => { none }
argparse.rs:33                         some(value) => { some(value) }
argparse.rs:34                     },
error: aborting due to previous error
mod argparse {
    use std;

    import std::map;
    import either::{either, left, right};

    struct Flag {
        name: &str;
        desc: &str;
        short_name: option<&str>;
        max_count: uint;
        banner: option<&str>;
        mut value: uint;
    }

    fn flag(name: &str, desc: &str) ⟶  Flag {
        Flag { name: name, desc: desc, short_name: none, max_count: 1, banner: none, value: 0 }
    }

    impl Flag {
        fn short_name(self, s: &str) ⟶  Flag {
            let new_banner : option<&str> = match self.banner {
                    none =>  { none }
                    some(value) =>  { some(value) }
                };
            Flag {
                name: self.name,
                desc: self.desc,
                short_name: some(s),
                max_count: self.max_count,
                banner: match self.banner {
                        none =>  { none }
                        some(value) =>  { some(value) }
                    },
                value: self.value
            }
        }
    }
}

fn main () {
    let f : argparse::Flag = argparse::flag(&"flag", &"My flag");
}

I would expect it to compile, given that the lifetime of the value inside the option will be the same as the lifetime of the other fields.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions