summaryrefslogtreecommitdiffstats
path: root/src/test/ui/implied-bounds/issue-100690.rs
blob: 5599cd410baadd8e734d6d0e48120b4ea0b48b27 (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
// This code (probably) _should_ compile, but it currently does not because we
// are not smart enough about implied bounds.

use std::io;

fn real_dispatch<T, F>(f: F) -> Result<(), io::Error>
//~^ NOTE required by a bound in this
where
    F: FnOnce(&mut UIView<T>) -> Result<(), io::Error> + Send + 'static,
    //~^ NOTE required by this bound in `real_dispatch`
    //~| NOTE required by a bound in `real_dispatch`
{
    todo!()
}

#[derive(Debug)]
struct UIView<'a, T: 'a> {
    _phantom: std::marker::PhantomData<&'a mut T>,
}

trait Handle<'a, T: 'a, V, R> {
    fn dispatch<F>(&self, f: F) -> Result<(), io::Error>
    where
        F: FnOnce(&mut V) -> R + Send + 'static;
}

#[derive(Debug, Clone)]
struct TUIHandle<T> {
    _phantom: std::marker::PhantomData<T>,
}

impl<'a, T: 'a> Handle<'a, T, UIView<'a, T>, Result<(), io::Error>> for TUIHandle<T> {
    fn dispatch<F>(&self, f: F) -> Result<(), io::Error>
    where
        F: FnOnce(&mut UIView<'a, T>) -> Result<(), io::Error> + Send + 'static,
    {
        real_dispatch(f)
        //~^ ERROR expected a `FnOnce<(&mut UIView<'_, T>,)>` closure, found `F`
        //~| NOTE expected an `FnOnce<(&mut UIView<'_, T>,)>` closure, found `F`
        //~| NOTE expected a closure with arguments
        //~| NOTE required by a bound introduced by this call
    }
}

fn main() {}