2 // compile-flags:-Zpolymorphize=on
3 #![feature(rustc_attrs)]
5 // This test checks that the polymorphization analysis correctly detects unused type
6 // parameters in functions.
8 // Function doesn't have any generic parameters to be unused.
9 #[rustc_polymorphize_error]
10 pub fn no_parameters() {}
12 // Function has an unused generic parameter.
13 #[rustc_polymorphize_error]
15 //~^ ERROR item has unused generic parameters
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();
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;
30 // Function uses generic parameter in argument.
31 #[rustc_polymorphize_error]
32 pub fn used_argument<T>(_: T) {}
34 // Function uses generic parameter in substitutions to another function.
35 #[rustc_polymorphize_error]
36 pub fn used_substs<T>() {
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
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
55 // Function uses generic parameter from impl.
56 #[rustc_polymorphize_error]
58 let _: F = Default::default();
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();
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();
75 // Function uses generic parameter in substitutions to another function.
76 #[rustc_polymorphize_error]
77 pub fn used_substs() {
85 used_binding_value::<u32>();
86 used_binding_generic::<u32>();
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();