// compile-flags:-Zpolymorphize=on -Zprint-mono-items=lazy -Copt-level=1 #![crate_type = "rlib"] // This test checks that the polymorphization analysis correctly reduces the // generated mono items. mod functions { // Function doesn't have any type parameters to be unused. pub fn no_parameters() {} //~ MONO_ITEM fn functions::no_parameters // Function has an unused type parameter. pub fn unused() { } //~ MONO_ITEM fn functions::unused:: // Function uses type parameter in value of a binding. pub fn used_binding_value() { let _: T = Default::default(); } //~ MONO_ITEM fn functions::used_binding_value:: //~ MONO_ITEM fn functions::used_binding_value:: // Function uses type parameter in type of a binding. pub fn used_binding_type() { let _: Option = None; } //~ MONO_ITEM fn functions::used_binding_type:: //~ MONO_ITEM fn functions::used_binding_type:: // Function uses type parameter in argument. pub fn used_argument(_: T) { } //~ MONO_ITEM fn functions::used_argument:: //~ MONO_ITEM fn functions::used_argument:: // // Function uses type parameter in substitutions to another function. pub fn used_substs() { unused::() } //~ MONO_ITEM fn functions::used_substs:: //~ MONO_ITEM fn functions::used_substs:: } mod closures { // Function doesn't have any type parameters to be unused. pub fn no_parameters() { let _ = || {}; } //~ MONO_ITEM fn closures::no_parameters // Function has an unused type parameter in parent and closure. pub fn unused() -> u32 { let add_one = |x: u32| x + 1; add_one(3) } //~ MONO_ITEM fn closures::unused::::{closure#0} //~ MONO_ITEM fn closures::unused:: // Function has an unused type parameter in closure, but not in parent. pub fn used_parent() -> u32 { let _: T = Default::default(); let add_one = |x: u32| x + 1; add_one(3) } //~ MONO_ITEM fn closures::used_parent::::{closure#0} //~ MONO_ITEM fn closures::used_parent:: //~ MONO_ITEM fn closures::used_parent:: // Function uses type parameter in value of a binding in closure. pub fn used_binding_value() -> T { let x = || { let y: T = Default::default(); y }; x() } //~ MONO_ITEM fn closures::used_binding_value::::{closure#0} //~ MONO_ITEM fn closures::used_binding_value::::{closure#0} //~ MONO_ITEM fn closures::used_binding_value:: //~ MONO_ITEM fn closures::used_binding_value:: // Function uses type parameter in type of a binding in closure. pub fn used_binding_type() -> Option { let x = || { let y: Option = None; y }; x() } //~ MONO_ITEM fn closures::used_binding_type::::{closure#0} //~ MONO_ITEM fn closures::used_binding_type::::{closure#0} //~ MONO_ITEM fn closures::used_binding_type:: //~ MONO_ITEM fn closures::used_binding_type:: // Function and closure uses type parameter in argument. pub fn used_argument(t: T) -> u32 { let x = |_: T| 3; x(t) } //~ MONO_ITEM fn closures::used_argument::::{closure#0} //~ MONO_ITEM fn closures::used_argument::::{closure#0} //~ MONO_ITEM fn closures::used_argument:: //~ MONO_ITEM fn closures::used_argument:: // Closure uses type parameter in argument. pub fn used_argument_closure() -> u32 { let t: T = Default::default(); let x = |_: T| 3; x(t) } //~ MONO_ITEM fn closures::used_argument_closure::::{closure#0} //~ MONO_ITEM fn closures::used_argument_closure::::{closure#0} //~ MONO_ITEM fn closures::used_argument_closure:: //~ MONO_ITEM fn closures::used_argument_closure:: // Closure uses type parameter as upvar. pub fn used_upvar() -> T { let x: T = Default::default(); let y = || x; y() } //~ MONO_ITEM fn closures::used_upvar::::{closure#0} //~ MONO_ITEM fn closures::used_upvar::::{closure#0} //~ MONO_ITEM fn closures::used_upvar:: //~ MONO_ITEM fn closures::used_upvar:: // Closure uses type parameter in substitutions to another function. pub fn used_substs() { let x = || super::functions::unused::(); x() } //~ MONO_ITEM fn closures::used_substs::::{closure#0} //~ MONO_ITEM fn closures::used_substs::::{closure#0} //~ MONO_ITEM fn closures::used_substs:: //~ MONO_ITEM fn closures::used_substs:: } mod methods { pub struct Foo(F); impl Foo { // Function has an unused type parameter from impl. pub fn unused_impl() { } //~ MONO_ITEM fn methods::Foo::::unused_impl // Function has an unused type parameter from impl and fn. pub fn unused_both() { } //~ MONO_ITEM fn methods::Foo::::unused_both:: // Function uses type parameter from impl. pub fn used_impl() { let _: F = Default::default(); } //~ MONO_ITEM fn methods::Foo::::used_impl //~ MONO_ITEM fn methods::Foo::::used_impl // Function uses type parameter from impl. pub fn used_fn() { let _: G = Default::default(); } //~ MONO_ITEM fn methods::Foo::::used_fn:: //~ MONO_ITEM fn methods::Foo::::used_fn:: // Function uses type parameter from impl. pub fn used_both() { let _: F = Default::default(); let _: G = Default::default(); } //~ MONO_ITEM fn methods::Foo::::used_both:: //~ MONO_ITEM fn methods::Foo::::used_both:: // Function uses type parameter in substitutions to another function. pub fn used_substs() { super::functions::unused::() } //~ MONO_ITEM fn methods::Foo::::used_substs //~ MONO_ITEM fn methods::Foo::::used_substs // Function has an unused type parameter from impl and fn. pub fn closure_unused_all() -> u32 { let add_one = |x: u32| x + 1; add_one(3) } //~ MONO_ITEM fn methods::Foo::::closure_unused_all::::{closure#0} //~ MONO_ITEM fn methods::Foo::::closure_unused_all:: // Function uses type parameter from impl and fn in closure. pub fn closure_used_both() -> u32 { let add_one = |x: u32| { let _: F = Default::default(); let _: G = Default::default(); x + 1 }; add_one(3) } //~ MONO_ITEM fn methods::Foo::::closure_used_both::::{closure#0} //~ MONO_ITEM fn methods::Foo::::closure_used_both::::{closure#0} //~ MONO_ITEM fn methods::Foo::::closure_used_both:: //~ MONO_ITEM fn methods::Foo::::closure_used_both:: // Function uses type parameter from fn in closure. pub fn closure_used_fn() -> u32 { let add_one = |x: u32| { let _: G = Default::default(); x + 1 }; add_one(3) } //~ MONO_ITEM fn methods::Foo::::closure_used_fn::::{closure#0} //~ MONO_ITEM fn methods::Foo::::closure_used_fn::::{closure#0} //~ MONO_ITEM fn methods::Foo::::closure_used_fn:: //~ MONO_ITEM fn methods::Foo::::closure_used_fn:: // Function uses type parameter from impl in closure. pub fn closure_used_impl() -> u32 { let add_one = |x: u32| { let _: F = Default::default(); x + 1 }; add_one(3) } //~ MONO_ITEM fn methods::Foo::::closure_used_impl::::{closure#0} //~ MONO_ITEM fn methods::Foo::::closure_used_impl::::{closure#0} //~ MONO_ITEM fn methods::Foo::::closure_used_impl:: //~ MONO_ITEM fn methods::Foo::::closure_used_impl:: // Closure uses type parameter in substitutions to another function. pub fn closure_used_substs() { let x = || super::functions::unused::(); x() } //~ MONO_ITEM fn methods::Foo::::closure_used_substs::{closure#0} //~ MONO_ITEM fn methods::Foo::::closure_used_substs::{closure#0} //~ MONO_ITEM fn methods::Foo::::closure_used_substs //~ MONO_ITEM fn methods::Foo::::closure_used_substs } } fn dispatch() { functions::no_parameters(); functions::unused::(); functions::used_binding_value::(); functions::used_binding_type::(); functions::used_argument::(Default::default()); functions::used_substs::(); closures::no_parameters(); let _ = closures::unused::(); let _ = closures::used_parent::(); let _ = closures::used_binding_value::(); let _ = closures::used_binding_type::(); let _ = closures::used_argument::(Default::default()); let _ = closures::used_argument_closure::(); let _ = closures::used_upvar::(); let _ = closures::used_substs::(); methods::Foo::::unused_impl(); methods::Foo::::unused_both::(); methods::Foo::::used_impl(); methods::Foo::::used_fn::(); methods::Foo::::used_both::(); methods::Foo::::used_substs(); let _ = methods::Foo::::closure_unused_all::(); let _ = methods::Foo::::closure_used_both::(); let _ = methods::Foo::::closure_used_impl::(); let _ = methods::Foo::::closure_used_fn::(); let _ = methods::Foo::::closure_used_substs(); } //~ MONO_ITEM fn dispatch:: //~ MONO_ITEM fn dispatch:: pub fn foo() { // Generate two copies of each function to check that where the type parameter is unused, // there is only a single copy. dispatch::(); dispatch::(); } //~ MONO_ITEM fn foo @@ unused_type_parameters-cgu.0[External] // These are all the items that aren't relevant to the test. //~ MONO_ITEM fn ::default //~ MONO_ITEM fn ::default