File: non-defining-use-lifetimes.rs

package info (click to toggle)
rustc 1.86.0%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, forky, sid
  • size: 913,560 kB
  • sloc: xml: 158,127; python: 35,921; javascript: 19,689; sh: 19,600; cpp: 18,906; ansic: 13,124; asm: 4,376; makefile: 708; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (37 lines) | stat: -rw-r--r-- 1,053 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// issue: #111935

#![allow(unconditional_recursion)]

// Lt indirection is necessary to make the lifetime of the function late-bound,
// in order to bypass some other bugs.
type Lt<'lt> = Option<*mut &'lt ()>;

mod statik {
    use super::*;
    // invalid defining use: Opaque<'static> := ()
    fn foo<'a>(_: Lt<'a>) -> impl Sized + 'a {
        let _: () = foo(Lt::<'static>::None);
        //~^ ERROR expected generic lifetime parameter, found `'static`
    }
}

mod infer {
    use super::*;
    // invalid defining use: Opaque<'_> := ()
    fn foo<'a>(_: Lt<'a>) -> impl Sized + 'a {
        let _: () = foo(Lt::<'_>::None);
        //~^ ERROR expected generic lifetime parameter, found `'_`
    }
}

mod equal {
    use super::*;
    // invalid defining use: Opaque<'a, 'a> := ()
    // because of the use of equal lifetimes in args
    fn foo<'a, 'b>(_: Lt<'a>, _: Lt<'b>) -> impl Sized + 'a + 'b {
        let _: () = foo(Lt::<'a>::None, Lt::<'a>::None);
        //~^ ERROR non-defining opaque type use in defining scope
    }
}

fn main() {}