]> git.proxmox.com Git - rustc.git/blame - 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
CommitLineData
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]
11pub fn no_parameters() {
12 let _ = || {};
13}
14
15// Function has an unused generic parameter in parent and closure.
16#[rustc_polymorphize_error]
17pub 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]
26pub 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]
35pub 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]
46pub 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]
55pub fn used_substs<const T: usize>() -> usize {
56 let x = || unused::<T>();
57 x()
58}
59
60fn 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}