]> git.lizzy.rs Git - rust.git/blob - tests/ui/polymorphization/type_parameters/functions.rs
Merge commit '7d53619064ab7045c383644cb445052d2a3d46db' into sync_cg_clif-2023-02-09
[rust.git] / tests / ui / polymorphization / type_parameters / functions.rs
1 // build-fail
2 // compile-flags:-Zpolymorphize=on
3 #![feature(rustc_attrs)]
4
5 // This test checks that the polymorphization analysis correctly detects unused type
6 // parameters in functions.
7
8 // Function doesn't have any generic parameters to be unused.
9 #[rustc_polymorphize_error]
10 pub fn no_parameters() {}
11
12 // Function has an unused generic parameter.
13 #[rustc_polymorphize_error]
14 pub fn unused<T>() {
15     //~^ ERROR item has unused generic parameters
16 }
17
18 // Function uses generic parameter in value of a binding.
19 #[rustc_polymorphize_error]
20 pub fn used_binding_value<T: Default>() {
21     let _: T = Default::default();
22 }
23
24 // Function uses generic parameter in generic of a binding.
25 #[rustc_polymorphize_error]
26 pub fn used_binding_generic<T>() {
27     let _: Option<T> = None;
28 }
29
30 // Function uses generic parameter in argument.
31 #[rustc_polymorphize_error]
32 pub fn used_argument<T>(_: T) {}
33
34 // Function uses generic parameter in substitutions to another function.
35 #[rustc_polymorphize_error]
36 pub fn used_substs<T>() {
37     unused::<T>()
38 }
39
40 struct Foo<F>(F);
41
42 impl<F: Default> Foo<F> {
43     // Function has an unused generic parameter from impl.
44     #[rustc_polymorphize_error]
45     pub fn unused_impl() {
46         //~^ ERROR item has unused generic parameters
47     }
48
49     // Function has an unused generic parameter from impl and fn.
50     #[rustc_polymorphize_error]
51     pub fn unused_both<G: Default>() {
52         //~^ ERROR item has unused generic parameters
53     }
54
55     // Function uses generic parameter from impl.
56     #[rustc_polymorphize_error]
57     pub fn used_impl() {
58         let _: F = Default::default();
59     }
60
61     // Function uses generic parameter from impl.
62     #[rustc_polymorphize_error]
63     pub fn used_fn<G: Default>() {
64         //~^ ERROR item has unused generic parameters
65         let _: G = Default::default();
66     }
67
68     // Function uses generic parameter from impl.
69     #[rustc_polymorphize_error]
70     pub fn used_both<G: Default>() {
71         let _: F = Default::default();
72         let _: G = Default::default();
73     }
74
75     // Function uses generic parameter in substitutions to another function.
76     #[rustc_polymorphize_error]
77     pub fn used_substs() {
78         unused::<F>()
79     }
80 }
81
82 fn main() {
83     no_parameters();
84     unused::<u32>();
85     used_binding_value::<u32>();
86     used_binding_generic::<u32>();
87     used_argument(3u32);
88     used_substs::<u32>();
89
90     Foo::<u32>::unused_impl();
91     Foo::<u32>::unused_both::<u32>();
92     Foo::<u32>::used_impl();
93     Foo::<u32>::used_fn::<u32>();
94     Foo::<u32>::used_both::<u32>();
95     Foo::<u32>::used_substs();
96 }