]>
git.proxmox.com Git - rustc.git/blob - src/test/codegen-units/polymorphization/unused_type_parameters.rs
1 // compile-flags:-Zpolymorphize=on -Zprint-mono-items=lazy -Copt-level=1
3 #![crate_type = "rlib"]
5 // This test checks that the polymorphization analysis correctly reduces the
6 // generated mono items.
9 // Function doesn't have any type parameters to be unused.
10 pub fn no_parameters() {}
12 //~ MONO_ITEM fn functions::no_parameters
14 // Function has an unused type parameter.
18 //~ MONO_ITEM fn functions::unused::<T>
20 // Function uses type parameter in value of a binding.
21 pub fn used_binding_value
<T
: Default
>() {
22 let _
: T
= Default
::default();
25 //~ MONO_ITEM fn functions::used_binding_value::<u32>
26 //~ MONO_ITEM fn functions::used_binding_value::<u64>
28 // Function uses type parameter in type of a binding.
29 pub fn used_binding_type
<T
>() {
30 let _
: Option
<T
> = None
;
33 //~ MONO_ITEM fn functions::used_binding_type::<u32>
34 //~ MONO_ITEM fn functions::used_binding_type::<u64>
36 // Function uses type parameter in argument.
37 pub fn used_argument
<T
>(_
: T
) {
40 //~ MONO_ITEM fn functions::used_argument::<u32>
41 //~ MONO_ITEM fn functions::used_argument::<u64>
43 // Function uses type parameter in substitutions to another function.
44 pub fn used_substs
<T
>() {
48 //~ MONO_ITEM fn functions::used_substs::<u32>
49 //~ MONO_ITEM fn functions::used_substs::<u64>
54 // Function doesn't have any type parameters to be unused.
55 pub fn no_parameters() {
59 //~ MONO_ITEM fn closures::no_parameters
61 // Function has an unused type parameter in parent and closure.
62 pub fn unused
<T
>() -> u32 {
63 let add_one
= |x
: u32| x
+ 1;
67 //~ MONO_ITEM fn closures::unused::<T>::{closure#0}
68 //~ MONO_ITEM fn closures::unused::<T>
70 // Function has an unused type parameter in closure, but not in parent.
71 pub fn used_parent
<T
: Default
>() -> u32 {
72 let _
: T
= Default
::default();
73 let add_one
= |x
: u32| x
+ 1;
77 //~ MONO_ITEM fn closures::used_parent::<T>::{closure#0}
78 //~ MONO_ITEM fn closures::used_parent::<u32>
79 //~ MONO_ITEM fn closures::used_parent::<u64>
81 // Function uses type parameter in value of a binding in closure.
82 pub fn used_binding_value
<T
: Default
>() -> T
{
84 let y
: T
= Default
::default();
91 //~ MONO_ITEM fn closures::used_binding_value::<u32>::{closure#0}
92 //~ MONO_ITEM fn closures::used_binding_value::<u64>::{closure#0}
93 //~ MONO_ITEM fn closures::used_binding_value::<u32>
94 //~ MONO_ITEM fn closures::used_binding_value::<u64>
96 // Function uses type parameter in type of a binding in closure.
97 pub fn used_binding_type
<T
>() -> Option
<T
> {
99 let y
: Option
<T
> = None
;
106 //~ MONO_ITEM fn closures::used_binding_type::<u32>::{closure#0}
107 //~ MONO_ITEM fn closures::used_binding_type::<u64>::{closure#0}
108 //~ MONO_ITEM fn closures::used_binding_type::<u32>
109 //~ MONO_ITEM fn closures::used_binding_type::<u64>
111 // Function and closure uses type parameter in argument.
112 pub fn used_argument
<T
>(t
: T
) -> u32 {
117 //~ MONO_ITEM fn closures::used_argument::<u32>::{closure#0}
118 //~ MONO_ITEM fn closures::used_argument::<u64>::{closure#0}
119 //~ MONO_ITEM fn closures::used_argument::<u32>
120 //~ MONO_ITEM fn closures::used_argument::<u64>
122 // Closure uses type parameter in argument.
123 pub fn used_argument_closure
<T
: Default
>() -> u32 {
124 let t
: T
= Default
::default();
129 //~ MONO_ITEM fn closures::used_argument_closure::<u32>::{closure#0}
130 //~ MONO_ITEM fn closures::used_argument_closure::<u64>::{closure#0}
131 //~ MONO_ITEM fn closures::used_argument_closure::<u32>
132 //~ MONO_ITEM fn closures::used_argument_closure::<u64>
134 // Closure uses type parameter as upvar.
135 pub fn used_upvar
<T
: Default
>() -> T
{
136 let x
: T
= Default
::default();
141 //~ MONO_ITEM fn closures::used_upvar::<u32>::{closure#0}
142 //~ MONO_ITEM fn closures::used_upvar::<u64>::{closure#0}
143 //~ MONO_ITEM fn closures::used_upvar::<u32>
144 //~ MONO_ITEM fn closures::used_upvar::<u64>
146 // Closure uses type parameter in substitutions to another function.
147 pub fn used_substs
<T
>() {
148 let x
= || super::functions
::unused
::<T
>();
152 //~ MONO_ITEM fn closures::used_substs::<u32>::{closure#0}
153 //~ MONO_ITEM fn closures::used_substs::<u64>::{closure#0}
154 //~ MONO_ITEM fn closures::used_substs::<u32>
155 //~ MONO_ITEM fn closures::used_substs::<u64>
159 pub struct Foo
<F
>(F
);
161 impl<F
: Default
> Foo
<F
> {
162 // Function has an unused type parameter from impl.
163 pub fn unused_impl() {
166 //~ MONO_ITEM fn methods::Foo::<F>::unused_impl
168 // Function has an unused type parameter from impl and fn.
169 pub fn unused_both
<G
: Default
>() {
172 //~ MONO_ITEM fn methods::Foo::<F>::unused_both::<G>
174 // Function uses type parameter from impl.
176 let _
: F
= Default
::default();
179 //~ MONO_ITEM fn methods::Foo::<u32>::used_impl
180 //~ MONO_ITEM fn methods::Foo::<u64>::used_impl
182 // Function uses type parameter from impl.
183 pub fn used_fn
<G
: Default
>() {
184 let _
: G
= Default
::default();
187 //~ MONO_ITEM fn methods::Foo::<F>::used_fn::<u32>
188 //~ MONO_ITEM fn methods::Foo::<F>::used_fn::<u64>
190 // Function uses type parameter from impl.
191 pub fn used_both
<G
: Default
>() {
192 let _
: F
= Default
::default();
193 let _
: G
= Default
::default();
196 //~ MONO_ITEM fn methods::Foo::<u32>::used_both::<u32>
197 //~ MONO_ITEM fn methods::Foo::<u64>::used_both::<u64>
199 // Function uses type parameter in substitutions to another function.
200 pub fn used_substs() {
201 super::functions
::unused
::<F
>()
204 //~ MONO_ITEM fn methods::Foo::<u32>::used_substs
205 //~ MONO_ITEM fn methods::Foo::<u64>::used_substs
207 // Function has an unused type parameter from impl and fn.
208 pub fn closure_unused_all
<G
: Default
>() -> u32 {
209 let add_one
= |x
: u32| x
+ 1;
213 //~ MONO_ITEM fn methods::Foo::<F>::closure_unused_all::<G>::{closure#0}
214 //~ MONO_ITEM fn methods::Foo::<F>::closure_unused_all::<G>
216 // Function uses type parameter from impl and fn in closure.
217 pub fn closure_used_both
<G
: Default
>() -> u32 {
218 let add_one
= |x
: u32| {
219 let _
: F
= Default
::default();
220 let _
: G
= Default
::default();
227 //~ MONO_ITEM fn methods::Foo::<u32>::closure_used_both::<u32>::{closure#0}
228 //~ MONO_ITEM fn methods::Foo::<u64>::closure_used_both::<u64>::{closure#0}
229 //~ MONO_ITEM fn methods::Foo::<u32>::closure_used_both::<u32>
230 //~ MONO_ITEM fn methods::Foo::<u64>::closure_used_both::<u64>
232 // Function uses type parameter from fn in closure.
233 pub fn closure_used_fn
<G
: Default
>() -> u32 {
234 let add_one
= |x
: u32| {
235 let _
: G
= Default
::default();
242 //~ MONO_ITEM fn methods::Foo::<F>::closure_used_fn::<u32>::{closure#0}
243 //~ MONO_ITEM fn methods::Foo::<F>::closure_used_fn::<u64>::{closure#0}
244 //~ MONO_ITEM fn methods::Foo::<F>::closure_used_fn::<u32>
245 //~ MONO_ITEM fn methods::Foo::<F>::closure_used_fn::<u64>
247 // Function uses type parameter from impl in closure.
248 pub fn closure_used_impl
<G
: Default
>() -> u32 {
249 let add_one
= |x
: u32| {
250 let _
: F
= Default
::default();
257 //~ MONO_ITEM fn methods::Foo::<u32>::closure_used_impl::<G>::{closure#0}
258 //~ MONO_ITEM fn methods::Foo::<u64>::closure_used_impl::<G>::{closure#0}
259 //~ MONO_ITEM fn methods::Foo::<u32>::closure_used_impl::<G>
260 //~ MONO_ITEM fn methods::Foo::<u64>::closure_used_impl::<G>
262 // Closure uses type parameter in substitutions to another function.
263 pub fn closure_used_substs() {
264 let x
= || super::functions
::unused
::<F
>();
268 //~ MONO_ITEM fn methods::Foo::<u32>::closure_used_substs::{closure#0}
269 //~ MONO_ITEM fn methods::Foo::<u64>::closure_used_substs::{closure#0}
270 //~ MONO_ITEM fn methods::Foo::<u32>::closure_used_substs
271 //~ MONO_ITEM fn methods::Foo::<u64>::closure_used_substs
277 fn dispatch
<T
: Default
>() {
278 functions
::no_parameters();
279 functions
::unused
::<T
>();
280 functions
::used_binding_value
::<T
>();
281 functions
::used_binding_type
::<T
>();
282 functions
::used_argument
::<T
>(Default
::default());
283 functions
::used_substs
::<T
>();
285 closures
::no_parameters();
286 let _
= closures
::unused
::<T
>();
287 let _
= closures
::used_parent
::<T
>();
288 let _
= closures
::used_binding_value
::<T
>();
289 let _
= closures
::used_binding_type
::<T
>();
290 let _
= closures
::used_argument
::<T
>(Default
::default());
291 let _
= closures
::used_argument_closure
::<T
>();
292 let _
= closures
::used_upvar
::<T
>();
293 let _
= closures
::used_substs
::<T
>();
295 methods
::Foo
::<T
>::unused_impl();
296 methods
::Foo
::<T
>::unused_both
::<T
>();
297 methods
::Foo
::<T
>::used_impl();
298 methods
::Foo
::<T
>::used_fn
::<T
>();
299 methods
::Foo
::<T
>::used_both
::<T
>();
300 methods
::Foo
::<T
>::used_substs();
301 let _
= methods
::Foo
::<T
>::closure_unused_all
::<T
>();
302 let _
= methods
::Foo
::<T
>::closure_used_both
::<T
>();
303 let _
= methods
::Foo
::<T
>::closure_used_impl
::<T
>();
304 let _
= methods
::Foo
::<T
>::closure_used_fn
::<T
>();
305 let _
= methods
::Foo
::<T
>::closure_used_substs();
308 //~ MONO_ITEM fn dispatch::<u32>
309 //~ MONO_ITEM fn dispatch::<u64>
312 // Generate two copies of each function to check that where the type parameter is unused,
313 // there is only a single copy.
318 //~ MONO_ITEM fn foo @@ unused_type_parameters-cgu.0[External]
320 // These are all the items that aren't relevant to the test.
321 //~ MONO_ITEM fn <u32 as std::default::Default>::default
322 //~ MONO_ITEM fn <u64 as std::default::Default>::default