On Thu, Nov 21, 2024 at 9:18 PM Jann Horn <jannh@xxxxxxxxxx> wrote: > > On Wed, Nov 20, 2024 at 11:56 PM Abdiel Janulgue > <abdiel.janulgue@xxxxxxxxx> wrote: > > On 19/11/2024 19:07, Jann Horn wrote: > > >> + pub fn page_slice_to_page<'a>(page: &PageSlice) -> Result<&'a Self> > > > > > > Sorry, can you explain to me what the semantics of this are? Does this > > > create a Page reference that is not lifetime-bound to the PageSlice? > > > > This creates a Page reference that is tied to the lifetime of the `C > > struct page` behind the PageSlice buffer. Basically, it's just a cast > > from the struct page pointer and does not own that resource. > > How is the Page reference tied to the lifetime of the C "struct page"? > > I asked some Rust experts to explain to me what this method signature > expands to, and they added the following to the Rust docs: > > https://github.com/rust-lang/reference/blob/master/src/lifetime-elision.md > ``` > fn other_args1<'a>(arg: &str) -> &'a str; // elided > fn other_args2<'a, 'b>(arg: &'b str) -> &'a str; // expanded > ``` > > Basically, my understanding is that since you are explicitly > specifying that the result should have lifetime 'a, but you are not > specifying the lifetime of the parameter, the parameter is given a > separate, unrelated lifetime by the compiler? Am I misunderstanding > how this works, or is that a typo in the method signature? No, you are correct. The signature is wrong and lets the caller pick any lifetime they want, with no relation to the lifetime of the underlying `struct page`.