]> git.proxmox.com Git - rustc.git/blob - src/test/ui/polymorphization/const_parameters/closures.rs
New upstream version 1.66.0+dfsg1
[rustc.git] / src / test / ui / polymorphization / const_parameters / closures.rs
1 // build-fail
2 // compile-flags:-Zpolymorphize=on
3 #![feature(generic_const_exprs, rustc_attrs)]
4 //~^ WARN the feature `generic_const_exprs` is incomplete
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 }