summaryrefslogtreecommitdiffstats
path: root/src/test/ui/nll/issue-54779-anon-static-lifetime.rs
blob: 260b6b109ca9b016626953d67ff581e500bad048 (plain)
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
38
39
40
41
42
43
44
45
46
47
48
49
// Regression test for #54779, checks if the diagnostics are confusing.

trait DebugWith<Cx: ?Sized> {
    fn debug_with<'me>(&'me self, cx: &'me Cx) -> DebugCxPair<'me, Self, Cx> {
        DebugCxPair { value: self, cx }
    }

    fn fmt_with(&self, cx: &Cx, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result;
}

struct DebugCxPair<'me, Value: ?Sized, Cx: ?Sized>
where
    Value: DebugWith<Cx>,
{
    value: &'me Value,
    cx: &'me Cx,
}

trait DebugContext {}

struct Foo {
    bar: Bar,
}

impl DebugWith<dyn DebugContext> for Foo {
    fn fmt_with(
        &self,
        cx: &dyn DebugContext,
        fmt: &mut std::fmt::Formatter<'_>,
    ) -> std::fmt::Result {
        let Foo { bar } = self;
        bar.debug_with(cx); //~ ERROR: lifetime may not live long enough
        Ok(())
    }
}

struct Bar {}

impl DebugWith<dyn DebugContext> for Bar {
    fn fmt_with(
        &self,
        cx: &dyn DebugContext,
        fmt: &mut std::fmt::Formatter<'_>,
    ) -> std::fmt::Result {
        Ok(())
    }
}

fn main() {}