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 ();
1053 public static int test_0_constrained_gettype () {
1054 IGetType c = new CGetType ();
1055 if (c.gettype<int, int> (1, 1) != typeof (int))
1057 if (c.gettype<string, int> ("A", 1) != typeof (string))
1062 interface IConstrainedCalls {
1063 Pair<int, int> vtype_ret<T, T2>(T t, T2 t2) where T: IReturnVType;
1066 public interface IReturnVType {
1067 Pair<int, int> return_vtype ();
1070 public class CConstrainedCalls : IConstrainedCalls {
1071 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1072 public Pair<int, int> vtype_ret<T, T2>(T t, T2 t2) where T : IReturnVType {
1073 return t.return_vtype ();
1077 class ReturnVType : IReturnVType {
1078 public Pair<int, int> return_vtype () {
1079 return new Pair<int, int> () { First = 1, Second = 2 };
1083 public static int test_0_constrained_vtype_ret () {
1084 IConstrainedCalls c = new CConstrainedCalls ();
1085 var r = c.vtype_ret<ReturnVType, int> (new ReturnVType (), 1);
1086 if (r.First != 1 || r.Second != 2)
1091 public struct Pair<T1, T2> {
1096 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1097 public static TState call_del<TState>(TState state, Func<object, TState, TState> action) {
1098 return action(null, state);
1101 [Category ("!FULLAOT")]
1102 public static int test_0_delegate_wrappers () {
1103 Func<object, Pair<int, int>, Pair<int, int>> del1 = delegate (object o, Pair<int, int> p) { return p; };
1104 Func<object, Pair<int, int>, Pair<int, int>> del2 = delegate (object o, Pair<int, int> p) { return p; };
1105 Func<object, Pair<double, int>, Pair<double, int>> del3 = delegate (object o, Pair<double, int> p) { return p; };
1106 var r1 = call_del<Pair<int, int>> (new Pair<int, int> { First = 1, Second = 2}, del1);
1107 if (r1.First != 1 || r1.Second != 2)
1109 var r2 = call_del<Pair<int, int>> (new Pair<int, int> { First = 3, Second = 4}, del2);
1110 if (r2.First != 3 || r2.Second != 4)
1112 var r3 = call_del<Pair<double, int>> (new Pair<double, int> { First = 1.0, Second = 2}, del3);
1113 if (r3.First != 1.0 || r3.Second != 2)
1119 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1120 public object foo<T1> (T1 t1, T t, object o) {
1125 class AClass : Base<long> {
1127 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1128 public object bar<T> (T t, long time, object o) {
1129 return foo (t, time, o);
1133 public static int test_0_out_in_wrappers () {
1134 var a = new AClass ();
1136 object o2 = a.bar<long> (1024, 0, o1);
1146 class Base<TAbsolute, T2> : BIFace {
1148 public TAbsolute Clock { get; set; }
1150 public virtual object AMethod () {
1155 class BClass : Base<long, long> {
1158 public static int test_0_regress_1 () {
1159 BIFace c = new BClass ();
1160 object o = c.AMethod ();
1161 if (!(o is long) || ((long)o != 0))
1167 T unbox_any<T> (object o);
1170 class Class3 : IFace3 {
1171 public virtual T unbox_any<T> (object o) {
1176 public static int test_0_unbox_any () {
1177 IFace3 o = new Class3 ();
1178 if (o.unbox_any<int> (16) != 16)
1180 if (o.unbox_any<long> ((long)32) != 32)
1182 if (o.unbox_any<double> (2.0) != 2.0)
1185 o.unbox_any<int> (2.0);
1187 } catch (Exception) {
1193 TSource Catch<TSource, TException>(TSource t) where TException : Exception;
1196 class Class4 : IFace4 {
1197 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1198 public TSource Catch<TSource, TException>(TSource t) where TException : Exception {
1203 // Check that mixed instantiations are correctly created/found in AOT
1204 public static int test_0_constraints () {
1205 IFace4 o = new Class4 ();
1206 o.Catch<int, Exception> (1);
1210 internal static Type Process<TSource, TElement> (TSource[] arr, Action<TElement, TElement> call) {
1211 arr [0] = default (TSource);
1212 return typeof (TSource);
1219 class Class5 : IFace5 {
1220 public Type foo<T> () {
1221 return Process<KeyValuePair<long, T>, T> (new KeyValuePair<long, T> [10], null);
1225 public static int test_0_rgctx_call_from_gshared_code () {
1226 var c = new Class5 ();
1227 if (c.foo<string> () != typeof (KeyValuePair<long, string>))
1232 public class Enumbers<T> {
1233 public object Enumerate (List<KeyValuePair<T, string>> alist)
1235 return alist.ToArray ();
1239 public static int test_0_checkthis_gshared_call () {
1240 Enumbers<string> e = new Enumbers<string> ();
1245 catch (NullReferenceException) {
1254 class Class6 : IFace6 {
1255 public T[] Del<T> (T t) {
1256 var res = new T [5];
1257 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; };
1258 var v = func.BeginInvoke(t, t, t, t, null, null);
1259 res [4] = func.EndInvoke (v);
1264 // FIXME: The runtime-invoke wrapper used by BeginInvoke is not found
1265 [Category ("!FULLAOT")]
1266 public static int test_0_begin_end_invoke () {
1267 IFace6 o = new Class6 ();
1268 var arr1 = o.Del (1);
1269 if (arr1 [0] != 1 || arr1 [1] != 1 || arr1 [2] != 1 || arr1 [3] != 1 || arr1 [4] != 1)
1271 var arr2 = o.Del (2.0);
1272 if (arr2 [0] != 2.0 || arr2 [1] != 2.0 || arr2 [2] != 2.0 || arr2 [3] != 2.0 || arr2 [4] != 2.0)
1277 public class TAbstractTableItem<TC> {
1278 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1279 public static void SetProperty<TV> () { }
1281 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1282 public static void Test () {
1283 SetProperty<bool> ();
1287 public static int test_0_gsharedvt_method_on_shared_class () {
1288 TAbstractTableItem<object>.Test ();
1292 interface IFaceBox {
1293 object box<T> (T t);
1296 class ClassBox : IFaceBox {
1297 public object box<T> (T t) {
1303 public static int test_0_nullable_box () {
1304 IFaceBox c = new ClassBox ();
1306 object o = c.box<int?> (i);
1309 if (c.box<int?> (null) != null)
1311 long l = Int64.MaxValue - 1;
1312 o = c.box<long?> (l);
1315 if (c.box<long?> (null) != null)
1318 if (c.box<string> (s) != (object)s)
1323 interface IFaceUnbox2 {
1324 T unbox<T> (object o);
1327 class ClassUnbox2 : IFaceUnbox2 {
1328 public T unbox<T> (object o) {
1333 public static int test_0_nullable_unbox () {
1334 IFaceUnbox2 c = new ClassUnbox2 ();
1335 int? i = c.unbox<int?> (5);
1338 int? j = c.unbox<int?> (null);
1344 interface IConstrained {
1346 void foo_ref_arg (string s);
1349 interface IConstrained<T3> {
1350 void foo_gsharedvt_arg (T3 s);
1351 T3 foo_gsharedvt_ret (T3 s);
1354 static object constrained_res;
1356 struct ConsStruct : IConstrained {
1359 public void foo () {
1360 constrained_res = i;
1363 public void foo_ref_arg (string s) {
1364 constrained_res = s == "A" ? 42 : 0;
1368 class ConsClass : IConstrained {
1371 public void foo () {
1372 constrained_res = i;
1375 public void foo_ref_arg (string s) {
1376 constrained_res = s == "A" ? 43 : 0;
1380 struct ConsStruct<T> : IConstrained<T> {
1381 public void foo_gsharedvt_arg (T s) {
1382 constrained_res = s;
1385 public T foo_gsharedvt_ret (T s) {
1390 struct ConsStructThrow : IConstrained {
1391 public void foo () {
1392 throw new Exception ();
1395 public void foo_ref_arg (string s) {
1399 interface IFaceConstrained {
1400 void constrained_void_iface_call<T, T2>(T t, T2 t2) where T2 : IConstrained;
1401 void constrained_void_iface_call_ref_arg<T, T2>(T t, T2 t2) where T2 : IConstrained;
1402 void constrained_void_iface_call_gsharedvt_arg<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T>;
1403 T constrained_iface_call_gsharedvt_ret<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T>;
1404 T2 constrained_normal_call<T, T2>(T t, T2 t2) where T2 : VClass;
1407 class ClassConstrained : IFaceConstrained {
1408 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1409 public void constrained_void_iface_call<T, T2>(T t, T2 t2) where T2 : IConstrained {
1413 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1414 public void constrained_void_iface_call_ref_arg<T, T2>(T t, T2 t2) where T2 : IConstrained {
1415 t2.foo_ref_arg ("A");
1418 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1419 public void constrained_void_iface_call_gsharedvt_arg<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T> {
1420 t2.foo_gsharedvt_arg (t);
1423 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1424 public T constrained_iface_call_gsharedvt_ret<T, T2, T3>(T t, T2 t2, T3 t3) where T2 : IConstrained<T> {
1425 return t2.foo_gsharedvt_ret (t);
1428 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1429 public T2 constrained_normal_call<T, T2>(T t, T2 t2) where T2 : VClass {
1430 /* This becomes a constrained call even through 't2' is forced to be a reference type by the constraint */
1431 return (T2)t2.foo (5);
1436 public virtual VClass foo (int i) {
1441 public static int test_0_constrained_void_iface_call () {
1442 IFaceConstrained c = new ClassConstrained ();
1443 var s = new ConsStruct () { i = 42 };
1444 constrained_res = null;
1445 c.constrained_void_iface_call<int, ConsStruct> (1, s);
1446 if (!(constrained_res is int) || ((int)constrained_res) != 42)
1448 constrained_res = null;
1449 c.constrained_void_iface_call_ref_arg<int, ConsStruct> (1, s);
1450 if (!(constrained_res is int) || ((int)constrained_res) != 42)
1452 var s2 = new ConsClass () { i = 43 };
1453 constrained_res = null;
1454 c.constrained_void_iface_call<int, ConsClass> (1, s2);
1455 if (!(constrained_res is int) || ((int)constrained_res) != 43)
1457 constrained_res = null;
1458 c.constrained_void_iface_call_ref_arg<int, ConsClass> (1, s2);
1459 if (!(constrained_res is int) || ((int)constrained_res) != 43)
1464 public static int test_0_constrained_eh () {
1465 var s2 = new ConsStructThrow () { };
1467 IFaceConstrained c = new ClassConstrained ();
1468 c.constrained_void_iface_call<int, ConsStructThrow> (1, s2);
1470 } catch (Exception) {
1475 public static int test_0_constrained_void_iface_call_gsharedvt_arg () {
1476 // This tests constrained calls through interfaces with one gsharedvt arg, like IComparable<T>.CompareTo ()
1477 IFaceConstrained c = new ClassConstrained ();
1479 var s = new ConsStruct<int> ();
1480 constrained_res = null;
1481 c.constrained_void_iface_call_gsharedvt_arg<int, ConsStruct<int>, int> (42, s, 55);
1482 if (!(constrained_res is int) || ((int)constrained_res) != 42)
1485 var s2 = new ConsStruct<string> ();
1486 constrained_res = null;
1487 c.constrained_void_iface_call_gsharedvt_arg<string, ConsStruct<string>, int> ("A", s2, 55);
1488 if (!(constrained_res is string) || ((string)constrained_res) != "A")
1494 public static int test_0_constrained_iface_call_gsharedvt_ret () {
1495 IFaceConstrained c = new ClassConstrained ();
1497 var s = new ConsStruct<int> ();
1498 int ires = c.constrained_iface_call_gsharedvt_ret<int, ConsStruct<int>, int> (42, s, 55);
1502 var s2 = new ConsStruct<string> ();
1503 string sres = c.constrained_iface_call_gsharedvt_ret<string, ConsStruct<string>, int> ("A", s2, 55);
1510 public static int test_0_constrained_normal_call () {
1511 IFaceConstrained c = new ClassConstrained ();
1513 var o = new VClass ();
1514 var res = c.constrained_normal_call<int, VClass> (1, o);
1515 return res == o ? 0 : 1;
1518 public static async Task<T> FooAsync<T> (int i, int j) {
1519 Task<int> t = new Task<int> (delegate () { return 42; });
1520 var response = await t;
1524 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1525 public static void call_async<T> (int i, int j) {
1526 Task<T> t = FooAsync<T> (1, 2);
1527 // FIXME: This doesn't work
1528 //t.RunSynchronously ();
1531 // In AOT mode, the async infrastructure depends on gsharedvt methods
1532 public static int test_0_async_call_from_generic () {
1533 call_async<string> (1, 2);
1537 public static int test_0_array_helper_gsharedvt () {
1538 var arr = new AnEnum [16];
1539 var c = new ReadOnlyCollection<AnEnum> (arr);
1540 return c.Contains (AnEnum.Two) == false ? 0 : 1;
1543 interface IFaceCallPatching {
1544 bool caller<T, T2> ();
1547 class CallPatching2<T> {
1551 [MethodImplAttribute (MethodImplOptions.NoInlining)]
1552 public bool callee () {
1553 return (string)o == "ABC";
1557 class CallPatching : IFaceCallPatching {
1558 public bool caller<T, T2> () {
1559 var c = new CallPatching2<T> ();
1566 // This tests that generic calls made from gsharedvt methods are not patched normally.
1567 // If they are, the first call to 'caller' would patch in the gshared version of
1568 // 'callee', causing the second call to fail because the gshared version of callee
1569 // wouldn't work with CallPatching2<bool> since it has a different object layout.
1571 public static int test_0_call_patching () {
1572 IFaceCallPatching c = new CallPatching ();
1573 c.caller<object, bool> ();
1574 if (!c.caller<bool, bool> ())
1581 public class MobileServiceCollection<TTable, TCol>
1583 public async Task<int> LoadMoreItemsAsync(int count = 0) {
1584 await Task.Delay (1000);
1585 int results = await ProcessQueryAsync ();
1589 protected async virtual Task<int> ProcessQueryAsync() {
1590 await Task.Delay (1000);
1591 throw new Exception ();
1596 public class GSharedTests : Tests {