// build-fail // compile-flags:-Zpolymorphize=on #![feature(rustc_attrs)] // This test checks that the polymorphization analysis correctly detects unused type // parameters in functions. // Function doesn't have any generic parameters to be unused. #[rustc_polymorphize_error] pub fn no_parameters() {} // Function has an unused generic parameter. #[rustc_polymorphize_error] pub fn unused() { //~^ ERROR item has unused generic parameters } // Function uses generic parameter in value of a binding. #[rustc_polymorphize_error] pub fn used_binding_value() { let _: T = Default::default(); } // Function uses generic parameter in generic of a binding. #[rustc_polymorphize_error] pub fn used_binding_generic() { let _: Option = None; } // Function uses generic parameter in argument. #[rustc_polymorphize_error] pub fn used_argument(_: T) {} // Function uses generic parameter in substitutions to another function. #[rustc_polymorphize_error] pub fn used_substs() { unused::() } struct Foo(F); impl Foo { // Function has an unused generic parameter from impl. #[rustc_polymorphize_error] pub fn unused_impl() { //~^ ERROR item has unused generic parameters } // Function has an unused generic parameter from impl and fn. #[rustc_polymorphize_error] pub fn unused_both() { //~^ ERROR item has unused generic parameters } // Function uses generic parameter from impl. #[rustc_polymorphize_error] pub fn used_impl() { let _: F = Default::default(); } // Function uses generic parameter from impl. #[rustc_polymorphize_error] pub fn used_fn() { //~^ ERROR item has unused generic parameters let _: G = Default::default(); } // Function uses generic parameter from impl. #[rustc_polymorphize_error] pub fn used_both() { let _: F = Default::default(); let _: G = Default::default(); } // Function uses generic parameter in substitutions to another function. #[rustc_polymorphize_error] pub fn used_substs() { unused::() } } fn main() { no_parameters(); unused::(); used_binding_value::(); used_binding_generic::(); used_argument(3u32); used_substs::(); Foo::::unused_impl(); Foo::::unused_both::(); Foo::::used_impl(); Foo::::used_fn::(); Foo::::used_both::(); Foo::::used_substs(); }