2 using System.Collections.Generic;
3 using System.Collections.ObjectModel;
4 using System.Runtime.CompilerServices;
5 using System.Threading.Tasks;
8 public int i, j, k, l, m, n;
16 public static T static_dummy;
17 public static T static_t;
18 public static Foo static_f;
31 [MethodImplAttribute (MethodImplOptions.NoInlining)]
32 public GFoo3 (T i1, T i2) {
39 // Tests for generic sharing of vtypes.
40 // The tests use arrays to pass/receive values to keep the calling convention of the methods stable, which is a current limitation of the runtime support for gsharedvt.
44 // Interfaces are used to prevent the AOT compiler from discovering instantiations, thus forcing the usage of the gsharedvt
45 // versions of methods. Unused vtype type arguments are used to test gsharedvt methods with ref type arguments, i.e.
46 // when calling foo<T,T2> as foo<object,bool>, the gsharedvt version is used, but with a ref type argument.
49 // FIXME: Add mixed ref/noref tests, i.e. Dictionary<string, int>
52 public class GSharedTests
58 public static int Main (String[] args) {
59 return TestDriver.RunTests (typeof (Tests), args);
63 [MethodImplAttribute (MethodImplOptions.NoInlining)]
64 static void gshared<T> (T [] array, int i, int j) {
66 array [i] = array [j];
70 // Test that the gshared and gsharedvt versions don't mix
71 public static int test_0_vt_gshared () {
72 string[] sarr = new string [2] { "A", "B" };
74 gshared<string> (sarr, 0, 1);
76 Foo[] arr = new Foo [2];
77 arr [0] = new Foo () { i = 1, j = 2 };
78 arr [1] = new Foo () { i = 3, j = 4 };
80 gshared<Foo> (arr, 0, 1);
81 if (arr [0].i != 3 || arr [0].j != 4)
83 if (arr [1].i != 1 || arr [1].j != 2)
89 static void ldelem_stelem<T> (T [] array, int i, int j) {
91 array [i] = array [j];
95 public static int test_0_vt_ldelem_stelem () {
96 Foo[] arr = new Foo [2];
97 arr [0] = new Foo () { i = 1, j = 2 };
98 arr [1] = new Foo () { i = 3, j = 4 };
100 ldelem_stelem<Foo> (arr, 0, 1);
101 if (arr [0].i != 3 || arr [0].j != 4)
103 if (arr [1].i != 1 || arr [1].j != 2)
106 int[] arr2 = new int [2] { 1, 2 };
107 ldelem_stelem<int> (arr2, 0, 1);
108 if (arr2 [0] !=2 || arr2 [1] != 1)
114 [MethodImplAttribute (MethodImplOptions.NoInlining)]
115 private static void initobj<T> (T [] array, int i, int j) {
120 public static int test_0_vt_initobj () {
121 Foo[] arr = new Foo [2];
122 arr [0] = new Foo () { i = 1, j = 2 };
123 arr [1] = new Foo () { i = 3, j = 4 };
125 initobj<Foo> (arr, 0, 1);
126 if (arr [0].i != 0 || arr [0].j != 0)
128 if (arr [1].i != 3 || arr [1].j != 4)
133 [MethodImplAttribute (MethodImplOptions.NoInlining)]
134 static T ldobj_stobj<T> (ref T t1, ref T t2) {
141 public static int test_0_vt_ldobj_stobj () {
144 if (ldobj_stobj (ref i, ref j) != 6)
146 if (i != 6 || j != 0)
150 if (ldobj_stobj (ref d1, ref d2) != 2.0)
152 if (d1 != 2.0 || d2 != 0.0)
157 [MethodImplAttribute (MethodImplOptions.NoInlining)]
158 private static void box<T1, T> (T [] array, object[] arr) {
159 object x = array [0];
163 public static int test_0_vt_box () {
164 Foo[] arr = new Foo [2];
165 arr [0] = new Foo () { i = 1, j = 2 };
167 object[] arr2 = new object [16];
168 box<int, Foo> (arr, arr2);
169 if (arr2 [0].GetType () != typeof (Foo))
171 Foo f = (Foo)arr2 [0];
172 if (f.i != 1 || f.j != 2)
174 string[] arr3 = new string [16];
175 object[] arr4 = new object [16];
177 box<int, string> (arr3, arr4);
178 if (arr4 [0] != (object)arr3 [0])
183 [MethodImplAttribute (MethodImplOptions.NoInlining)]
184 private static void unbox_any<T> (T [] array, object[] arr) {
189 public static int test_0_vt_unbox_any () {
190 int[] iarr = new int [16];
191 unbox_any<int> (iarr, new object [] { 12 });
193 Foo[] arr = new Foo [2];
195 object[] arr2 = new object [16];
196 arr2 [0] = new Foo () { i = 1, j = 2 };
197 unbox_any<Foo> (arr, arr2);
198 if (arr [0].i != 1 || arr [0].j != 2)
203 interface IFaceUnbox {
204 T Unbox<T, T2> (T t, T2 t2, object o);
207 class ClassUnbox : IFaceUnbox {
208 public T Unbox<T, T2> (T t, T2 t2, object o) {
213 // unbox.any on a ref type in a gsharedvt method
214 public static int test_0_ref_gsharedvt_aot_unbox_any () {
215 IFaceUnbox iface = new ClassUnbox ();
216 string s = iface.Unbox<string, int> ("A", 2, "A");
222 public static int test_0_unbox_any_enum () {
223 IFaceUnbox iface = new ClassUnbox ();
224 AnEnum res = iface.Unbox<AnEnum, int> (AnEnum.One, 0, 1);
225 if (res != AnEnum.Two)
227 res = iface.Unbox<AnEnum, int> (AnEnum.One, 0, AnEnum.Two);
228 if (res != AnEnum.Two)
230 int res2 = iface.Unbox<int, AnEnum> (0, AnEnum.One, AnEnum.Two);
236 [MethodImplAttribute (MethodImplOptions.NoInlining)]
237 static void ldfld_nongeneric<T> (GFoo<T>[] foo, int[] arr) {
241 [MethodImplAttribute (MethodImplOptions.NoInlining)]
242 static void ldfld<T> (GFoo<T>[] foo, T[] arr) {
246 [MethodImplAttribute (MethodImplOptions.NoInlining)]
247 static void stfld_nongeneric<T> (GFoo<T>[] foo, int[] arr) {
251 [MethodImplAttribute (MethodImplOptions.NoInlining)]
252 static void stfld<T> (GFoo<T>[] foo, T[] arr) {
256 [MethodImplAttribute (MethodImplOptions.NoInlining)]
257 static void ldflda<T> (GFoo<T>[] foo, int[] arr) {
258 arr [0] = foo [0].f.i;
261 public static int test_0_vt_ldfld_stfld () {
262 var foo = new GFoo<Foo> () { t = new Foo () { i = 1, j = 2 }, i = 5, f = new Foo () { i = 5, j = 6 } };
263 var farr = new GFoo<Foo>[] { foo };
265 /* Normal fields with a variable offset */
266 var iarr = new int [10];
267 ldfld_nongeneric<Foo> (farr, iarr);
271 stfld_nongeneric<Foo> (farr, iarr);
272 if (farr [0].i != 16)
275 /* Variable type field with a variable offset */
276 var arr = new Foo [10];
277 ldfld<Foo> (farr, arr);
278 if (arr [0].i != 1 || arr [0].j != 2)
280 arr [0] = new Foo () { i = 3, j = 4 };
281 stfld<Foo> (farr, arr);
282 if (farr [0].t.i != 3 || farr [0].t.j != 4)
285 ldflda<Foo> (farr, iarr);
292 [MethodImplAttribute (MethodImplOptions.NoInlining)]
293 static void stsfld<T> (T[] arr) {
294 GFoo<T>.static_t = arr [0];
297 [MethodImplAttribute (MethodImplOptions.NoInlining)]
298 static void ldsfld<T> (T[] arr) {
299 arr [0] = GFoo<T>.static_t;
302 [MethodImplAttribute (MethodImplOptions.NoInlining)]
303 static void ldsflda<T> (int[] iarr) {
304 iarr [0] = GFoo<T>.static_f.i;
307 public static int test_0_stsfld () {
308 Foo[] farr = new Foo [] { new Foo () { i = 1, j = 2 } };
311 if (GFoo<Foo>.static_t.i != 1 || GFoo<Foo>.static_t.j != 2)
314 Foo[] farr2 = new Foo [1];
316 if (farr2 [0].i != 1 || farr2 [0].j != 2)
319 var iarr = new int [10];
320 GFoo<Foo>.static_f = new Foo () { i = 5, j = 6 };
328 [MethodImplAttribute (MethodImplOptions.NoInlining)]
329 static object newarr<T> () {
330 object o = new T[10];
334 public static int test_0_vt_newarr () {
335 object o = newarr<Foo> ();
341 [MethodImplAttribute (MethodImplOptions.NoInlining)]
342 static Type ldtoken<T> () {
343 return typeof (GFoo<T>);
346 public static int test_0_vt_ldtoken () {
347 Type t = ldtoken<Foo> ();
348 if (t != typeof (GFoo<Foo>))
351 if (t != typeof (GFoo<int>))
357 public static int test_0_vtype_list () {
358 List<int> l = new List<int> ();
366 [MethodImplAttribute (MethodImplOptions.NoInlining)]
367 static int args_simple<T> (T t, int i) {
371 [MethodImplAttribute (MethodImplOptions.NoInlining)]
372 static int args_simple<T> (T t, int i, T t2) {
376 [MethodImplAttribute (MethodImplOptions.NoInlining)]
377 static Type args_rgctx<T> (T t, int i) {
381 [MethodImplAttribute (MethodImplOptions.NoInlining)]
382 static Type eh_in<T> (T t, int i) {
383 throw new OverflowException ();
386 [MethodImplAttribute (MethodImplOptions.NoInlining)]
387 static T return_t<T> (T t) {
391 [MethodImplAttribute (MethodImplOptions.NoInlining)]
392 T return_this_t<T> (T t) {
396 interface IFaceGSharedVtIn {
400 class ClassGSharedVtIn : IFaceGSharedVtIn {
401 public T return_t<T> (T t) {
406 public static int test_0_gsharedvt_in () {
407 // Check that the non-generic argument is passed at the correct stack position
408 int r = args_simple<bool> (true, 42);
411 r = args_simple<Foo> (new Foo (), 43);
414 // Check that the proper rgctx is passed to the method
415 Type t = args_rgctx<int> (5, 42);
416 if (t != typeof (int))
418 var v = args_simple<GFoo2<int>> (new GFoo2<int> () { t = 11, t2 = 12 }, 44, new GFoo2<int> () { t = 11, t2 = 12 });
421 // Check that EH works properly
424 } catch (OverflowException) {
429 public static int test_0_gsharedvt_in_ret () {
430 int i = return_t<int> (42);
433 long l = return_t<long> (Int64.MaxValue);
434 if (l != Int64.MaxValue)
436 double d = return_t<double> (3.0);
439 float f = return_t<float> (3.0f);
442 short s = return_t<short> (16);
445 var v = new GFoo2<int> () { t = 55, t2 = 32 };
446 var v2 = return_t<GFoo2<int>> (v);
447 if (v2.t != 55 || v2.t2 != 32)
449 IFaceGSharedVtIn o = new ClassGSharedVtIn ();
450 var v3 = new GFoo2<long> () { t = 55, t2 = 32 };
451 var v4 = o.return_t<GFoo2<long>> (v3);
452 if (v4.t != 55 || v4.t2 != 32)
454 i = new GSharedTests ().return_this_t<int> (42);
460 public static int test_0_gsharedvt_in_delegates () {
461 Func<int, int> f = new Func<int, int> (return_t<int>);
467 [MethodImplAttribute (MethodImplOptions.NoInlining)]
468 static T return2_t<T> (T t) {
472 public static int test_0_gsharedvt_calls () {
473 if (return2_t (2) != 2)
475 if (return2_t ("A") != "A")
477 if (return2_t (2.0) != 2.0)
482 static GFoo3<T> newobj<T> (T t1, T t2) {
483 return new GFoo3<T> (t1, t2);
486 public static int test_0_gshared_new () {
487 var g1 = newobj (1, 2);
488 if (g1.t != 1 || g1.t2 != 2)
490 var g2 = newobj (1.0, 2.0);
491 if (g1.t != 1.0 || g1.t2 != 2.0)
497 [MethodImplAttribute (MethodImplOptions.NoInlining)]
498 static GFoo2<T> newobj_vt<T> (T t1, T t2) {
499 return new GFoo2<T> () { t = t1, t2 = t2 };
502 public static int test_0_gshared_new_vt () {
503 GFoo2<int> v1 = newobj_vt (1, 2);
504 if (v1.t != 1 || v1.t2 != 2)
506 GFoo2<double> v2 = newobj_vt (1.0, 2.0);
507 if (v2.t != 1.0 || v2.t2 != 2.0)
513 // Tests for transitioning out of gsharedvt code
516 // T1=Nullable<..> is not currently supported by gsharedvt
518 [MethodImplAttribute (MethodImplOptions.NoInlining)]
519 static T return_t_nogshared<T,T1> (T t) {
522 //Console.WriteLine ("X: " + t);
526 [MethodImplAttribute (MethodImplOptions.NoInlining)]
527 static int return_int_nogshared<T,T1> (T t) {
533 [MethodImplAttribute (MethodImplOptions.NoInlining)]
534 static A return_vtype_nogshared<T,T1> (T t) {
537 return new A () { a = 1, b = 2, c = 3 };
540 [MethodImplAttribute (MethodImplOptions.NoInlining)]
541 static T return2_t_out<T> (T t) {
542 return return_t_nogshared<T, int?> (t);
545 [MethodImplAttribute (MethodImplOptions.NoInlining)]
546 static int return2_int_out<T> (T t) {
547 return return_int_nogshared<T, int?> (t);
550 [MethodImplAttribute (MethodImplOptions.NoInlining)]
551 static A return2_vtype_out<T> (T t) {
552 return return_vtype_nogshared<T, int?> (t);
559 [Category ("!FULLAOT")]
560 public static int test_0_gsharedvt_out () {
561 if (return2_t_out (2) != 2)
563 if (return2_t_out ("A") != "A")
565 if (return2_t_out (2.0) != 2.0)
567 if (return2_t_out (2.0f) != 2.0f)
569 A a = new A () { a = 1, b = 2, c = 3 };
570 A a2 = return2_t_out (a);
571 if (a2.a != 1 || a2.b != 2 || a2.c != 3)
573 // Calls with non gsharedvt return types
574 if (return2_int_out (1) != 2)
576 A c = return2_vtype_out (a);
577 if (a2.a != 1 || a2.b != 2 || a2.c != 3)
582 public class GenericClass<T> {
583 public static T Z (IList<T> x, int index)
589 public static int test_0_generic_array_helpers () {
590 int[] x = new int[] {100, 200};
592 // Generic array helpers should be treated as gsharedvt-out
593 if (GenericClass<int>.Z (x, 0) != 100)
599 internal class IntComparer : IComparer<int>
601 public int Compare (int ix, int iy)
606 if (((uint) ix) < ((uint) iy))
612 [MethodImplAttribute (MethodImplOptions.NoInlining)]
613 static int gshared_out_iface<T> (T t1, T t2, IComparer<T> comp) {
614 return comp.Compare (t1, t2);
617 public static int test_0_gshared_out_iface () {
618 // Call out from gshared to a nongeneric method through a generic interface method
619 if (gshared_out_iface (2, 2, new IntComparer ()) != 0)
625 public int i1, i2, i3;
629 int i1, i2, i3, i4, i5;
633 [MethodImplAttribute (MethodImplOptions.NoInlining)]
634 public static void locals<T> (T t) {
635 Foo2<T> t2 = new Foo2<T> ();
639 public static int test_0_locals () {
640 // Test that instantiations of type parameters are allocated the proper local type
642 for (int j = 0; j < 10; ++j)
644 locals<Foo1> (new Foo1 () { i1 = 1, i2 = 2, i3 = 3 });
648 public interface IFace<T> {
649 T return_t_iface (T t);
652 public class Parent<T> {
653 public virtual T return_t_vcall (T t) {
654 throw new Exception ();
659 public class Child<T> : Parent<T>, IFace<T> {
660 public override T return_t_vcall (T t) {
663 public T return_t_iface (T t) {
668 [MethodImplAttribute (MethodImplOptions.NoInlining)]
669 static T return_t_vcall<T> (Parent<T> r, T t) {
670 return r.return_t_vcall (t);
673 public static int test_0_vcalls () {
674 if (return_t_vcall (new Child<int> (), 2) != 2)
677 for (int i = 0; i < 10; ++i) {
678 if (return_t_vcall (new Child<int> (), 2) != 2)
681 if (return_t_vcall (new Child<double> (), 2.0) != 2.0)
686 [MethodImplAttribute (MethodImplOptions.NoInlining)]
687 static T return_t_iface<T> (IFace<T> r, T t) {
688 return r.return_t_iface (t);
691 public static int test_0_iface_calls () {
692 if (return_t_iface (new Child<int> (), 2) != 2)
694 if (return_t_iface (new Child<double> (), 2.0) != 2.0)
703 static KeyValuePair<T1, T2> make_kvp<T1, T2> (T1 t1, T2 t2) {
704 return new KeyValuePair<T1, T2> (t1, t2);
707 static T2 use_kvp<T1, T2> (KeyValuePair<T1, T2> kvp) {
711 class ClassKVP : IFaceKVP {
712 public T do_kvp<T> (T a) {
713 var t = make_kvp (a, a);
714 // argument is an instance of a vtype instantiated with gsharedvt type arguments
719 public static int test_0_gsharedvt_ginstvt_constructed_arg () {
720 IFaceKVP c = new ClassKVP ();
721 if (c.do_kvp<long> (1) != 1)
731 class Getter : IGetter
733 public T Get<T>() { return default(T); }
736 abstract class Session
738 public abstract IGetter Getter { get; }
741 class IosSession : Session
743 private IGetter getter = new Getter();
744 public override IGetter Getter { get { return getter; } }
750 public static int test_0_regress_5156 () {
751 new IosSession().Getter.Get<ENUM_TYPE>();
766 public void OuterMethod<TArg1>(TArg1 value)
768 this.InnerMethod<TArg1, long>(value, 0);
771 private void InnerMethod<TArg1, TArg2>(TArg1 v1, TArg2 v2)
773 //Console.WriteLine("{0} {1}",v1,v2);
777 public static int test_0_regress_2096 () {
780 // The following work:
781 a.OuterMethod<int>(1);
782 a.OuterMethod<DateTime>(DateTime.Now);
785 a.OuterMethod<VT>(v);
788 // Next line will crash with Attempting to JIT compile method on device
789 // Attempting to JIT compile method
796 public void Test<T>()
798 //System.Console.WriteLine(typeof(T));
806 new B().Test<System.Collections.Generic.KeyValuePair<T, T>>();
810 public static int test_0_regress_6040 () {
811 //new B().Test<System.Collections.Generic.KeyValuePair<string, string>>();
813 new A<object>().Test();
814 new A<string>().Test();
818 class ArrayContainer<T> {
819 private T[,] container = new T[1,1];
822 [MethodImplAttribute (MethodImplOptions.NoInlining)]
824 return container [0, 0];
826 [MethodImplAttribute (MethodImplOptions.NoInlining)]
828 container [0, 0] = value;
833 [MethodImplAttribute (MethodImplOptions.NoInlining)]
834 public static int test_0_multi_dim_arrays () {
835 var c = new ArrayContainer<int> ();
837 return c.Prop == 5 ? 0 : 1;
840 [MethodImplAttribute (MethodImplOptions.NoInlining)]
841 static T2 rgctx_in_call_innner_inner<T1, T2> (T1 t1, T2 t2) {
845 [MethodImplAttribute (MethodImplOptions.NoInlining)]
846 static GFoo3<T> rgctx_in_call_inner<T> (T t) {
847 return rgctx_in_call_innner_inner (1, new GFoo3<T> ());
850 public static int test_0_rgctx_in_call () {
851 // The call is made through the rgctx call, and it needs an IN trampoline
852 var t = rgctx_in_call_inner (1);
858 [MethodImplAttribute (MethodImplOptions.NoInlining)]
859 static void arm_params1<T> (T t1, T t2, T t3, T t4, T t5, T t6) {
862 [MethodImplAttribute (MethodImplOptions.NoInlining)]
863 static void arm_params2<T> (T t1, T t2, T t3, long t4, T t5, T t6) {
866 public static int test_0_arm_param_passing () {
867 arm_params1<int> (1, 2, 3, 4, 5, 6);
868 arm_params1<int> (1, 2, 3, 4, 5, 6);
872 sealed class ScheduledItem<TAbsolute, TValue> {
873 private readonly object _scheduler;
874 private readonly TValue _state;
875 private readonly object _action;
877 public ScheduledItem(object o, TValue state, object action, TAbsolute dueTime) {
882 abstract class VirtualTimeSchedulerBase<TAbsolute, TRelative> {
883 public abstract void ScheduleAbsolute<TState>(TState state, TAbsolute dueTime);
886 class VirtualTimeScheduler<TAbsolute, TRelative> : VirtualTimeSchedulerBase<TAbsolute, TRelative> {
887 public override void ScheduleAbsolute<TState>(TState state, TAbsolute dueTime) {
888 var si = new ScheduledItem<TAbsolute, TState>(this, state, null, dueTime);
892 public static int test_0_rx_mixed_regress () {
893 var v = new VirtualTimeScheduler<long, long> ();
894 v.ScheduleAbsolute<Action> (null, 22);
899 public virtual T foo<T> (T t) {
904 class Class1 : Base {
907 public override T foo<T> (T t) {
913 class Class2 : Base {
916 public override T foo<T> (T t) {
922 [MethodImplAttribute (MethodImplOptions.NoInlining)]
923 public static void bar<T> (Base b, T t) {
927 public static int test_0_virtual_generic () {
928 Class1 c1 = new Class1 ();
929 Class2 c2 = new Class2 ();
931 if (!(c1.o is int) || ((int)c1.o != 5))
934 if (!(c1.o is double) || ((double)c1.o != 6.0))
937 if (!(c1.o is float) || ((float)c1.o != 7.0f))
940 if (!(c2.o is int) || ((int)c2.o != 5))
947 public interface IFace1<T> {
955 public class ClassIFace<T> : IFace1<T> {
968 interface IFaceIFaceCall {
969 void call<T, T2> (IFace1<object> iface);
972 class MakeIFaceCall : IFaceIFaceCall {
973 public void call<T, T2> (IFace1<object> iface) {
978 // Check normal interface calls from gsharedvt call to fully instantiated methods
979 public static int test_0_instatiated_iface_call () {
980 ClassIFace<object> c1 = new ClassIFace<object> ();
982 IFaceIFaceCall c = new MakeIFaceCall ();
984 c.call<object, int> (c1);
988 [MethodImplAttribute (MethodImplOptions.NoInlining)]
989 static string to_string<T, T2>(T t, T2 t2) {
990 return t.ToString ();
998 public static int test_0_constrained_tostring () {
999 if (to_string<int, int> (1, 1) != "1")
1001 if (to_string<AnEnum, int> (AnEnum.One, 1) != "One")
1003 if (to_string<string, int> ("A", 1) != "A")
1008 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1009 static int get_hash<T, T2>(T t, T2 t2) {
1010 return t.GetHashCode ();
1013 public static int test_0_constrained_get_hash () {
1014 if (get_hash<int, int> (1, 1) != 1.GetHashCode ())
1016 if (get_hash<double, int> (1.0, 1) != 1.0.GetHashCode ())
1018 if (get_hash<AnEnum, int> (AnEnum.One, 1) != AnEnum.One.GetHashCode ())
1020 if (get_hash<string, int> ("A", 1) != "A".GetHashCode ())
1025 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1026 static bool equals<T, T2>(T t, T2 t2) {
1027 return t.Equals (t);
1030 public static int test_0_constrained_equals () {
1031 if (equals<int, int> (1, 1) != true)
1033 if (equals<double, int> (1.0, 1) != true)
1035 if (equals<AnEnum, int> (AnEnum.One, 1) != true)
1037 if (equals<string, int> ("A", 1) != true)
1042 interface IGetType {
1043 Type gettype<T, T2>(T t, T2 t2);
1046 public class CGetType : IGetType {
1047 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1048 public Type gettype<T, T2>(T t, T2 t2) {
1049 return t.GetType ();
1052 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1053 public Type gettype2<T>(T t) {
1054 return t.GetType ();
1058 public static int test_0_constrained_gettype () {
1059 IGetType c = new CGetType ();
1060 if (c.gettype<int, int> (1, 1) != typeof (int))
1062 if (c.gettype<string, int> ("A", 1) != typeof (string))
1064 /* Partial sharing */
1065 var c2 = new CGetType ();
1066 if (c2.gettype2<long> (1) != typeof (long))
1071 interface IConstrainedCalls {
1072 Pair<int, int> vtype_ret<T, T2>(T t, T2 t2) where T: IReturnVType;
1075 public interface IReturnVType {
1076 Pair<int, int> return_vtype ();
1079 public class CConstrainedCalls : IConstrainedCalls {
1080 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1081 public Pair<int, int> vtype_ret<T, T2>(T t, T2 t2) where T : IReturnVType {
1082 return t.return_vtype ();
1086 class ReturnVType : IReturnVType {
1087 public Pair<int, int> return_vtype () {
1088 return new Pair<int, int> () { First = 1, Second = 2 };
1092 public static int test_0_constrained_vtype_ret () {
1093 IConstrainedCalls c = new CConstrainedCalls ();
1094 var r = c.vtype_ret<ReturnVType, int> (new ReturnVType (), 1);
1095 if (r.First != 1 || r.Second != 2)
1100 public struct Pair<T1, T2> {
1105 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1106 public static TState call_del<TState>(TState state, Func<object, TState, TState> action) {
1107 return action(null, state);
1110 [Category ("!FULLAOT")]
1111 public static int test_0_delegate_wrappers () {
1112 Func<object, Pair<int, int>, Pair<int, int>> del1 = delegate (object o, Pair<int, int> p) { return p; };
1113 Func<object, Pair<int, int>, Pair<int, int>> del2 = delegate (object o, Pair<int, int> p) { return p; };
1114 Func<object, Pair<double, int>, Pair<double, int>> del3 = delegate (object o, Pair<double, int> p) { return p; };
1115 var r1 = call_del<Pair<int, int>> (new Pair<int, int> { First = 1, Second = 2}, del1);
1116 if (r1.First != 1 || r1.Second != 2)
1118 var r2 = call_del<Pair<int, int>> (new Pair<int, int> { First = 3, Second = 4}, del2);
1119 if (r2.First != 3 || r2.Second != 4)
1121 var r3 = call_del<Pair<double, int>> (new Pair<double, int> { First = 1.0, Second = 2}, del3);
1122 if (r3.First != 1.0 || r3.Second != 2)
1128 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1129 public object foo<T1> (T1 t1, T t, object o) {
1134 class AClass : Base<long> {
1136 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1137 public object bar<T> (T t, long time, object o) {
1138 return foo (t, time, o);
1142 public static int test_0_out_in_wrappers () {
1143 var a = new AClass ();
1145 object o2 = a.bar<long> (1024, 0, o1);
1155 class Base<TAbsolute, T2> : BIFace {
1157 public TAbsolute Clock { get; set; }
1159 public virtual object AMethod () {
1164 class BClass : Base<long, long> {
1167 public static int test_0_regress_1 () {
1168 BIFace c = new BClass ();
1169 object o = c.AMethod ();
1170 if (!(o is long) || ((long)o != 0))
1176 T unbox_any<T> (object o);
1179 class Class3 : IFace3 {
1180 public virtual T unbox_any<T> (object o) {
1185 public static int test_0_unbox_any () {
1186 IFace3 o = new Class3 ();
1187 if (o.unbox_any<int> (16) != 16)
1189 if (o.unbox_any<long> ((long)32) != 32)
1191 if (o.unbox_any<double> (2.0) != 2.0)
1194 o.unbox_any<int> (2.0);
1196 } catch (Exception) {
1202 TSource Catch<TSource, TException>(TSource t) where TException : Exception;
1205 class Class4 : IFace4 {
1206 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1207 public TSource Catch<TSource, TException>(TSource t) where TException : Exception {
1212 // Check that mixed instantiations are correctly created/found in AOT
1213 public static int test_0_constraints () {
1214 IFace4 o = new Class4 ();
1215 o.Catch<int, Exception> (1);
1219 internal static Type Process<TSource, TElement> (TSource[] arr, Action<TElement, TElement> call) {
1220 arr [0] = default (TSource);
1221 return typeof (TSource);
1228 class Class5 : IFace5 {
1229 public Type foo<T> () {
1230 return Process<KeyValuePair<long, T>, T> (new KeyValuePair<long, T> [10], null);
1234 public static int test_0_rgctx_call_from_gshared_code () {
1235 var c = new Class5 ();
1236 if (c.foo<string> () != typeof (KeyValuePair<long, string>))
1241 public class Enumbers<T> {
1242 public object Enumerate (List<KeyValuePair<T, string>> alist)
1244 return alist.ToArray ();
1248 public static int test_0_checkthis_gshared_call () {
1249 Enumbers<string> e = new Enumbers<string> ();
1254 catch (NullReferenceException) {
1263 class Class6 : IFace6 {
1264 public T[] Del<T> (T t) {
1265 var res = new T [5];
1266 Func<T, T, T, T, T> func = delegate(T t1, T t2, T t3, T t4) { res [0] = t1; res [1] = t2; res [2] = t3; res [3] = t4; return t1; };
1267 var v = func.BeginInvoke(t, t, t, t, null, null);
1268 res [4] = func.EndInvoke (v);
1273 // FIXME: The runtime-invoke wrapper used by BeginInvoke is not found
1274 [Category ("!FULLAOT")]
1275 public static int test_0_begin_end_invoke () {
1276 IFace6 o = new Class6 ();
1277 var arr1 = o.Del (1);
1278 if (arr1 [0] != 1 || arr1 [1] != 1 || arr1 [2] != 1 || arr1 [3] != 1 || arr1 [4] != 1)
1280 var arr2 = o.Del (2.0);
1281 if (arr2 [0] != 2.0 || arr2 [1] != 2.0 || arr2 [2] != 2.0 || arr2 [3] != 2.0 || arr2 [4] != 2.0)
1286 public class TAbstractTableItem<TC> {
1287 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1288 public static void SetProperty<TV> () { }
1290 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1291 public static void Test () {
1292 SetProperty<bool> ();
1296 public static int test_0_gsharedvt_method_on_shared_class () {
1297 TAbstractTableItem<object>.Test ();
1301 interface IFaceBox {
1302 object box<T> (T t);
1303 bool is_null<T> (T t);
1306 class ClassBox : IFaceBox {
1307 public object box<T> (T t) {
1312 public bool is_null<T> (T t) {
1313 if (!(default(T) == null))
1319 public static int test_0_nullable_box () {
1320 IFaceBox c = new ClassBox ();
1322 object o = c.box<int?> (i);
1325 if (c.box<int?> (null) != null)
1327 long l = Int64.MaxValue - 1;
1328 o = c.box<long?> (l);
1331 if (c.box<long?> (null) != null)
1334 if (c.box<string> (s) != (object)s)
1339 public static int test_0_nullable_box_brtrue_opt () {
1340 IFaceBox c = new ClassBox ();
1342 if (c.is_null<double?> (null))
1348 interface IFaceUnbox2 {
1349 T unbox<T> (object o);
1352 class ClassUnbox2 : IFaceUnbox2 {
1353 public T unbox<T> (object o) {
1358 public static int test_0_nullable_unbox () {
1359 IFaceUnbox2 c = new ClassUnbox2 ();
1360 int? i = c.unbox<int?> (5);
1363 int? j = c.unbox<int?> (null);
1369 interface IConstrained {
1371 void foo_ref_arg (string s);
1374 interface IConstrained<T3> {
1375 void foo_gsharedvt_arg (T3 s);
1376 T3 foo_gsharedvt_ret (T3 s);
1379 static object constrained_res;
1381 struct ConsStruct : IConstrained {
1384 public void foo () {
1385 constrained_res = i;
1388 public void foo_ref_arg (string s) {
1389 constrained_res = s == "A" ? 42 : 0;
1393 class ConsClass : IConstrained {
1396 public void foo () {
1397 constrained_res = i;
1400 public void foo_ref_arg (string s) {
1401 constrained_res = s == "A" ? 43 : 0;
1405 struct ConsStruct<T> : IConstrained<T> {
1406 public void foo_gsharedvt_arg (T s) {
1407 constrained_res = s;
1410 public T foo_gsharedvt_ret (T s) {
1415 struct ConsStructThrow : IConstrained {
1416 public void foo () {
1417 throw new Exception ();
1420 public void foo_ref_arg (string s) {
1424 interface IFaceConstrained {
1425 void constrained_void_iface_call<T, T2>(T t, T2 t2) where T2 : IConstrained;
1426 void constrained_void_iface_call_ref_arg<T, T2>(T t, T2 t2) where T2 : IConstrained;
1427 void constrained_void_iface_call_gsharedvt_arg<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T>;
1428 T constrained_iface_call_gsharedvt_ret<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T>;
1429 T2 constrained_normal_call<T, T2>(T t, T2 t2) where T2 : VClass;
1432 class ClassConstrained : IFaceConstrained {
1433 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1434 public void constrained_void_iface_call<T, T2>(T t, T2 t2) where T2 : IConstrained {
1438 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1439 public void constrained_void_iface_call_ref_arg<T, T2>(T t, T2 t2) where T2 : IConstrained {
1440 t2.foo_ref_arg ("A");
1443 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1444 public void constrained_void_iface_call_gsharedvt_arg<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T> {
1445 t2.foo_gsharedvt_arg (t);
1448 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1449 public T constrained_iface_call_gsharedvt_ret<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T> {
1450 return t2.foo_gsharedvt_ret (t);
1453 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1454 public T2 constrained_normal_call<T, T2>(T t, T2 t2) where T2 : VClass {
1455 /* This becomes a constrained call even through 't2' is forced to be a reference type by the constraint */
1456 return (T2)t2.foo (5);
1461 public virtual VClass foo (int i) {
1466 public static int test_0_constrained_void_iface_call () {
1467 IFaceConstrained c = new ClassConstrained ();
1468 var s = new ConsStruct () { i = 42 };
1469 constrained_res = null;
1470 c.constrained_void_iface_call<int, ConsStruct> (1, s);
1471 if (!(constrained_res is int) || ((int)constrained_res) != 42)
1473 constrained_res = null;
1474 c.constrained_void_iface_call_ref_arg<int, ConsStruct> (1, s);
1475 if (!(constrained_res is int) || ((int)constrained_res) != 42)
1477 var s2 = new ConsClass () { i = 43 };
1478 constrained_res = null;
1479 c.constrained_void_iface_call<int, ConsClass> (1, s2);
1480 if (!(constrained_res is int) || ((int)constrained_res) != 43)
1482 constrained_res = null;
1483 c.constrained_void_iface_call_ref_arg<int, ConsClass> (1, s2);
1484 if (!(constrained_res is int) || ((int)constrained_res) != 43)
1489 public static int test_0_constrained_eh () {
1490 var s2 = new ConsStructThrow () { };
1492 IFaceConstrained c = new ClassConstrained ();
1493 c.constrained_void_iface_call<int, ConsStructThrow> (1, s2);
1495 } catch (Exception) {
1500 public static int test_0_constrained_void_iface_call_gsharedvt_arg () {
1501 // This tests constrained calls through interfaces with one gsharedvt arg, like IComparable<T>.CompareTo ()
1502 IFaceConstrained c = new ClassConstrained ();
1504 var s = new ConsStruct<int> ();
1505 constrained_res = null;
1506 c.constrained_void_iface_call_gsharedvt_arg<int, ConsStruct<int>, int> (42, s, 55);
1507 if (!(constrained_res is int) || ((int)constrained_res) != 42)
1510 var s2 = new ConsStruct<string> ();
1511 constrained_res = null;
1512 c.constrained_void_iface_call_gsharedvt_arg<string, ConsStruct<string>, int> ("A", s2, 55);
1513 if (!(constrained_res is string) || ((string)constrained_res) != "A")
1519 public static int test_0_constrained_iface_call_gsharedvt_ret () {
1520 IFaceConstrained c = new ClassConstrained ();
1522 var s = new ConsStruct<int> ();
1523 int ires = c.constrained_iface_call_gsharedvt_ret<int, ConsStruct<int>, int> (42, s, 55);
1527 var s2 = new ConsStruct<string> ();
1528 string sres = c.constrained_iface_call_gsharedvt_ret<string, ConsStruct<string>, int> ("A", s2, 55);
1535 public static int test_0_constrained_normal_call () {
1536 IFaceConstrained c = new ClassConstrained ();
1538 var o = new VClass ();
1539 var res = c.constrained_normal_call<int, VClass> (1, o);
1540 return res == o ? 0 : 1;
1543 public static async Task<T> FooAsync<T> (int i, int j) {
1544 Task<int> t = new Task<int> (delegate () { return 42; });
1545 var response = await t;
1549 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1550 public static void call_async<T> (int i, int j) {
1551 Task<T> t = FooAsync<T> (1, 2);
1552 // FIXME: This doesn't work
1553 //t.RunSynchronously ();
1556 // In AOT mode, the async infrastructure depends on gsharedvt methods
1557 public static int test_0_async_call_from_generic () {
1558 call_async<string> (1, 2);
1562 public static int test_0_array_helper_gsharedvt () {
1563 var arr = new AnEnum [16];
1564 var c = new ReadOnlyCollection<AnEnum> (arr);
1565 return c.Contains (AnEnum.Two) == false ? 0 : 1;
1568 interface IFaceCallPatching {
1569 bool caller<T, T2> ();
1572 class CallPatching2<T> {
1576 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1577 public bool callee () {
1578 return (string)o == "ABC";
1582 class CallPatching : IFaceCallPatching {
1583 public bool caller<T, T2> () {
1584 var c = new CallPatching2<T> ();
1591 // This tests that generic calls made from gsharedvt methods are not patched normally.
1592 // If they are, the first call to 'caller' would patch in the gshared version of
1593 // 'callee', causing the second call to fail because the gshared version of callee
1594 // wouldn't work with CallPatching2<bool> since it has a different object layout.
1596 public static int test_0_call_patching () {
1597 IFaceCallPatching c = new CallPatching ();
1598 c.caller<object, bool> ();
1599 if (!c.caller<bool, bool> ())
1604 struct EmptyStruct {
1607 public struct BStruct {
1608 public int a, b, c, d;
1611 interface IFoo3<T> {
1612 int Bytes (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1613 byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7, byte b8);
1614 int SBytes (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1615 sbyte b1, sbyte b2, sbyte b3, sbyte b4);
1616 int Shorts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1617 short b1, short b2, short b3, short b4);
1618 int UShorts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1619 ushort b1, ushort b2, ushort b3, ushort b4);
1620 int Ints (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1621 int i1, int i2, int i3, int i4);
1622 int UInts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1623 uint i1, uint i2, uint i3, uint i4);
1624 int Structs (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1628 class Foo3<T> : IFoo3<T> {
1629 public int Bytes (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1630 byte b1, byte b2, byte b3, byte b4, byte b5, byte b6, byte b7, byte b8) {
1631 return b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8;
1633 public int SBytes (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1634 sbyte b1, sbyte b2, sbyte b3, sbyte b4) {
1635 return b1 + b2 + b3 + b4;
1637 public int Shorts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1638 short b1, short b2, short b3, short b4) {
1639 return b1 + b2 + b3 + b4;
1641 public int UShorts (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1642 ushort b1, ushort b2, ushort b3, ushort b4) {
1643 return b1 + b2 + b3 + b4;
1645 public int Ints (T t, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8,
1646 int i1, int i2, int i3, int i4) {
1647 return i1 + i2 + i3 + i4;
1649 public int UInts (T t, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8,
1650 uint i1, uint i2, uint i3, uint i4) {
1651 return (int)(i1 + i2 + i3 + i4);
1653 public int Structs (T t, int dummy1, int a2, int a3, int a4, int a5, int a6, int a7, int dummy8,
1655 return s.a + s.b + s.c + s.d;
1659 // Passing small normal arguments on the stack
1660 public static int test_0_arm64_small_stack_args () {
1661 IFoo3<EmptyStruct> o = (IFoo3<EmptyStruct>)Activator.CreateInstance (typeof (Foo3<>).MakeGenericType (new Type [] { typeof (EmptyStruct) }));
1662 int res = o.Bytes (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8);
1665 int res2 = o.SBytes (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4);
1668 int res3 = o.Shorts (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4);
1671 int res4 = o.UShorts (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4);
1674 int res5 = o.Ints (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4);
1677 int res6 = o.UInts (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4);
1683 // Passing vtype normal arguments on the stack
1684 public static int test_0_arm64_vtype_stack_args () {
1685 IFoo3<EmptyStruct> o = (IFoo3<EmptyStruct>)Activator.CreateInstance (typeof (Foo3<>).MakeGenericType (new Type [] { typeof (EmptyStruct) }));
1686 int res = o.Structs (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, new BStruct () { a = 1, b = 2, c = 3, d = 4 });
1692 interface IFoo4<T> {
1693 T Get(T[,] arr, T t);
1696 class Foo4<T> : IFoo4<T> {
1697 public T Get(T[,] arr, T t) {
1707 public static int test_0_multi_dim_arrays_2 () {
1708 IFoo4<int> foo = new Foo4<int> ();
1709 var arr = new int [10, 10];
1710 int res = foo.Get (arr, 10);
1714 IFoo4<AStruct> foo2 = new Foo4<AStruct> ();
1715 var arr2 = new AStruct [10, 10];
1716 var res2 = foo2.Get (arr2, new AStruct () { a = 1, b = 2 });
1717 if (res2.a != 1 || res2.b != 2)
1722 public interface IFaceTest {
1723 int iface_method ();
1726 public interface IFaceConstrainedIFace {
1727 int foo<T, T2> (ref T val) where T: IFaceTest;
1730 class ConstrainedIFace : IFaceConstrainedIFace {
1731 public int foo<T, T2> (ref T val) where T: IFaceTest {
1732 return val.iface_method ();
1736 class ClassTest : IFaceTest {
1737 public int iface_method () {
1742 // Test constrained calls on an interface made from gsharedvt methods
1743 public static int test_42_gsharedvt_constrained_iface () {
1744 IFaceConstrainedIFace obj = new ConstrainedIFace ();
1745 IFaceTest t = new ClassTest ();
1746 return obj.foo<IFaceTest, int> (ref t);
1751 public class MobileServiceCollection<TTable, TCol>
1753 public async Task<int> LoadMoreItemsAsync(int count = 0) {
1754 await Task.Delay (1000);
1755 int results = await ProcessQueryAsync ();
1759 protected async virtual Task<int> ProcessQueryAsync() {
1760 await Task.Delay (1000);
1761 throw new Exception ();
1766 public class GSharedTests : Tests {