Add assert when dllmap is disabled and fix support build in netcore mode
[mono-project.git] / mono / tests / tailcall-generic-cast-nocrash-il.il
blob2c721e24f779dac7f266a37aa2e41b84571ee9fd
1 /*
2 Test tailcall-generic-cast-il.il.
4 Author:
5         Jay Krell (jaykrell@microsoft.com)
7 Copyright 2018 Microsoft
8 Licensed under the MIT license. See LICENSE file in the project root for full license information.
10 This derived from nearby tailcall-generic-cast-cs.cs.
13 .assembly extern mscorlib { }
15 .assembly 'tailcall-generic-cast-nocrash-il' { }
17 .class public A { }
19 .class public B
21         .method public instance void .ctor ( )
22         {
23                 ldarg.0
24                 tail. call instance void [mscorlib]System.Object::.ctor ( )
25                 ret
26         }
29 .class public C
31         .field private static int32 i
33         .method public static void
34         check (int64 stack1, int64 stack2) noinlining
35         {
37                 ldsfld int32 C::i
38                 ldc.i4.1
39                 add
40                 stsfld int32 C::i
41                 //ldarg.0
42                 //brfalse.s IL_0010
43                 //ret
45 //IL_0010:
46                 ldarg.0
47                 ldarg.1
48                 beq.s IL_0037
50                 ldstr "{0} tailcall failure"
51                 ldsfld int32 C::i
52                 box [mscorlib]System.Int32
53                 call void [mscorlib]System.Console::WriteLine (string, object)
54                 ldc.i4.1
55                 tail. call void [mscorlib]System.Environment::Exit (int32)
56 IL_0037:
58                 ret
59         }
61         .method public static !!T
62         cast1<T> (object o, int32 counter, int64 stack) noinlining
63         {
64                 .locals init (int32 V_0)
66                 ldarg.1
67                 ldc.i4.0
68                 ble.s IL_0012
70                 ldarg.0
71                 ldarg.1
72                 ldc.i4.1
73                 sub
74                 ldloca.s V_0
75                 conv.u
76                 conv.u8
77                 tail. call !!0 C::cast1<!!0> (object, int32, int64)
78                 ret
80 IL_0012:
81                 ldloca.s V_0
82                 conv.u
83                 conv.u8
84                 ldarg.2
85                 call void C::check (int64, int64)
86                 ldarg.0
87                 unbox.any !!T
88                 ret
89         }
91         .method public static class B
92         cast2 (object o, int32 counter, int64 stack) noinlining
93         {
94                 .locals init (int32 V_0)
96                 ldarg.1
97                 ldc.i4.0
98                 ble.s IL_0012
100                 ldarg.0
101                 ldarg.1
102                 ldc.i4.1
103                 sub
104                 ldloca.s V_0
105                 conv.u
106                 conv.u8
107                 tail. call class B C::cast2 (object, int32, int64)
108                 ret
110 IL_0012:
111                 ldloca.s V_0
112                 conv.u
113                 conv.u8
114                 ldarg.2
115                 call void C::check (int64, int64)
116                 ldarg.0
117                 ldc.i4.s 100
118                 ldc.i4.0
119                 conv.i8
120                 tail. call !!0 C::cast1<class B> (object, int32, int64)
121                 ret
122         }
124         .method public static !!T
125         cast3<T> (object o, int32 counter, int64 stack) noinlining
126         {
127                 .locals init (int32 V_0)
129                 ldarg.1
130                 ldc.i4.0
131                 ble.s IL_0012
133                 ldarg.0
134                 ldarg.1
135                 ldc.i4.1
136                 sub
137                 ldloca.s V_0
138                 conv.u
139                 conv.u8
140                 tail. call !!0 C::cast3<!!0> (object, int32, int64)
141                 ret
143 IL_0012:
144                 ldloca.s V_0
145                 conv.u
146                 conv.u8
147                 ldarg.2
148                 call void C::check (int64, int64)
149                 ldarg.0
150                 ldc.i4.s 100
151                 ldc.i4.0
152                 conv.i8
153                 tail. call !!0 C::cast1<!!0> (object, int32, int64)
154                 ret
155         }
157         .method public static class B[]
158         cast4 (object o, int32 counter, int64 stack) noinlining
159         {
160                 .locals init (int32 V_0)
162                 ldarg.1
163                 ldc.i4.0
164                 ble.s IL_0012
166                 ldarg.0
167                 ldarg.1
168                 ldc.i4.1
169                 sub
170                 ldloca.s V_0
171                 conv.u
172                 conv.u8
173                 tail. call class B[] C::cast4 (object, int32, int64)
174                 ret
176 IL_0012:
177                 ldloca.s V_0
178                 conv.u
179                 conv.u8
180                 ldarg.2
181                 call void C::check (int64, int64)
182                 ldarg.0
183                 ldc.i4.s 100
184                 ldc.i4.0
185                 conv.i8
186                 tail. call !!0 C::cast1<class B[]> (object, int32, int64)
187                 ret
188         }
190         .method public static !!T[]
191         cast5<T> (object o, int32 counter, int64 stack) noinlining
192         {
193                 .locals init (int32 V_0)
195                 ldarg.1
196                 ldc.i4.0
197                 ble.s IL_0012
199                 ldarg.0
200                 ldarg.1
201                 ldc.i4.1
202                 sub
203                 ldloca.s V_0
204                 conv.u
205                 conv.u8
206                 tail. call !!0[] C::cast5<!!0> (object, int32, int64)
207                 ret
209 IL_0012:
210                 ldloca.s V_0
211                 conv.u
212                 conv.u8
213                 ldarg.2
214                 call void C::check (int64, int64)
215                 ldarg.0
216                 ldc.i4.s 100
217                 ldc.i4.0
218                 conv.i8
219                 tail. call !!0 C::cast1<!!0[]> (object, int32, int64)
220                 ret
221         }
224 .class public D`1<T1>
226         .method public static void
227         check (int64 stack1, int64 stack2) noinlining
228         {
229                 ldarg.0
230                 ldarg.1
231                 tail. call void C::check (int64, int64)
232                 ret
233         }
235         .method public static !!T
236         cast1<T> (object o, int32 counter, int64 stack) noinlining
237         {
238                 .locals init (int32 V_0)
240                 ldarg.1
241                 ldc.i4.0
242                 ble.s IL_0012
244                 ldarg.0
245                 ldarg.1
246                 ldc.i4.1
247                 sub
248                 ldloca.s V_0
249                 conv.u
250                 conv.u8
251                 tail. call !!0 class D`1<!T1>::cast1<!!0> (object, int32, int64)
252                 ret
254 IL_0012:
255                 ldloca.s V_0
256                 conv.u
257                 conv.u8
258                 ldarg.2
259                 call void class D`1<!T1>::check (int64, int64)
260                 ldarg.0
261                 unbox.any !!T
262                 ret
263         }
265         .method public static class B
266         cast2 (object o, int32 counter, int64 stack) noinlining
267         {
268                 .locals init (int32 V_0)
270                 ldarg.1
271                 ldc.i4.0
272                 ble.s IL_0012
274                 ldarg.0
275                 ldarg.1
276                 ldc.i4.1
277                 sub
278                 ldloca.s V_0
279                 conv.u
280                 conv.u8
281                 tail. call class B class D`1<!T1>::cast2 (object, int32, int64)
282                 ret
284 IL_0012:
285                 ldloca.s V_0
286                 conv.u
287                 conv.u8
288                 ldarg.2
289                 call void class D`1<!T1>::check (int64, int64)
290                 ldarg.0
291                 ldc.i4.s 100
292                 ldc.i4.0
293                 conv.i8
294                 tail. call !!0 class D`1<!T1>::cast1<class B> (object, int32, int64)
295                 ret
296         }
298         .method public static !!T
299         cast3<T> (object o, int32 counter, int64 stack) noinlining
300         {
301                 .locals init (int32 V_0)
303                 ldarg.1
304                 ldc.i4.0
305                 ble.s IL_0012
307                 ldarg.0
308                 ldarg.1
309                 ldc.i4.1
310                 sub
311                 ldloca.s V_0
312                 conv.u
313                 conv.u8
314                 tail. call !!0 class D`1<!T1>::cast3<!!0> (object, int32, int64)
315                 ret
317 IL_0012:
318                 ldloca.s V_0
319                 conv.u
320                 conv.u8
321                 ldarg.2
322                 call void class D`1<!T1>::check (int64, int64)
323                 ldarg.0
324                 ldc.i4.s 100
325                 ldc.i4.0
326                 conv.i8
327                 tail. call !!0 class D`1<!T1>::cast1<!!0> (object, int32, int64)
328                 ret
329         }
331         .method public static class B[]
332         cast4 (object o, int32 counter, int64 stack) noinlining
333         {
334                 .locals init (int32 V_0)
336                 ldarg.1
337                 ldc.i4.0
338                 ble.s IL_0012
340                 ldarg.0
341                 ldarg.1
342                 ldc.i4.1
343                 sub
344                 ldloca.s V_0
345                 conv.u
346                 conv.u8
347                 tail. call class B[] class D`1<!T1>::cast4 (object, int32, int64)
348                 ret
350 IL_0012:
351                 ldloca.s V_0
352                 conv.u
353                 conv.u8
354                 ldarg.2
355                 call void class D`1<!T1>::check (int64, int64)
356                 ldarg.0
357                 ldc.i4.s 100
358                 ldc.i4.0
359                 conv.i8
360                 tail. call !!0 class D`1<!T1>::cast1<class B[]> (object, int32, int64)
361                 ret
362         }
364         .method public static !!T[]
365         cast5<T> (object o, int32 counter, int64 stack) noinlining
366         {
367                 .locals init (int32 V_0)
369                 ldarg.1
370                 ldc.i4.0
371                 ble.s IL_0012
373                 ldarg.0
374                 ldarg.1
375                 ldc.i4.1
376                 sub
377                 ldloca.s V_0
378                 conv.u
379                 conv.u8
380                 tail. call !!0[] class D`1<!T1>::cast5<!!0> (object, int32, int64)
381                 ret
383 IL_0012:
384                 ldloca.s V_0
385                 conv.u
386                 conv.u8
387                 ldarg.2
388                 call void class D`1<!T1>::check (int64, int64)
389                 ldarg.0
390                 ldc.i4.s 100
391                 ldc.i4.0
392                 conv.i8
393                 tail. call !!0 class D`1<!T1>::cast1<!!0[]> (object, int32, int64)
394                 ret
395         }
397         .method public static !T1
398         cast6 (object o, int32 counter, int64 stack) noinlining
399         {
400                 .locals init (int32 V_0)
402                 ldarg.1
403                 ldc.i4.0
404                 ble.s IL_0012
406                 ldarg.0
407                 ldarg.1
408                 ldc.i4.1
409                 sub
410                 ldloca.s V_0
411                 conv.u
412                 conv.u8
413                 tail. call !0 class D`1<!T1>::cast6 (object, int32, int64)
414                 ret
416 IL_0012:
417                 ldloca.s V_0
418                 conv.u
419                 conv.u8
420                 ldarg.2
421                 call void class D`1<!T1>::check (int64, int64)
422                 ldarg.0
423                 ldc.i4.s 100
424                 ldc.i4.0
425                 conv.i8
426                 tail. call !!0 class D`1<!T1>::cast1<!0> (object, int32, int64)
427                 ret
428         }
430         .method public static !T1
431         cast7<T> (object o, int32 counter, int64 stack) noinlining
432         {
433                 .locals init (int32 V_0)
435                 ldarg.1
436                 ldc.i4.0
437                 ble.s IL_0012
439                 ldarg.0
440                 ldarg.1
441                 ldc.i4.1
442                 sub
443                 ldloca.s V_0
444                 conv.u
445                 conv.u8
446                 tail. call !0 class D`1<!T1>::cast7<!!0> (object, int32, int64)
447                 ret
449 IL_0012:
450                 ldloca.s V_0
451                 conv.u
452                 conv.u8
453                 ldarg.2
454                 call void class D`1<!T1>::check (int64, int64)
455                 ldarg.0
456                 ldc.i4.s 100
457                 ldc.i4.0
458                 conv.i8
459                 tail. call !!0 class D`1<!T1>::cast1<!0> (object, int32, int64)
460                 ret
461         }
463         .method public static !T1[]
464         cast8 (object o, int32 counter, int64 stack) noinlining
465         {
466                 .locals init (int32 V_0)
468                 ldarg.1
469                 ldc.i4.0
470                 ble.s IL_0012
472                 ldarg.0
473                 ldarg.1
474                 ldc.i4.1
475                 sub
476                 ldloca.s V_0
477                 conv.u
478                 conv.u8
479                 tail. call !0[] class D`1<!T1>::cast8 (object, int32, int64)
480                 ret
482 IL_0012:
483                 ldloca.s V_0
484                 conv.u
485                 conv.u8
486                 ldarg.2
487                 call void class D`1<!T1>::check (int64, int64)
488                 ldarg.0
489                 ldc.i4.s 100
490                 ldc.i4.0
491                 conv.i8
492                 tail. call !!0 class D`1<!T1>::cast3<!0[]> (object, int32, int64)
493                 ret
494         }
496         .method public static !T1[]
497         cast9<T> (object o, int32 counter, int64 stack) noinlining
498         {
499                 .locals init (int32 V_0)
501                 ldarg.1
502                 ldc.i4.0
503                 ble.s IL_0012
505                 ldarg.0
506                 ldarg.1
507                 ldc.i4.1
508                 sub
509                 ldloca.s V_0
510                 conv.u
511                 conv.u8
512                 tail. call !0[] class D`1<!T1>::cast9<!!0> (object, int32, int64)
513                 ret
515 IL_0012:
516                 ldloca.s V_0
517                 conv.u
518                 conv.u8
519                 ldarg.2
520                 call void class D`1<!T1>::check (int64, int64)
521                 ldarg.0
522                 ldc.i4.s 100
523                 ldc.i4.0
524                 conv.i8
525                 tail. call !!0 class D`1<!T1>::cast3<!0[]> (object, int32, int64)
526                 ret
527         }
529         .method public
530         instance void .ctor ( )
531         {
532                 ldarg.0
533                 tail. call instance void [mscorlib]System.Object::.ctor ( )
534                 ret
535         }
538 .class public E
540         .field private static int32 i
542         .method private static void
543         print (object o) noinlining
544         {
545                 ldsfld int32 E::i
546                 ldc.i4.1
547                 add
548                 stsfld int32 E::i
549                 ret
550         }
552         .method public static void
553         Main (string[] args) noinlining
554         {
555                 .entrypoint
557                 newobj instance void B::.ctor ( )
558                 ldc.i4.s 100
559                 ldc.i4.0
560                 conv.i8
561                 call class B C::cast2 (object, int32, int64)
562                 call void E::print (object)
564                 newobj instance void B::.ctor ( )
565                 ldc.i4.s 100
566                 ldc.i4.0
567                 conv.i8
568                 call !!0 C::cast3<class B> (object, int32, int64)
569                 call void E::print (object)
571                 ldc.i4.1
572                 newarr B
573                 ldc.i4.s 100
574                 ldc.i4.0
575                 conv.i8
576                 call !!0 C::cast3<class B[]> (object, int32, int64)
577                 call void E::print (object)
579                 ldc.i4.1
580                 newarr B
581                 ldc.i4.s 100
582                 ldc.i4.0
583                 conv.i8
584                 call class B[] C::cast4 (object, int32, int64)
585                 call void E::print (object)
587                 ldc.i4.1
588                 newarr B
589                 ldc.i4.s 100
590                 ldc.i4.0
591                 conv.i8
592                 call !!0[] C::cast5<class B> (object, int32, int64)
593                 call void E::print (object)
595                 newobj instance void B::.ctor ( )
596                 ldc.i4.s 100
597                 ldc.i4.0
598                 conv.i8
599                 call class B class D`1<class A>::cast2 (object, int32, int64)
600                 call void E::print (object)
602                 newobj instance void B::.ctor ( )
603                 ldc.i4.s 100
604                 ldc.i4.0
605                 conv.i8
606                 call !!0 class D`1<class A>::cast3<class B> (object, int32, int64)
607                 call void E::print (object)
609                 ldc.i4.1
610                 newarr B
611                 ldc.i4.s 100
612                 ldc.i4.0
613                 conv.i8
614                 call !!0 class D`1<class A>::cast3<class B[]> (object, int32, int64)
615                 call void E::print (object)
617                 ldc.i4.1
618                 newarr B
619                 ldc.i4.s 100
620                 ldc.i4.0
621                 conv.i8
622                 call class B[] class D`1<class A>::cast4 (object, int32, int64)
623                 call void E::print (object)
625                 ldc.i4.1
626                 newarr B
627                 ldc.i4.s 100
628                 ldc.i4.0
629                 conv.i8
630                 call !!0[] class D`1<class A>::cast5<class B> (object, int32, int64)
631                 call void E::print (object)
633                 newobj instance void B::.ctor ( )
634                 ldc.i4.s 100
635                 ldc.i4.0
636                 conv.i8
637                 call !0 class D`1<class B>::cast6 (object, int32, int64)
638                 call void E::print (object)
640                 newobj instance void B::.ctor ( )
641                 ldc.i4.s 100
642                 ldc.i4.0
643                 conv.i8
644                 call !0 class D`1<class B>::cast7<class A> (object, int32, int64)
645                 call void E::print (object)
647                 ldc.i4.1
648                 newarr B
649                 ldc.i4.s 100
650                 ldc.i4.0
651                 conv.i8
652                 call !0 class D`1<class B[]>::cast7<class A[]> (object, int32, int64)
653                 call void E::print (object)
655                 ldc.i4.1
656                 newarr B
657                 ldc.i4.s 100
658                 ldc.i4.0
659                 conv.i8
660                 call !0[] class D`1<class B>::cast8 (object, int32, int64)
661                 call void E::print (object)
663                 ldc.i4.1
664                 newarr B
665                 ldc.i4.s 100
666                 ldc.i4.0
667                 conv.i8
669                 call !0[] class D`1<class B>::cast9<class A> (object, int32, int64)
670                 tail. call void E::print (object)
672                 ret
673         }