File: assoc-ty-wf-used-to-get-assoc-ty.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 893,176 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (27 lines) | stat: -rw-r--r-- 973 bytes parent folder | download | duplicates (10)
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
// Test for a less than ideal interaction of implied bounds and normalization.
trait Tr {
    type Ty;
}

impl<T: 'static> Tr for T {
    type Ty = &'static T;
}

// `<&'a u8 as Tr>::Ty` should cause an error because `&'a u8: Tr` doesn't hold for
// all possible 'a. However, we consider normalized types for implied bounds.
//
// We normalize this projection to `&'static &'a u8` and add a nested `&'a u8: 'static`
// bound. This bound is then proven using the implied bounds for `&'static &'a u8` which
// we only get by normalizing in the first place.
fn test<'a>(x: &'a u8, _wf: <&'a u8 as Tr>::Ty) -> &'static u8 { x }

fn main() {
    // This works as we have 'static references due to promotion.
    let _: &'static u8 = test(&3, &&3);
    // This causes an error because the projection requires 'a to be 'static.
    // It would be unsound if this compiled.
    let x: u8 = 3;
    let _: &'static u8 = test(&x, &&3);
    //~^ ERROR `x` does not live long enough

}