]>
Commit | Line | Data |
---|---|---|
3dfed10e XL |
1 | // build-fail |
2 | // compile-flags:-Zpolymorphize=on | |
94222f64 XL |
3 | #![feature(generic_const_exprs, rustc_attrs)] |
4 | //~^ WARN the feature `generic_const_exprs` is incomplete | |
3dfed10e XL |
5 | |
6 | // This test checks that the polymorphization analysis correctly detects unused const | |
7 | // parameters in closures. | |
8 | ||
9 | // Function doesn't have any generic parameters to be unused. | |
10 | #[rustc_polymorphize_error] | |
11 | pub fn no_parameters() { | |
12 | let _ = || {}; | |
13 | } | |
14 | ||
15 | // Function has an unused generic parameter in parent and closure. | |
16 | #[rustc_polymorphize_error] | |
17 | pub fn unused<const T: usize>() -> usize { | |
18 | //~^ ERROR item has unused generic parameters | |
19 | let add_one = |x: usize| x + 1; | |
20 | //~^ ERROR item has unused generic parameters | |
21 | add_one(3) | |
22 | } | |
23 | ||
24 | // Function has an unused generic parameter in closure, but not in parent. | |
25 | #[rustc_polymorphize_error] | |
26 | pub fn used_parent<const T: usize>() -> usize { | |
27 | let x: usize = T; | |
28 | let add_one = |x: usize| x + 1; | |
29 | //~^ ERROR item has unused generic parameters | |
30 | x + add_one(3) | |
31 | } | |
32 | ||
33 | // Function uses generic parameter in value of a binding in closure. | |
34 | #[rustc_polymorphize_error] | |
35 | pub fn used_binding<const T: usize>() -> usize { | |
36 | let x = || { | |
37 | let y: usize = T; | |
38 | y | |
39 | }; | |
40 | ||
41 | x() | |
42 | } | |
43 | ||
44 | // Closure uses a value as an upvar, which used the generic parameter. | |
45 | #[rustc_polymorphize_error] | |
46 | pub fn unused_upvar<const T: usize>() -> usize { | |
47 | let x: usize = T; | |
48 | let y = || x; | |
49 | //~^ ERROR item has unused generic parameters | |
50 | y() | |
51 | } | |
52 | ||
53 | // Closure uses generic parameter in substitutions to another function. | |
54 | #[rustc_polymorphize_error] | |
55 | pub fn used_substs<const T: usize>() -> usize { | |
56 | let x = || unused::<T>(); | |
57 | x() | |
58 | } | |
59 | ||
60 | fn main() { | |
61 | no_parameters(); | |
62 | let _ = unused::<1>(); | |
63 | let _ = used_parent::<1>(); | |
64 | let _ = used_binding::<1>(); | |
65 | let _ = unused_upvar::<1>(); | |
66 | let _ = used_substs::<1>(); | |
67 | } |