2 using System.Collections.Generic;
3 using System.Runtime.CompilerServices;
4 using System.Threading.Tasks;
7 public int i, j, k, l, m, n;
15 public static T static_dummy;
16 public static T static_t;
17 public static Foo static_f;
30 [MethodImplAttribute (MethodImplOptions.NoInlining)]
31 public GFoo3 (T i1, T i2) {
38 // Tests for generic sharing of vtypes.
39 // 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.
42 // FIXME: Add mixed ref/noref tests, i.e. Dictionary<string, int>
45 public class GSharedTests
51 public static int Main (String[] args) {
52 return TestDriver.RunTests (typeof (Tests), args);
56 [MethodImplAttribute (MethodImplOptions.NoInlining)]
57 static void gshared<T> (T [] array, int i, int j) {
59 array [i] = array [j];
63 // Test that the gshared and gsharedvt versions don't mix
64 public static int test_0_vt_gshared () {
65 string[] sarr = new string [2] { "A", "B" };
67 gshared<string> (sarr, 0, 1);
69 Foo[] arr = new Foo [2];
70 arr [0] = new Foo () { i = 1, j = 2 };
71 arr [1] = new Foo () { i = 3, j = 4 };
73 gshared<Foo> (arr, 0, 1);
74 if (arr [0].i != 3 || arr [0].j != 4)
76 if (arr [1].i != 1 || arr [1].j != 2)
82 static void ldelem_stelem<T> (T [] array, int i, int j) {
84 array [i] = array [j];
88 public static int test_0_vt_ldelem_stelem () {
89 Foo[] arr = new Foo [2];
90 arr [0] = new Foo () { i = 1, j = 2 };
91 arr [1] = new Foo () { i = 3, j = 4 };
93 ldelem_stelem<Foo> (arr, 0, 1);
94 if (arr [0].i != 3 || arr [0].j != 4)
96 if (arr [1].i != 1 || arr [1].j != 2)
99 int[] arr2 = new int [2] { 1, 2 };
100 ldelem_stelem<int> (arr2, 0, 1);
101 if (arr2 [0] !=2 || arr2 [1] != 1)
107 [MethodImplAttribute (MethodImplOptions.NoInlining)]
108 private static void initobj<T> (T [] array, int i, int j) {
113 public static int test_0_vt_initobj () {
114 Foo[] arr = new Foo [2];
115 arr [0] = new Foo () { i = 1, j = 2 };
116 arr [1] = new Foo () { i = 3, j = 4 };
118 initobj<Foo> (arr, 0, 1);
119 if (arr [0].i != 0 || arr [0].j != 0)
121 if (arr [1].i != 3 || arr [1].j != 4)
126 [MethodImplAttribute (MethodImplOptions.NoInlining)]
127 static T ldobj_stobj<T> (ref T t1, ref T t2) {
134 public static int test_0_vt_ldobj_stobj () {
137 if (ldobj_stobj (ref i, ref j) != 6)
139 if (i != 6 || j != 0)
143 if (ldobj_stobj (ref d1, ref d2) != 2.0)
145 if (d1 != 2.0 || d2 != 0.0)
150 [MethodImplAttribute (MethodImplOptions.NoInlining)]
151 private static void box<T1, T> (T [] array, object[] arr) {
152 object x = array [0];
156 public static int test_0_vt_box () {
157 Foo[] arr = new Foo [2];
158 arr [0] = new Foo () { i = 1, j = 2 };
160 object[] arr2 = new object [16];
161 box<int, Foo> (arr, arr2);
162 if (arr2 [0].GetType () != typeof (Foo))
164 Foo f = (Foo)arr2 [0];
165 if (f.i != 1 || f.j != 2)
167 string[] arr3 = new string [16];
168 object[] arr4 = new object [16];
170 box<int, string> (arr3, arr4);
171 if (arr4 [0] != (object)arr3 [0])
176 [MethodImplAttribute (MethodImplOptions.NoInlining)]
177 private static void unbox_any<T> (T [] array, object[] arr) {
182 public static int test_0_vt_unbox_any () {
183 int[] iarr = new int [16];
184 unbox_any<int> (iarr, new object [] { 12 });
186 Foo[] arr = new Foo [2];
188 object[] arr2 = new object [16];
189 arr2 [0] = new Foo () { i = 1, j = 2 };
190 unbox_any<Foo> (arr, arr2);
191 if (arr [0].i != 1 || arr [0].j != 2)
196 interface IFaceUnbox {
197 T Unbox<T, T2> (T t, T2 t2, object o);
200 class ClassUnbox : IFaceUnbox {
201 public T Unbox<T, T2> (T t, T2 t2, object o) {
206 // unbox.any on a ref type in a gsharedvt method
207 public static int test_0_ref_gsharedvt_aot_unbox_any () {
208 IFaceUnbox iface = new ClassUnbox ();
209 string s = iface.Unbox<string, int> ("A", 2, "A");
215 public static int test_0_unbox_any_enum () {
216 IFaceUnbox iface = new ClassUnbox ();
217 AnEnum res = iface.Unbox<AnEnum, int> (AnEnum.One, 0, 1);
218 if (res != AnEnum.Two)
220 res = iface.Unbox<AnEnum, int> (AnEnum.One, 0, AnEnum.Two);
221 if (res != AnEnum.Two)
226 [MethodImplAttribute (MethodImplOptions.NoInlining)]
227 static void ldfld_nongeneric<T> (GFoo<T>[] foo, int[] arr) {
231 [MethodImplAttribute (MethodImplOptions.NoInlining)]
232 static void ldfld<T> (GFoo<T>[] foo, T[] arr) {
236 [MethodImplAttribute (MethodImplOptions.NoInlining)]
237 static void stfld_nongeneric<T> (GFoo<T>[] foo, int[] arr) {
241 [MethodImplAttribute (MethodImplOptions.NoInlining)]
242 static void stfld<T> (GFoo<T>[] foo, T[] arr) {
246 [MethodImplAttribute (MethodImplOptions.NoInlining)]
247 static void ldflda<T> (GFoo<T>[] foo, int[] arr) {
248 arr [0] = foo [0].f.i;
251 public static int test_0_vt_ldfld_stfld () {
252 var foo = new GFoo<Foo> () { t = new Foo () { i = 1, j = 2 }, i = 5, f = new Foo () { i = 5, j = 6 } };
253 var farr = new GFoo<Foo>[] { foo };
255 /* Normal fields with a variable offset */
256 var iarr = new int [10];
257 ldfld_nongeneric<Foo> (farr, iarr);
261 stfld_nongeneric<Foo> (farr, iarr);
262 if (farr [0].i != 16)
265 /* Variable type field with a variable offset */
266 var arr = new Foo [10];
267 ldfld<Foo> (farr, arr);
268 if (arr [0].i != 1 || arr [0].j != 2)
270 arr [0] = new Foo () { i = 3, j = 4 };
271 stfld<Foo> (farr, arr);
272 if (farr [0].t.i != 3 || farr [0].t.j != 4)
275 ldflda<Foo> (farr, iarr);
282 [MethodImplAttribute (MethodImplOptions.NoInlining)]
283 static void stsfld<T> (T[] arr) {
284 GFoo<T>.static_t = arr [0];
287 [MethodImplAttribute (MethodImplOptions.NoInlining)]
288 static void ldsfld<T> (T[] arr) {
289 arr [0] = GFoo<T>.static_t;
292 [MethodImplAttribute (MethodImplOptions.NoInlining)]
293 static void ldsflda<T> (int[] iarr) {
294 iarr [0] = GFoo<T>.static_f.i;
297 public static int test_0_stsfld () {
298 Foo[] farr = new Foo [] { new Foo () { i = 1, j = 2 } };
301 if (GFoo<Foo>.static_t.i != 1 || GFoo<Foo>.static_t.j != 2)
304 Foo[] farr2 = new Foo [1];
306 if (farr2 [0].i != 1 || farr2 [0].j != 2)
309 var iarr = new int [10];
310 GFoo<Foo>.static_f = new Foo () { i = 5, j = 6 };
318 [MethodImplAttribute (MethodImplOptions.NoInlining)]
319 static object newarr<T> () {
320 object o = new T[10];
324 public static int test_0_vt_newarr () {
325 object o = newarr<Foo> ();
331 [MethodImplAttribute (MethodImplOptions.NoInlining)]
332 static Type ldtoken<T> () {
333 return typeof (GFoo<T>);
336 public static int test_0_vt_ldtoken () {
337 Type t = ldtoken<Foo> ();
338 if (t != typeof (GFoo<Foo>))
341 if (t != typeof (GFoo<int>))
347 public static int test_0_vtype_list () {
348 List<int> l = new List<int> ();
356 [MethodImplAttribute (MethodImplOptions.NoInlining)]
357 static int args_simple<T> (T t, int i) {
361 [MethodImplAttribute (MethodImplOptions.NoInlining)]
362 static int args_simple<T> (T t, int i, T t2) {
366 [MethodImplAttribute (MethodImplOptions.NoInlining)]
367 static Type args_rgctx<T> (T t, int i) {
371 [MethodImplAttribute (MethodImplOptions.NoInlining)]
372 static Type eh_in<T> (T t, int i) {
373 throw new OverflowException ();
376 [MethodImplAttribute (MethodImplOptions.NoInlining)]
377 static T return_t<T> (T t) {
381 [MethodImplAttribute (MethodImplOptions.NoInlining)]
382 T return_this_t<T> (T t) {
386 public static int test_0_gsharedvt_in () {
387 // Check that the non-generic argument is passed at the correct stack position
388 int r = args_simple<bool> (true, 42);
391 r = args_simple<Foo> (new Foo (), 43);
394 // Check that the proper rgctx is passed to the method
395 Type t = args_rgctx<int> (5, 42);
396 if (t != typeof (int))
398 var v = args_simple<GFoo2<int>> (new GFoo2<int> () { t = 11, t2 = 12 }, 44, new GFoo2<int> () { t = 11, t2 = 12 });
401 // Check that EH works properly
404 } catch (OverflowException) {
409 public static int test_0_gsharedvt_in_ret () {
410 int i = return_t<int> (42);
413 long l = return_t<long> (Int64.MaxValue);
414 if (l != Int64.MaxValue)
416 double d = return_t<double> (3.0);
419 float f = return_t<float> (3.0f);
422 short s = return_t<short> (16);
425 var v = new GFoo2<int> () { t = 55, t2 = 32 };
426 var v2 = return_t<GFoo2<int>> (v);
427 if (v2.t != 55 || v2.t2 != 32)
429 i = new GSharedTests ().return_this_t<int> (42);
435 public static int test_0_gsharedvt_in_delegates () {
436 Func<int, int> f = new Func<int, int> (return_t<int>);
442 [MethodImplAttribute (MethodImplOptions.NoInlining)]
443 static T return2_t<T> (T t) {
447 public static int test_0_gsharedvt_calls () {
448 if (return2_t (2) != 2)
450 if (return2_t ("A") != "A")
452 if (return2_t (2.0) != 2.0)
457 static GFoo3<T> newobj<T> (T t1, T t2) {
458 return new GFoo3<T> (t1, t2);
461 public static int test_0_gshared_new () {
462 var g1 = newobj (1, 2);
463 if (g1.t != 1 || g1.t2 != 2)
465 var g2 = newobj (1.0, 2.0);
466 if (g1.t != 1.0 || g1.t2 != 2.0)
472 [MethodImplAttribute (MethodImplOptions.NoInlining)]
473 static GFoo2<T> newobj_vt<T> (T t1, T t2) {
474 return new GFoo2<T> () { t = t1, t2 = t2 };
477 public static int test_0_gshared_new_vt () {
478 GFoo2<int> v1 = newobj_vt (1, 2);
479 if (v1.t != 1 || v1.t2 != 2)
481 GFoo2<double> v2 = newobj_vt (1.0, 2.0);
482 if (v2.t != 1.0 || v2.t2 != 2.0)
488 // Tests for transitioning out of gsharedvt code
491 // T1=Nullable<..> is not currently supported by gsharedvt
493 [MethodImplAttribute (MethodImplOptions.NoInlining)]
494 static T return_t_nogshared<T,T1> (T t) {
497 //Console.WriteLine ("X: " + t);
501 [MethodImplAttribute (MethodImplOptions.NoInlining)]
502 static int return_int_nogshared<T,T1> (T t) {
508 [MethodImplAttribute (MethodImplOptions.NoInlining)]
509 static A return_vtype_nogshared<T,T1> (T t) {
512 return new A () { a = 1, b = 2, c = 3 };
515 [MethodImplAttribute (MethodImplOptions.NoInlining)]
516 static T return2_t_out<T> (T t) {
517 return return_t_nogshared<T, int?> (t);
520 [MethodImplAttribute (MethodImplOptions.NoInlining)]
521 static int return2_int_out<T> (T t) {
522 return return_int_nogshared<T, int?> (t);
525 [MethodImplAttribute (MethodImplOptions.NoInlining)]
526 static A return2_vtype_out<T> (T t) {
527 return return_vtype_nogshared<T, int?> (t);
534 [Category ("!FULLAOT")]
535 public static int test_0_gsharedvt_out () {
536 if (return2_t_out (2) != 2)
538 if (return2_t_out ("A") != "A")
540 if (return2_t_out (2.0) != 2.0)
542 if (return2_t_out (2.0f) != 2.0f)
544 A a = new A () { a = 1, b = 2, c = 3 };
545 A a2 = return2_t_out (a);
546 if (a2.a != 1 || a2.b != 2 || a2.c != 3)
548 // Calls with non gsharedvt return types
549 if (return2_int_out (1) != 2)
551 A c = return2_vtype_out (a);
552 if (a2.a != 1 || a2.b != 2 || a2.c != 3)
557 public class GenericClass<T> {
558 public static T Z (IList<T> x, int index)
564 public static int test_0_generic_array_helpers () {
565 int[] x = new int[] {100, 200};
567 // Generic array helpers should be treated as gsharedvt-out
568 if (GenericClass<int>.Z (x, 0) != 100)
574 internal class IntComparer : IComparer<int>
576 public int Compare (int ix, int iy)
581 if (((uint) ix) < ((uint) iy))
587 [MethodImplAttribute (MethodImplOptions.NoInlining)]
588 static int gshared_out_iface<T> (T t1, T t2, IComparer<T> comp) {
589 return comp.Compare (t1, t2);
592 public static int test_0_gshared_out_iface () {
593 // Call out from gshared to a nongeneric method through a generic interface method
594 if (gshared_out_iface (2, 2, new IntComparer ()) != 0)
600 public int i1, i2, i3;
604 int i1, i2, i3, i4, i5;
608 [MethodImplAttribute (MethodImplOptions.NoInlining)]
609 public static void locals<T> (T t) {
610 Foo2<T> t2 = new Foo2<T> ();
614 public static int test_0_locals () {
615 // Test that instantiations of type parameters are allocated the proper local type
617 for (int j = 0; j < 10; ++j)
619 locals<Foo1> (new Foo1 () { i1 = 1, i2 = 2, i3 = 3 });
623 public interface IFace<T> {
624 T return_t_iface (T t);
627 public class Parent<T> {
628 public virtual T return_t_vcall (T t) {
629 throw new Exception ();
634 public class Child<T> : Parent<T>, IFace<T> {
635 public override T return_t_vcall (T t) {
638 public T return_t_iface (T t) {
643 [MethodImplAttribute (MethodImplOptions.NoInlining)]
644 static T return_t_vcall<T> (Parent<T> r, T t) {
645 return r.return_t_vcall (t);
648 public static int test_0_vcalls () {
649 if (return_t_vcall (new Child<int> (), 2) != 2)
652 for (int i = 0; i < 10; ++i) {
653 if (return_t_vcall (new Child<int> (), 2) != 2)
656 if (return_t_vcall (new Child<double> (), 2.0) != 2.0)
661 [MethodImplAttribute (MethodImplOptions.NoInlining)]
662 static T return_t_iface<T> (IFace<T> r, T t) {
663 return r.return_t_iface (t);
666 public static int test_0_iface_calls () {
667 if (return_t_iface (new Child<int> (), 2) != 2)
669 if (return_t_iface (new Child<double> (), 2.0) != 2.0)
678 static KeyValuePair<T1, T2> make_kvp<T1, T2> (T1 t1, T2 t2) {
679 return new KeyValuePair<T1, T2> (t1, t2);
682 static T2 use_kvp<T1, T2> (KeyValuePair<T1, T2> kvp) {
686 class ClassKVP : IFaceKVP {
687 public T do_kvp<T> (T a) {
688 var t = make_kvp (a, a);
689 // argument is an instance of a vtype instantiated with gsharedvt type arguments
694 public static int test_0_gsharedvt_ginstvt_constructed_arg () {
695 IFaceKVP c = new ClassKVP ();
696 if (c.do_kvp<long> (1) != 1)
706 class Getter : IGetter
708 public T Get<T>() { return default(T); }
711 abstract class Session
713 public abstract IGetter Getter { get; }
716 class IosSession : Session
718 private IGetter getter = new Getter();
719 public override IGetter Getter { get { return getter; } }
725 public static int test_0_regress_5156 () {
726 new IosSession().Getter.Get<ENUM_TYPE>();
741 public void OuterMethod<TArg1>(TArg1 value)
743 this.InnerMethod<TArg1, long>(value, 0);
746 private void InnerMethod<TArg1, TArg2>(TArg1 v1, TArg2 v2)
748 //Console.WriteLine("{0} {1}",v1,v2);
752 public static int test_0_regress_2096 () {
755 // The following work:
756 a.OuterMethod<int>(1);
757 a.OuterMethod<DateTime>(DateTime.Now);
760 a.OuterMethod<VT>(v);
763 // Next line will crash with Attempting to JIT compile method on device
764 // Attempting to JIT compile method
771 public void Test<T>()
773 //System.Console.WriteLine(typeof(T));
781 new B().Test<System.Collections.Generic.KeyValuePair<T, T>>();
785 public static int test_0_regress_6040 () {
786 //new B().Test<System.Collections.Generic.KeyValuePair<string, string>>();
788 new A<object>().Test();
789 new A<string>().Test();
793 class ArrayContainer<T> {
794 private T[,] container = new T[1,1];
797 [MethodImplAttribute (MethodImplOptions.NoInlining)]
799 return container [0, 0];
801 [MethodImplAttribute (MethodImplOptions.NoInlining)]
803 container [0, 0] = value;
808 [MethodImplAttribute (MethodImplOptions.NoInlining)]
809 public static int test_0_multi_dim_arrays () {
810 var c = new ArrayContainer<int> ();
812 return c.Prop == 5 ? 0 : 1;
815 [MethodImplAttribute (MethodImplOptions.NoInlining)]
816 static T2 rgctx_in_call_innner_inner<T1, T2> (T1 t1, T2 t2) {
820 [MethodImplAttribute (MethodImplOptions.NoInlining)]
821 static GFoo3<T> rgctx_in_call_inner<T> (T t) {
822 return rgctx_in_call_innner_inner (1, new GFoo3<T> ());
825 public static int test_0_rgctx_in_call () {
826 // The call is made through the rgctx call, and it needs an IN trampoline
827 var t = rgctx_in_call_inner (1);
833 [MethodImplAttribute (MethodImplOptions.NoInlining)]
834 static void arm_params1<T> (T t1, T t2, T t3, T t4, T t5, T t6) {
837 [MethodImplAttribute (MethodImplOptions.NoInlining)]
838 static void arm_params2<T> (T t1, T t2, T t3, long t4, T t5, T t6) {
841 public static int test_0_arm_param_passing () {
842 arm_params1<int> (1, 2, 3, 4, 5, 6);
843 arm_params1<int> (1, 2, 3, 4, 5, 6);
847 sealed class ScheduledItem<TAbsolute, TValue> {
848 private readonly object _scheduler;
849 private readonly TValue _state;
850 private readonly object _action;
852 public ScheduledItem(object o, TValue state, object action, TAbsolute dueTime) {
857 abstract class VirtualTimeSchedulerBase<TAbsolute, TRelative> {
858 public abstract void ScheduleAbsolute<TState>(TState state, TAbsolute dueTime);
861 class VirtualTimeScheduler<TAbsolute, TRelative> : VirtualTimeSchedulerBase<TAbsolute, TRelative> {
862 public override void ScheduleAbsolute<TState>(TState state, TAbsolute dueTime) {
863 var si = new ScheduledItem<TAbsolute, TState>(this, state, null, dueTime);
867 public static int test_0_rx_mixed_regress () {
868 var v = new VirtualTimeScheduler<long, long> ();
869 v.ScheduleAbsolute<Action> (null, 22);
874 public virtual T foo<T> (T t) {
879 class Class1 : Base {
882 public override T foo<T> (T t) {
888 class Class2 : Base {
891 public override T foo<T> (T t) {
897 [MethodImplAttribute (MethodImplOptions.NoInlining)]
898 public static void bar<T> (Base b, T t) {
902 public static int test_0_virtual_generic () {
903 Class1 c1 = new Class1 ();
904 Class2 c2 = new Class2 ();
906 if (!(c1.o is int) || ((int)c1.o != 5))
909 if (!(c1.o is double) || ((double)c1.o != 6.0))
912 if (!(c1.o is float) || ((float)c1.o != 7.0f))
915 if (!(c2.o is int) || ((int)c2.o != 5))
922 [MethodImplAttribute (MethodImplOptions.NoInlining)]
923 static string to_string<T, T2>(T t, T2 t2) {
924 return t.ToString ();
932 public static int test_0_constrained_tostring () {
933 if (to_string<int, int> (1, 1) != "1")
935 if (to_string<AnEnum, int> (AnEnum.One, 1) != "One")
937 if (to_string<string, int> ("A", 1) != "A")
942 [MethodImplAttribute (MethodImplOptions.NoInlining)]
943 static int get_hash<T, T2>(T t, T2 t2) {
944 return t.GetHashCode ();
947 public static int test_0_constrained_get_hash () {
948 if (get_hash<int, int> (1, 1) != 1.GetHashCode ())
950 if (get_hash<double, int> (1.0, 1) != 1.0.GetHashCode ())
952 if (get_hash<AnEnum, int> (AnEnum.One, 1) != AnEnum.One.GetHashCode ())
954 if (get_hash<string, int> ("A", 1) != "A".GetHashCode ())
959 [MethodImplAttribute (MethodImplOptions.NoInlining)]
960 static bool equals<T, T2>(T t, T2 t2) {
964 public static int test_0_constrained_equals () {
965 if (equals<int, int> (1, 1) != true)
967 if (equals<double, int> (1.0, 1) != true)
969 if (equals<AnEnum, int> (AnEnum.One, 1) != true)
971 if (equals<string, int> ("A", 1) != true)
976 struct Pair<T1, T2> {
981 [MethodImplAttribute (MethodImplOptions.NoInlining)]
982 public static TState call_del<TState>(TState state, Func<object, TState, TState> action) {
983 return action(null, state);
986 public static int test_0_delegate_wrappers () {
987 Func<object, Pair<int, int>, Pair<int, int>> del1 = delegate (object o, Pair<int, int> p) { return p; };
988 Func<object, Pair<int, int>, Pair<int, int>> del2 = delegate (object o, Pair<int, int> p) { return p; };
989 Func<object, Pair<double, int>, Pair<double, int>> del3 = delegate (object o, Pair<double, int> p) { return p; };
990 var r1 = call_del<Pair<int, int>> (new Pair<int, int> { First = 1, Second = 2}, del1);
991 if (r1.First != 1 || r1.Second != 2)
993 var r2 = call_del<Pair<int, int>> (new Pair<int, int> { First = 3, Second = 4}, del2);
994 if (r2.First != 3 || r2.Second != 4)
996 var r3 = call_del<Pair<double, int>> (new Pair<double, int> { First = 1.0, Second = 2}, del3);
997 if (r3.First != 1.0 || r3.Second != 2)
1003 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1004 public object foo<T1> (T1 t1, T t, object o) {
1009 class AClass : Base<long> {
1011 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1012 public object bar<T> (T t, long time, object o) {
1013 return foo (t, time, o);
1017 public static int test_0_out_in_wrappers () {
1018 var a = new AClass ();
1020 object o2 = a.bar<long> (1024, 0, o1);
1030 class Base<TAbsolute, T2> : BIFace {
1032 public TAbsolute Clock { get; set; }
1034 public virtual object AMethod () {
1039 class BClass : Base<long, long> {
1042 public static int test_0_regress_1 () {
1043 BIFace c = new BClass ();
1044 object o = c.AMethod ();
1045 if (!(o is long) || ((long)o != 0))
1051 T unbox_any<T> (object o);
1054 class Class3 : IFace3 {
1055 public virtual T unbox_any<T> (object o) {
1060 public static int test_0_unbox_any () {
1061 IFace3 o = new Class3 ();
1062 if (o.unbox_any<int> (16) != 16)
1064 if (o.unbox_any<long> ((long)32) != 32)
1066 if (o.unbox_any<double> (2.0) != 2.0)
1069 o.unbox_any<int> (2.0);
1071 } catch (Exception) {
1077 TSource Catch<TSource, TException>(TSource t) where TException : Exception;
1080 class Class4 : IFace4 {
1081 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1082 public TSource Catch<TSource, TException>(TSource t) where TException : Exception {
1087 // Check that mixed instantiations are correctly created/found in AOT
1088 public static int test_0_constraints () {
1089 IFace4 o = new Class4 ();
1090 o.Catch<int, Exception> (1);
1094 internal static Type Process<TSource, TElement> (TSource[] arr, Action<TElement, TElement> call) {
1095 arr [0] = default (TSource);
1096 return typeof (TSource);
1103 class Class5 : IFace5 {
1104 public Type foo<T> () {
1105 return Process<KeyValuePair<long, T>, T> (new KeyValuePair<long, T> [10], null);
1109 public static int test_0_rgctx_call_from_gshared_code () {
1110 var c = new Class5 ();
1111 if (c.foo<string> () != typeof (KeyValuePair<long, string>))
1116 public class Enumbers<T> {
1117 public object Enumerate (List<KeyValuePair<T, string>> alist)
1119 return alist.ToArray ();
1123 public static int test_0_checkthis_gshared_call () {
1124 Enumbers<string> e = new Enumbers<string> ();
1129 catch (NullReferenceException) {
1138 class Class6 : IFace6 {
1139 public T[] Del<T> (T t) {
1140 var res = new T [5];
1141 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; };
1142 var v = func.BeginInvoke(t, t, t, t, null, null);
1143 res [4] = func.EndInvoke (v);
1148 // FIXME: The runtime-invoke wrapper used by BeginInvoke is not found
1149 [Category ("!FULLAOT")]
1150 public static int test_0_begin_end_invoke () {
1151 IFace6 o = new Class6 ();
1152 var arr1 = o.Del (1);
1153 if (arr1 [0] != 1 || arr1 [1] != 1 || arr1 [2] != 1 || arr1 [3] != 1 || arr1 [4] != 1)
1155 var arr2 = o.Del (2.0);
1156 if (arr2 [0] != 2.0 || arr2 [1] != 2.0 || arr2 [2] != 2.0 || arr2 [3] != 2.0 || arr2 [4] != 2.0)
1161 public class TAbstractTableItem<TC> {
1162 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1163 public static void SetProperty<TV> () { }
1165 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1166 public static void Test () {
1167 SetProperty<bool> ();
1171 public static int test_0_gsharedvt_method_on_shared_class () {
1172 TAbstractTableItem<object>.Test ();
1176 interface IFaceBox {
1177 object box<T> (T t);
1180 class ClassBox : IFaceBox {
1181 public object box<T> (T t) {
1187 public static int test_0_nullable_box () {
1188 IFaceBox c = new ClassBox ();
1190 object o = c.box<int?> (i);
1193 if (c.box<int?> (null) != null)
1195 long l = Int64.MaxValue - 1;
1196 o = c.box<long?> (l);
1199 if (c.box<long?> (null) != null)
1202 if (c.box<string> (s) != (object)s)
1207 interface IFaceUnbox2 {
1208 T unbox<T> (object o);
1211 class ClassUnbox2 : IFaceUnbox2 {
1212 public T unbox<T> (object o) {
1217 public static int test_0_nullable_unbox () {
1218 IFaceUnbox2 c = new ClassUnbox2 ();
1219 int? i = c.unbox<int?> (5);
1222 int? j = c.unbox<int?> (null);
1228 interface IConstrained {
1230 void foo_ref_arg (string s);
1233 interface IConstrained<T3> {
1234 void foo_gsharedvt_arg (T3 s);
1237 static object constrained_res;
1239 struct ConsStruct : IConstrained {
1242 public void foo () {
1243 constrained_res = i;
1246 public void foo_ref_arg (string s) {
1247 constrained_res = s == "A" ? 42 : 0;
1251 class ConsClass : IConstrained {
1254 public void foo () {
1255 constrained_res = i;
1258 public void foo_ref_arg (string s) {
1259 constrained_res = s == "A" ? 43 : 0;
1263 struct ConsStruct<T> : IConstrained<T> {
1264 public void foo_gsharedvt_arg (T s) {
1265 constrained_res = s;
1269 interface IFaceConstrained {
1270 void constrained_void_iface_call<T, T2>(T t, T2 t2) where T2 : IConstrained;
1271 void constrained_void_iface_call_ref_arg<T, T2>(T t, T2 t2) where T2 : IConstrained;
1272 void constrained_void_iface_call_gsharedvt_arg<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T>;
1275 class ClassConstrained : IFaceConstrained {
1276 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1277 public void constrained_void_iface_call<T, T2>(T t, T2 t2) where T2 : IConstrained {
1281 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1282 public void constrained_void_iface_call_ref_arg<T, T2>(T t, T2 t2) where T2 : IConstrained {
1283 t2.foo_ref_arg ("A");
1286 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1287 public void constrained_void_iface_call_gsharedvt_arg<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T> {
1288 t2.foo_gsharedvt_arg (t);
1292 public static int test_0_constrained_void_iface_call () {
1293 IFaceConstrained c = new ClassConstrained ();
1294 var s = new ConsStruct () { i = 42 };
1295 constrained_res = null;
1296 c.constrained_void_iface_call<int, ConsStruct> (1, s);
1297 if (!(constrained_res is int) || ((int)constrained_res) != 42)
1299 constrained_res = null;
1300 c.constrained_void_iface_call_ref_arg<int, ConsStruct> (1, s);
1301 if (!(constrained_res is int) || ((int)constrained_res) != 42)
1303 var s2 = new ConsClass () { i = 43 };
1304 constrained_res = null;
1305 c.constrained_void_iface_call<int, ConsClass> (1, s2);
1306 if (!(constrained_res is int) || ((int)constrained_res) != 43)
1308 constrained_res = null;
1309 c.constrained_void_iface_call_ref_arg<int, ConsClass> (1, s2);
1310 if (!(constrained_res is int) || ((int)constrained_res) != 43)
1315 public static int test_0_constraine_void_iface_call_gsharedvt_arg () {
1316 // This tests constrained calls through interfaces with one gsharedvt arg, like IComparable<T>.CompareTo ()
1317 IFaceConstrained c = new ClassConstrained ();
1319 var s = new ConsStruct<int> ();
1320 constrained_res = null;
1321 c.constrained_void_iface_call_gsharedvt_arg<int, ConsStruct<int>, int> (42, s, 55);
1322 if (!(constrained_res is int) || ((int)constrained_res) != 42)
1325 var s2 = new ConsStruct<string> ();
1326 constrained_res = null;
1327 c.constrained_void_iface_call_gsharedvt_arg<string, ConsStruct<string>, int> ("A", s2, 55);
1328 if (!(constrained_res is string) || ((string)constrained_res) != "A")
1334 public static async Task<T> FooAsync<T> (int i, int j) {
1335 Task<int> t = new Task<int> (delegate () { return 42; });
1336 var response = await t;
1340 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1341 public static void call_async<T> (int i, int j) {
1342 Task<T> t = FooAsync<T> (1, 2);
1343 t.RunSynchronously ();
1346 // In AOT mode, the async infrastructure depends on gsharedvt methods
1347 public static int test_0_async_call_from_generic () {
1348 call_async<string> (1, 2);
1354 public class MobileServiceCollection<TTable, TCol>
1356 public async Task<int> LoadMoreItemsAsync(int count = 0) {
1357 await Task.Delay (1000);
1358 int results = await ProcessQueryAsync ();
1362 protected async virtual Task<int> ProcessQueryAsync() {
1363 await Task.Delay (1000);
1364 throw new Exception ();
1369 public class GSharedTests : Tests {