[2020-02] Avoid following invalid pointers in mono_w32process_get_modules on Darwin...
[mono-project.git] / mono / tests / custom-modifiers-append.1.il
blob13d0ce2d42414e554f32dd92fe52096e50e6c25c
1 // Test runtime custom modifier behavior.
2 //
3 // Roslyn expects custom modifiers to append together when a generic type is
4 // instantiated.
5 //
6 // For example, if a method has the signature
7 //       .method public hidebysig virtual instance void Method (!0 modopt(Foo))
8 // and the type is instantiated with int32 modopt (Bar)
9 // the result should be a method with a signature
10 //       .method public hidebysig virtual instance void Method (int32 modopt(Foo) modopt(Bar))
12 .assembly extern mscorlib { }
13 .assembly 'custom-modifiers-append.1' { }
15 .class public Foo
17     .method public hidebysig specialname rtspecialname instance void .ctor()
18     {
19         ldarg.0
20         call instance void object::.ctor()
21         ret
22     }
25 .class public Bar
27     .method public hidebysig specialname rtspecialname instance void .ctor()
28     {
29         ldarg.0
30         call instance void object::.ctor()
31         ret
32     }
36 .class public BaseClass`1<T1> extends [mscorlib]System.Object
38     .method public hidebysig specialname rtspecialname instance void .ctor()
39     {
40         ldarg.0
41         call instance void object::.ctor()
42         ret
43     }
45     .method public newslot virtual instance int32 TestMethod(!T1 modopt(Foo))
46     {
47         ldstr "In BaseClass::TestMethod (T1 modopt(Foo))"
48         call void class [mscorlib]System.Console::WriteLine(string)
49         ldc.i4.1
50         ret
51     }
53     .method public newslot virtual instance int32 TestMethod(!T1)
54     {
55         ldstr "In BaseClass::TestMethod (T1)"
56         call void class [mscorlib]System.Console::WriteLine(string)
57         ldc.i4.2
58         ret
59     }
62 .class public MidClass extends class BaseClass`1<int32 modopt(Bar)>
64     .method public hidebysig specialname rtspecialname instance void .ctor()
65     {
66         ldarg.0
67         call instance void class BaseClass`1<int32 modopt(Bar)>::.ctor()
68         ret
69     }
71     .method public hidebysig virtual instance int32 TestMethod(int32 modopt(Bar))
72     {
73         ldstr "In MidClass::TestMethod (int32 modopt(Bar))"
74         call void class [mscorlib]System.Console::WriteLine(string)
75         ldc.i4.s 21
76         ret
77     }
80 .class public LeafClass extends class MidClass
82     .method public hidebysig specialname rtspecialname instance void .ctor()
83     {
84         ldarg.0
85         call instance void class MidClass::.ctor()
86         ret
87     }
89     .method public hidebysig virtual instance int32 TestMethod(int32 modopt(Bar) modopt(Foo))
90     {
91         ldstr "In LeafClass::TestMethod (int32 modopt(Bar) modopt(Foo))"
92         call void class [mscorlib]System.Console::WriteLine(string)
93         ldc.i4 32
94         ret
95     }
98 .class public MainClass
100     .method public static hidebysig int32 Main()
101     {
102         .entrypoint
103         .locals init (class BaseClass`1<int32> c)
104         ldstr "HelloWorld"
105         call void class [mscorlib]System.Console::WriteLine(string)
106         newobj instance void class MidClass::.ctor()
107         stloc.0
108         ldloc.0
109         ldc.i4.0
110         // expect the call to BaseClass::TestMethod (T1 modopt(Foo))
111         callvirt instance int32 class BaseClass`1<int32>::TestMethod(!0 modopt(Foo))
112         ldc.i4.1
113         bne.un bad1
114         br after1
115     bad1:
116         ldc.i4.1
117         ret
118     after1:
119         newobj instance void class MidClass::.ctor()
120         stloc.0
121         ldloc.0
122         ldc.i4.0
123         // expect the call to MidClass::TestMethod (int32 modopt(Bar))
124         callvirt instance int32 class BaseClass`1<int32>::TestMethod(!0)
125         ldc.i4.s 21
126         bne.un bad2
127         br after2
128     bad2:
129         ldc.i4.2
130         ret
131     after2:
132         newobj instance void class LeafClass::.ctor()
133         stloc.0
134         ldloc.0
135         ldc.i4.0
136         // expect the call to LeafClass::TestMethod (int32 modopt(Bar) modopt(Foo))
137         callvirt instance int32 class BaseClass`1<int32>::TestMethod(!0 modopt(Foo))
138         ldc.i4.s 32
139         bne.un bad3
140         br after3
141     bad3:
142         ldc.i4.2
143         ret
144     after3:
145         ldc.i4.0
146         ret
147     }