summaryrefslogtreecommitdiffstats
path: root/src/test/ui/functions-closures/closure-expected-type/supply-just-return-type.rs
blob: e9964531c3c0c0e8be30f425e72541263f4c0262 (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
// run-pass
fn with_closure<F, R>(f: F) -> Result<char, R>
    where F: FnOnce(&char) -> Result<char, R>,
{
    f(&'a')
}

fn main() {
    // Test that supplying the `-> Result<char, ()>` manually here
    // (which is needed to constrain `R`) still allows us to figure
    // out that the type of `x` is `&'a char` where `'a` is bound in
    // the closure (if we didn't, we'd get a type-error because
    // `with_closure` requires a bound region).
    //
    // This pattern was found in the wild.
    let z = with_closure(|x| -> Result<char, ()> { Ok(*x) });
    assert_eq!(z.unwrap(), 'a');

    // It also works with `_`:
    let z = with_closure(|x: _| -> Result<char, ()> { Ok(*x) });
    assert_eq!(z.unwrap(), 'a');

    // It also works with `&_`:
    let z = with_closure(|x: &_| -> Result<char, ()> { Ok(*x) });
    assert_eq!(z.unwrap(), 'a');
}