// build-fail // compile-flags:-Zpolymorphize=on #![feature(generic_const_exprs, rustc_attrs)] //~^ WARN the feature `generic_const_exprs` is incomplete // This test checks that the polymorphization analysis correctly detects unused const // parameters in closures. // Function doesn't have any generic parameters to be unused. #[rustc_polymorphize_error] pub fn no_parameters() { let _ = || {}; } // Function has an unused generic parameter in parent and closure. #[rustc_polymorphize_error] pub fn unused() -> usize { //~^ ERROR item has unused generic parameters let add_one = |x: usize| x + 1; //~^ ERROR item has unused generic parameters add_one(3) } // Function has an unused generic parameter in closure, but not in parent. #[rustc_polymorphize_error] pub fn used_parent() -> usize { let x: usize = T; let add_one = |x: usize| x + 1; //~^ ERROR item has unused generic parameters x + add_one(3) } // Function uses generic parameter in value of a binding in closure. #[rustc_polymorphize_error] pub fn used_binding() -> usize { let x = || { let y: usize = T; y }; x() } // Closure uses a value as an upvar, which used the generic parameter. #[rustc_polymorphize_error] pub fn unused_upvar() -> usize { let x: usize = T; let y = || x; //~^ ERROR item has unused generic parameters y() } // Closure uses generic parameter in substitutions to another function. #[rustc_polymorphize_error] pub fn used_substs() -> usize { let x = || unused::(); x() } fn main() { no_parameters(); let _ = unused::<1>(); let _ = used_parent::<1>(); let _ = used_binding::<1>(); let _ = unused_upvar::<1>(); let _ = used_substs::<1>(); }