]> git.lizzy.rs Git - rust.git/blob - src/test/ui/closures/closure-return-type-must-be-sized.rs
Rollup merge of #102794 - dtolnay:termination, r=thomcc
[rust.git] / src / test / ui / closures / closure-return-type-must-be-sized.rs
1 #![feature(unboxed_closures)]
2
3 trait A {
4     fn a() where Self: Sized;
5 }
6
7 mod a {
8     use crate::A;
9
10     pub fn foo<F: FnOnce<()>>() where F::Output: A {
11         F::Output::a()
12     }
13
14     pub fn bar<F: FnOnce() -> R, R: ?Sized>() {}
15
16     pub fn baz<F: FnOnce<()>>() where F::Output: A, F::Output: Sized {
17         F::Output::a()
18     }
19 }
20
21 mod b {
22     use crate::A;
23
24     pub fn foo<F: Fn<()>>() where F::Output: A {
25         F::Output::a()
26     }
27
28     pub fn bar<F: Fn() -> R, R: ?Sized>() {}
29
30     pub fn baz<F: Fn<()>>() where F::Output: A, F::Output: Sized {
31         F::Output::a()
32     }
33 }
34
35 mod c {
36     use crate::A;
37
38     pub fn foo<F: FnMut<()>>() where F::Output: A {
39         F::Output::a()
40     }
41
42     pub fn bar<F: FnMut() -> R, R: ?Sized>() {}
43
44     pub fn baz<F: FnMut<()>>() where F::Output: A, F::Output: Sized {
45         F::Output::a()
46     }
47 }
48
49 impl A for Box<dyn A> {
50     fn a() {}
51 }
52
53 fn main() {
54     a::foo::<fn() -> dyn A>();         //~ ERROR E0277
55     a::bar::<fn() -> dyn A, _>();      //~ ERROR E0277
56     a::baz::<fn() -> dyn A>();         //~ ERROR E0277
57     a::foo::<fn() -> Box<dyn A>>();    //  ok
58     a::bar::<fn() -> Box<dyn A>, _>(); //  ok
59     a::baz::<fn() -> Box<dyn A>>();    //  ok
60
61     b::foo::<fn() -> dyn A>();         //~ ERROR E0277
62     b::bar::<fn() -> dyn A, _>();      //~ ERROR E0277
63     b::baz::<fn() -> dyn A>();         //~ ERROR E0277
64     b::foo::<fn() -> Box<dyn A>>();    //  ok
65     b::bar::<fn() -> Box<dyn A>, _>(); //  ok
66     b::baz::<fn() -> Box<dyn A>>();    //  ok
67
68     c::foo::<fn() -> dyn A>();         //~ ERROR E0277
69     c::bar::<fn() -> dyn A, _>();      //~ ERROR E0277
70     c::baz::<fn() -> dyn A>();         //~ ERROR E0277
71     c::foo::<fn() -> Box<dyn A>>();    //  ok
72     c::bar::<fn() -> Box<dyn A>, _>(); //  ok
73     c::baz::<fn() -> Box<dyn A>>();    //  ok
74 }