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