summaryrefslogtreecommitdiffstats
path: root/src/test/ui/nll/relate_tys/impl-fn-ignore-binder-via-bottom.rs
blob: 05e2ea047f65af722c5f6d59cde97252dde32839 (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
// Test that the NLL solver cannot find a solution
// for `exists<R1> { forall<R1> { R2: R1 } }`.
//
// In this test, the impl should match `fn(T)` for some `T`,
// but we ask it to match `for<'a> fn(&'a ())`. Due to argument
// contravariance, this effectively requires a `T = &'b ()` where
// `forall<'a> { 'a: 'b }`. Therefore, we get an error.
//
// Note the use of `-Zno-leak-check` here. This is presently required in order
// to skip the leak-check errors.
//
// c.f. Issue #57642.
//
// compile-flags:-Zno-leak-check

trait Y {
    type F;
    fn make_f() -> Self::F;
}

impl<T> Y for fn(T) {
    type F = fn(T);

    fn make_f() -> Self::F {
        |_| {}
    }
}

fn main() {
    let _x = <fn(&())>::make_f();
    //~^ ERROR implementation of `Y` is not general enough
    //~| ERROR implementation of `Y` is not general enough
    //~| ERROR implementation of `Y` is not general enough
}