From cf2dff2b1e3fa55fa5415d524200070d0d7aacfe Mon Sep 17 00:00:00 2001 From: Albert Larsan <74931857+albertlarsan68@users.noreply.github.com> Date: Thu, 5 Jan 2023 09:13:28 +0100 Subject: Move /src/test to /tests --- .../polymorphization/unused_type_parameters.rs | 322 +++++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 tests/codegen-units/polymorphization/unused_type_parameters.rs (limited to 'tests/codegen-units/polymorphization') diff --git a/tests/codegen-units/polymorphization/unused_type_parameters.rs b/tests/codegen-units/polymorphization/unused_type_parameters.rs new file mode 100644 index 00000000000..c2e06d067dc --- /dev/null +++ b/tests/codegen-units/polymorphization/unused_type_parameters.rs @@ -0,0 +1,322 @@ +// 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 -- cgit 1.4.1-3-g733a5