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>);
468 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
469 public static T return_t
<T
> (T t
) {
474 public static int test_0_gsharedvt_in_delegates_reflection () {
475 var m
= typeof(DelClass
).GetMethod ("return_t").MakeGenericMethod (new Type
[] { typeof (int) }
);
476 Func
<int, int> f
= (Func
<int, int>)Delegate
.CreateDelegate (typeof (Func
<int,int>), null, m
, false);
482 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
483 static T return2_t
<T
> (T t
) {
487 public static int test_0_gsharedvt_calls () {
488 if (return2_t (2) != 2)
490 if (return2_t ("A") != "A")
492 if (return2_t (2.0) != 2.0)
497 static GFoo3
<T
> newobj
<T
> (T t1
, T t2
) {
498 return new GFoo3
<T
> (t1
, t2
);
501 public static int test_0_gshared_new () {
502 var g1
= newobj (1, 2);
503 if (g1
.t
!= 1 || g1
.t2
!= 2)
505 var g2
= newobj (1.0, 2.0);
506 if (g1
.t
!= 1.0 || g1
.t2
!= 2.0)
512 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
513 static GFoo2
<T
> newobj_vt
<T
> (T t1
, T t2
) {
514 return new GFoo2
<T
> () { t = t1, t2 = t2 }
;
517 public static int test_0_gshared_new_vt () {
518 GFoo2
<int> v1
= newobj_vt (1, 2);
519 if (v1
.t
!= 1 || v1
.t2
!= 2)
521 GFoo2
<double> v2
= newobj_vt (1.0, 2.0);
522 if (v2
.t
!= 1.0 || v2
.t2
!= 2.0)
528 // Tests for transitioning out of gsharedvt code
531 // T1=Nullable<..> is not currently supported by gsharedvt
533 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
534 static T return_t_nogshared
<T
,T1
> (T t
) {
537 //Console.WriteLine ("X: " + t);
541 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
542 static int return_int_nogshared
<T
,T1
> (T t
) {
548 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
549 static A return_vtype_nogshared
<T
,T1
> (T t
) {
552 return new A () { a = 1, b = 2, c = 3 }
;
555 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
556 static T return2_t_out
<T
> (T t
) {
557 return return_t_nogshared
<T
, int?> (t
);
560 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
561 static int return2_int_out
<T
> (T t
) {
562 return return_int_nogshared
<T
, int?> (t
);
565 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
566 static A return2_vtype_out
<T
> (T t
) {
567 return return_vtype_nogshared
<T
, int?> (t
);
574 [Category ("!FULLAOT")]
575 public static int test_0_gsharedvt_out () {
576 if (return2_t_out (2) != 2)
578 if (return2_t_out ("A") != "A")
580 if (return2_t_out (2.0) != 2.0)
582 if (return2_t_out (2.0f
) != 2.0f
)
584 A a
= new A () { a = 1, b = 2, c = 3 }
;
585 A a2
= return2_t_out (a
);
586 if (a2
.a
!= 1 || a2
.b
!= 2 || a2
.c
!= 3)
588 // Calls with non gsharedvt return types
589 if (return2_int_out (1) != 2)
591 A c
= return2_vtype_out (a
);
592 if (a2
.a
!= 1 || a2
.b
!= 2 || a2
.c
!= 3)
597 public class GenericClass
<T
> {
598 public static T
Z (IList
<T
> x
, int index
)
604 public static int test_0_generic_array_helpers () {
605 int[] x
= new int[] {100, 200}
;
607 // Generic array helpers should be treated as gsharedvt-out
608 if (GenericClass
<int>.Z (x
, 0) != 100)
614 internal class IntComparer
: IComparer
<int>
616 public int Compare (int ix
, int iy
)
621 if (((uint) ix
) < ((uint) iy
))
627 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
628 static int gshared_out_iface
<T
> (T t1
, T t2
, IComparer
<T
> comp
) {
629 return comp
.Compare (t1
, t2
);
632 public static int test_0_gshared_out_iface () {
633 // Call out from gshared to a nongeneric method through a generic interface method
634 if (gshared_out_iface (2, 2, new IntComparer ()) != 0)
640 public int i1
, i2
, i3
;
644 int i1
, i2
, i3
, i4
, i5
;
648 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
649 public static void locals
<T
> (T t
) {
650 Foo2
<T
> t2
= new Foo2
<T
> ();
654 public static int test_0_locals () {
655 // Test that instantiations of type parameters are allocated the proper local type
657 for (int j
= 0; j
< 10; ++j
)
659 locals
<Foo1
> (new Foo1 () { i1 = 1, i2 = 2, i3 = 3 }
);
663 public interface IFace
<T
> {
664 T
return_t_iface (T t
);
667 public class Parent
<T
> {
668 public virtual T
return_t_vcall (T t
) {
669 throw new Exception ();
674 public class Child
<T
> : Parent
<T
>, IFace
<T
> {
675 public override T
return_t_vcall (T t
) {
678 public T
return_t_iface (T t
) {
683 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
684 static T return_t_vcall
<T
> (Parent
<T
> r
, T t
) {
685 return r
.return_t_vcall (t
);
688 public static int test_0_vcalls () {
689 if (return_t_vcall (new Child
<int> (), 2) != 2)
692 for (int i
= 0; i
< 10; ++i
) {
693 if (return_t_vcall (new Child
<int> (), 2) != 2)
696 if (return_t_vcall (new Child
<double> (), 2.0) != 2.0)
701 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
702 static T return_t_iface
<T
> (IFace
<T
> r
, T t
) {
703 return r
.return_t_iface (t
);
706 public static int test_0_iface_calls () {
707 if (return_t_iface (new Child
<int> (), 2) != 2)
709 if (return_t_iface (new Child
<double> (), 2.0) != 2.0)
718 static KeyValuePair
<T1
, T2
> make_kvp
<T1
, T2
> (T1 t1
, T2 t2
) {
719 return new KeyValuePair
<T1
, T2
> (t1
, t2
);
722 static T2 use_kvp
<T1
, T2
> (KeyValuePair
<T1
, T2
> kvp
) {
726 class ClassKVP
: IFaceKVP
{
727 public T do_kvp
<T
> (T a
) {
728 var t
= make_kvp (a
, a
);
729 // argument is an instance of a vtype instantiated with gsharedvt type arguments
734 public static int test_0_gsharedvt_ginstvt_constructed_arg () {
735 IFaceKVP c
= new ClassKVP ();
736 if (c
.do_kvp
<long> (1) != 1)
746 class Getter
: IGetter
748 public T Get
<T
>() { return default(T); }
751 abstract class Session
753 public abstract IGetter Getter { get; }
756 class IosSession
: Session
758 private IGetter getter
= new Getter();
759 public override IGetter Getter { get { return getter; }
}
765 public static int test_0_regress_5156 () {
766 new IosSession().Getter
.Get
<ENUM_TYPE
>();
781 public void OuterMethod
<TArg1
>(TArg1
value)
783 this.InnerMethod
<TArg1
, long>(value, 0);
786 private void InnerMethod
<TArg1
, TArg2
>(TArg1 v1
, TArg2 v2
)
788 //Console.WriteLine("{0} {1}",v1,v2);
792 public static int test_0_regress_2096 () {
795 // The following work:
796 a
.OuterMethod
<int>(1);
797 a
.OuterMethod
<DateTime
>(DateTime
.Now
);
800 a
.OuterMethod
<VT
>(v
);
803 // Next line will crash with Attempting to JIT compile method on device
804 // Attempting to JIT compile method
811 public void Test
<T
>()
813 //System.Console.WriteLine(typeof(T));
821 new B().Test
<System
.Collections
.Generic
.KeyValuePair
<T
, T
>>();
825 public static int test_0_regress_6040 () {
826 //new B().Test<System.Collections.Generic.KeyValuePair<string, string>>();
828 new A
<object>().Test();
829 new A
<string>().Test();
833 class ArrayContainer
<T
> {
834 private T
[,] container
= new T
[1,1];
837 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
839 return container
[0, 0];
841 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
843 container
[0, 0] = value;
848 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
849 public static int test_0_multi_dim_arrays () {
850 var c
= new ArrayContainer
<int> ();
852 return c
.Prop
== 5 ? 0 : 1;
855 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
856 static T2 rgctx_in_call_innner_inner
<T1
, T2
> (T1 t1
, T2 t2
) {
860 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
861 static GFoo3
<T
> rgctx_in_call_inner
<T
> (T t
) {
862 return rgctx_in_call_innner_inner (1, new GFoo3
<T
> ());
865 public static int test_0_rgctx_in_call () {
866 // The call is made through the rgctx call, and it needs an IN trampoline
867 var t
= rgctx_in_call_inner (1);
873 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
874 static void arm_params1
<T
> (T t1
, T t2
, T t3
, T t4
, T t5
, T t6
) {
877 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
878 static void arm_params2
<T
> (T t1
, T t2
, T t3
, long t4
, T t5
, T t6
) {
881 public static int test_0_arm_param_passing () {
882 arm_params1
<int> (1, 2, 3, 4, 5, 6);
883 arm_params1
<int> (1, 2, 3, 4, 5, 6);
887 sealed class ScheduledItem
<TAbsolute
, TValue
> {
888 private readonly object _scheduler
;
889 private readonly TValue _state
;
890 private readonly object _action
;
892 public ScheduledItem(object o
, TValue state
, object action
, TAbsolute dueTime
) {
897 abstract class VirtualTimeSchedulerBase
<TAbsolute
, TRelative
> {
898 public abstract void ScheduleAbsolute
<TState
>(TState state
, TAbsolute dueTime
);
901 class VirtualTimeScheduler
<TAbsolute
, TRelative
> : VirtualTimeSchedulerBase
<TAbsolute
, TRelative
> {
902 public override void ScheduleAbsolute
<TState
>(TState state
, TAbsolute dueTime
) {
903 var si
= new ScheduledItem
<TAbsolute
, TState
>(this, state
, null, dueTime
);
907 public static int test_0_rx_mixed_regress () {
908 var v
= new VirtualTimeScheduler
<long, long> ();
909 v
.ScheduleAbsolute
<Action
> (null, 22);
914 public virtual T foo
<T
> (T t
) {
919 class Class1
: Base
{
922 public override T foo
<T
> (T t
) {
928 class Class2
: Base
{
931 public override T foo
<T
> (T t
) {
937 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
938 public static void bar
<T
> (Base b
, T t
) {
942 public static int test_0_virtual_generic () {
943 Class1 c1
= new Class1 ();
944 Class2 c2
= new Class2 ();
946 if (!(c1
.o
is int) || ((int)c1
.o
!= 5))
949 if (!(c1
.o
is double) || ((double)c1
.o
!= 6.0))
952 if (!(c1
.o
is float) || ((float)c1
.o
!= 7.0f
))
955 if (!(c2
.o
is int) || ((int)c2
.o
!= 5))
962 public interface IFace1
<T
> {
970 public class ClassIFace
<T
> : IFace1
<T
> {
983 interface IFaceIFaceCall
{
984 void call
<T
, T2
> (IFace1
<object> iface
);
987 class MakeIFaceCall
: IFaceIFaceCall
{
988 public void call
<T
, T2
> (IFace1
<object> iface
) {
993 // Check normal interface calls from gsharedvt call to fully instantiated methods
994 public static int test_0_instatiated_iface_call () {
995 ClassIFace
<object> c1
= new ClassIFace
<object> ();
997 IFaceIFaceCall c
= new MakeIFaceCall ();
999 c
.call
<object, int> (c1
);
1003 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1004 static string to_string
<T
, T2
>(T t
, T2 t2
) {
1005 return t
.ToString ();
1013 public static int test_0_constrained_tostring () {
1014 if (to_string
<int, int> (1, 1) != "1")
1016 if (to_string
<AnEnum
, int> (AnEnum
.One
, 1) != "One")
1018 if (to_string
<string, int> ("A", 1) != "A")
1023 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1024 static int get_hash
<T
, T2
>(T t
, T2 t2
) {
1025 return t
.GetHashCode ();
1028 public static int test_0_constrained_get_hash () {
1029 if (get_hash
<int, int> (1, 1) != 1.GetHashCode ())
1031 if (get_hash
<double, int> (1.0, 1) != 1.0.GetHashCode ())
1033 if (get_hash
<AnEnum
, int> (AnEnum
.One
, 1) != AnEnum
.One
.GetHashCode ())
1035 if (get_hash
<string, int> ("A", 1) != "A".GetHashCode ())
1040 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1041 static bool equals
<T
, T2
>(T t
, T2 t2
) {
1042 return t
.Equals (t
);
1045 public static int test_0_constrained_equals () {
1046 if (equals
<int, int> (1, 1) != true)
1048 if (equals
<double, int> (1.0, 1) != true)
1050 if (equals
<AnEnum
, int> (AnEnum
.One
, 1) != true)
1052 if (equals
<string, int> ("A", 1) != true)
1057 interface IGetType
{
1058 Type gettype
<T
, T2
>(T t
, T2 t2
);
1061 public class CGetType
: IGetType
{
1062 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1063 public Type gettype
<T
, T2
>(T t
, T2 t2
) {
1064 return t
.GetType ();
1067 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1068 public Type gettype2
<T
>(T t
) {
1069 return t
.GetType ();
1073 public static int test_0_constrained_gettype () {
1074 IGetType c
= new CGetType ();
1075 if (c
.gettype
<int, int> (1, 1) != typeof (int))
1077 if (c
.gettype
<string, int> ("A", 1) != typeof (string))
1079 /* Partial sharing */
1080 var c2
= new CGetType ();
1081 if (c2
.gettype2
<long> (1) != typeof (long))
1086 interface IConstrainedCalls
{
1087 Pair
<int, int> vtype_ret
<T
, T2
>(T t
, T2 t2
) where T
: IReturnVType
;
1090 public interface IReturnVType
{
1091 Pair
<int, int> return_vtype ();
1094 public class CConstrainedCalls
: IConstrainedCalls
{
1095 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1096 public Pair
<int, int> vtype_ret
<T
, T2
>(T t
, T2 t2
) where T
: IReturnVType
{
1097 return t
.return_vtype ();
1101 class ReturnVType
: IReturnVType
{
1102 public Pair
<int, int> return_vtype () {
1103 return new Pair
<int, int> () { First = 1, Second = 2 }
;
1107 public static int test_0_constrained_vtype_ret () {
1108 IConstrainedCalls c
= new CConstrainedCalls ();
1109 var r
= c
.vtype_ret
<ReturnVType
, int> (new ReturnVType (), 1);
1110 if (r
.First
!= 1 || r
.Second
!= 2)
1115 public struct Pair
<T1
, T2
> {
1120 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1121 public static TState call_del
<TState
>(TState state
, Func
<object, TState
, TState
> action
) {
1122 return action(null, state
);
1125 [Category ("!FULLAOT")]
1126 public static int test_0_delegate_wrappers () {
1127 Func
<object, Pair
<int, int>, Pair
<int, int>> del1
= delegate (object o
, Pair
<int, int> p
) { return p; }
;
1128 Func
<object, Pair
<int, int>, Pair
<int, int>> del2
= delegate (object o
, Pair
<int, int> p
) { return p; }
;
1129 Func
<object, Pair
<double, int>, Pair
<double, int>> del3
= delegate (object o
, Pair
<double, int> p
) { return p; }
;
1130 var r1
= call_del
<Pair
<int, int>> (new Pair
<int, int> { First = 1, Second = 2}
, del1
);
1131 if (r1
.First
!= 1 || r1
.Second
!= 2)
1133 var r2
= call_del
<Pair
<int, int>> (new Pair
<int, int> { First = 3, Second = 4}
, del2
);
1134 if (r2
.First
!= 3 || r2
.Second
!= 4)
1136 var r3
= call_del
<Pair
<double, int>> (new Pair
<double, int> { First = 1.0, Second = 2}
, del3
);
1137 if (r3
.First
!= 1.0 || r3
.Second
!= 2)
1143 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1144 public object foo
<T1
> (T1 t1
, T t
, object o
) {
1149 class AClass
: Base
<long> {
1151 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1152 public object bar
<T
> (T t
, long time
, object o
) {
1153 return foo (t
, time
, o
);
1157 public static int test_0_out_in_wrappers () {
1158 var a
= new AClass ();
1160 object o2
= a
.bar
<long> (1024, 0, o1
);
1170 class Base
<TAbsolute
, T2
> : BIFace
{
1172 public TAbsolute Clock { get; set; }
1174 public virtual object AMethod () {
1179 class BClass
: Base
<long, long> {
1182 public static int test_0_regress_1 () {
1183 BIFace c
= new BClass ();
1184 object o
= c
.AMethod ();
1185 if (!(o
is long) || ((long)o
!= 0))
1191 T unbox_any
<T
> (object o
);
1194 class Class3
: IFace3
{
1195 public virtual T unbox_any
<T
> (object o
) {
1200 public static int test_0_unbox_any () {
1201 IFace3 o
= new Class3 ();
1202 if (o
.unbox_any
<int> (16) != 16)
1204 if (o
.unbox_any
<long> ((long)32) != 32)
1206 if (o
.unbox_any
<double> (2.0) != 2.0)
1209 o
.unbox_any
<int> (2.0);
1211 } catch (Exception
) {
1217 TSource Catch
<TSource
, TException
>(TSource t
) where TException
: Exception
;
1220 class Class4
: IFace4
{
1221 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1222 public TSource Catch
<TSource
, TException
>(TSource t
) where TException
: Exception
{
1227 // Check that mixed instantiations are correctly created/found in AOT
1228 public static int test_0_constraints () {
1229 IFace4 o
= new Class4 ();
1230 o
.Catch
<int, Exception
> (1);
1234 internal static Type Process
<TSource
, TElement
> (TSource
[] arr
, Action
<TElement
, TElement
> call
) {
1235 arr
[0] = default (TSource
);
1236 return typeof (TSource
);
1243 class Class5
: IFace5
{
1244 public Type foo
<T
> () {
1245 return Process
<KeyValuePair
<long, T
>, T
> (new KeyValuePair
<long, T
> [10], null);
1249 public static int test_0_rgctx_call_from_gshared_code () {
1250 var c
= new Class5 ();
1251 if (c
.foo
<string> () != typeof (KeyValuePair
<long, string>))
1256 public class Enumbers
<T
> {
1257 public object Enumerate (List
<KeyValuePair
<T
, string>> alist
)
1259 return alist
.ToArray ();
1263 public static int test_0_checkthis_gshared_call () {
1264 Enumbers
<string> e
= new Enumbers
<string> ();
1269 catch (NullReferenceException
) {
1278 class Class6
: IFace6
{
1279 public T
[] Del
<T
> (T t
) {
1280 var res
= new T
[5];
1281 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; }
;
1282 var v
= func
.BeginInvoke(t
, t
, t
, t
, null, null);
1283 res
[4] = func
.EndInvoke (v
);
1288 // FIXME: The runtime-invoke wrapper used by BeginInvoke is not found
1289 [Category ("!FULLAOT")]
1290 public static int test_0_begin_end_invoke () {
1291 IFace6 o
= new Class6 ();
1292 var arr1
= o
.Del (1);
1293 if (arr1
[0] != 1 || arr1
[1] != 1 || arr1
[2] != 1 || arr1
[3] != 1 || arr1
[4] != 1)
1295 var arr2
= o
.Del (2.0);
1296 if (arr2
[0] != 2.0 || arr2
[1] != 2.0 || arr2
[2] != 2.0 || arr2
[3] != 2.0 || arr2
[4] != 2.0)
1301 public class TAbstractTableItem
<TC
> {
1302 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1303 public static void SetProperty
<TV
> () { }
1305 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1306 public static void Test () {
1307 SetProperty
<bool> ();
1311 public static int test_0_gsharedvt_method_on_shared_class () {
1312 TAbstractTableItem
<object>.Test ();
1316 interface IFaceBox
{
1317 object box
<T
> (T t
);
1318 bool is_null
<T
> (T t
);
1321 class ClassBox
: IFaceBox
{
1322 public object box
<T
> (T t
) {
1327 public bool is_null
<T
> (T t
) {
1328 if (!(default(T
) == null))
1334 public static int test_0_nullable_box () {
1335 IFaceBox c
= new ClassBox ();
1337 object o
= c
.box
<int?> (i
);
1340 if (c
.box
<int?> (null) != null)
1342 long l
= Int64
.MaxValue
- 1;
1343 o
= c
.box
<long?> (l
);
1346 if (c
.box
<long?> (null) != null)
1349 if (c
.box
<string> (s
) != (object)s
)
1354 public static int test_0_nullable_box_brtrue_opt () {
1355 IFaceBox c
= new ClassBox ();
1357 if (c
.is_null
<double?> (null))
1363 interface IFaceUnbox2
{
1364 T unbox
<T
> (object o
);
1367 class ClassUnbox2
: IFaceUnbox2
{
1368 public T unbox
<T
> (object o
) {
1373 public static int test_0_nullable_unbox () {
1374 IFaceUnbox2 c
= new ClassUnbox2 ();
1375 int? i
= c
.unbox
<int?> (5);
1378 int? j
= c
.unbox
<int?> (null);
1384 interface IConstrained
{
1386 void foo_ref_arg (string s
);
1389 interface IConstrained
<T3
> {
1390 void foo_gsharedvt_arg (T3 s
);
1391 T3
foo_gsharedvt_ret (T3 s
);
1394 static object constrained_res
;
1396 struct ConsStruct
: IConstrained
{
1399 public void foo () {
1400 constrained_res
= i
;
1403 public void foo_ref_arg (string s
) {
1404 constrained_res
= s
== "A" ? 42 : 0;
1408 class ConsClass
: IConstrained
{
1411 public void foo () {
1412 constrained_res
= i
;
1415 public void foo_ref_arg (string s
) {
1416 constrained_res
= s
== "A" ? 43 : 0;
1420 struct ConsStruct
<T
> : IConstrained
<T
> {
1421 public void foo_gsharedvt_arg (T s
) {
1422 constrained_res
= s
;
1425 public T
foo_gsharedvt_ret (T s
) {
1430 struct ConsStructThrow
: IConstrained
{
1431 public void foo () {
1432 throw new Exception ();
1435 public void foo_ref_arg (string s
) {
1439 interface IFaceConstrained
{
1440 void constrained_void_iface_call
<T
, T2
>(T t
, T2 t2
) where T2
: IConstrained
;
1441 void constrained_void_iface_call_ref_arg
<T
, T2
>(T t
, T2 t2
) where T2
: IConstrained
;
1442 void constrained_void_iface_call_gsharedvt_arg
<T
, T2
, T3
>(T t
, T2 t2
, T3 t3
) where T2
: IConstrained
<T
>;
1443 T constrained_iface_call_gsharedvt_ret
<T
, T2
, T3
>(T t
, T2 t2
, T3 t3
) where T2
: IConstrained
<T
>;
1444 T2 constrained_normal_call
<T
, T2
>(T t
, T2 t2
) where T2
: VClass
;
1447 class ClassConstrained
: IFaceConstrained
{
1448 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1449 public void constrained_void_iface_call
<T
, T2
>(T t
, T2 t2
) where T2
: IConstrained
{
1453 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1454 public void constrained_void_iface_call_ref_arg
<T
, T2
>(T t
, T2 t2
) where T2
: IConstrained
{
1455 t2
.foo_ref_arg ("A");
1458 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1459 public void constrained_void_iface_call_gsharedvt_arg
<T
, T2
, T3
>(T t
, T2 t2
, T3 t3
) where T2
: IConstrained
<T
> {
1460 t2
.foo_gsharedvt_arg (t
);
1463 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1464 public T constrained_iface_call_gsharedvt_ret
<T
, T2
, T3
>(T t
, T2 t2
, T3 t3
) where T2
: IConstrained
<T
> {
1465 return t2
.foo_gsharedvt_ret (t
);
1468 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1469 public T2 constrained_normal_call
<T
, T2
>(T t
, T2 t2
) where T2
: VClass
{
1470 /* This becomes a constrained call even through 't2' is forced to be a reference type by the constraint */
1471 return (T2
)t2
.foo (5);
1476 public virtual VClass
foo (int i
) {
1481 public static int test_0_constrained_void_iface_call () {
1482 IFaceConstrained c
= new ClassConstrained ();
1483 var s
= new ConsStruct () { i = 42 }
;
1484 constrained_res
= null;
1485 c
.constrained_void_iface_call
<int, ConsStruct
> (1, s
);
1486 if (!(constrained_res
is int) || ((int)constrained_res
) != 42)
1488 constrained_res
= null;
1489 c
.constrained_void_iface_call_ref_arg
<int, ConsStruct
> (1, s
);
1490 if (!(constrained_res
is int) || ((int)constrained_res
) != 42)
1492 var s2
= new ConsClass () { i = 43 }
;
1493 constrained_res
= null;
1494 c
.constrained_void_iface_call
<int, ConsClass
> (1, s2
);
1495 if (!(constrained_res
is int) || ((int)constrained_res
) != 43)
1497 constrained_res
= null;
1498 c
.constrained_void_iface_call_ref_arg
<int, ConsClass
> (1, s2
);
1499 if (!(constrained_res
is int) || ((int)constrained_res
) != 43)
1504 public static int test_0_constrained_eh () {
1505 var s2
= new ConsStructThrow () { }
;
1507 IFaceConstrained c
= new ClassConstrained ();
1508 c
.constrained_void_iface_call
<int, ConsStructThrow
> (1, s2
);
1510 } catch (Exception
) {
1515 public static int test_0_constrained_void_iface_call_gsharedvt_arg () {
1516 // This tests constrained calls through interfaces with one gsharedvt arg, like IComparable<T>.CompareTo ()
1517 IFaceConstrained c
= new ClassConstrained ();
1519 var s
= new ConsStruct
<int> ();
1520 constrained_res
= null;
1521 c
.constrained_void_iface_call_gsharedvt_arg
<int, ConsStruct
<int>, int> (42, s
, 55);
1522 if (!(constrained_res
is int) || ((int)constrained_res
) != 42)
1525 var s2
= new ConsStruct
<string> ();
1526 constrained_res
= null;
1527 c
.constrained_void_iface_call_gsharedvt_arg
<string, ConsStruct
<string>, int> ("A", s2
, 55);
1528 if (!(constrained_res
is string) || ((string)constrained_res
) != "A")
1534 public static int test_0_constrained_iface_call_gsharedvt_ret () {
1535 IFaceConstrained c
= new ClassConstrained ();
1537 var s
= new ConsStruct
<int> ();
1538 int ires
= c
.constrained_iface_call_gsharedvt_ret
<int, ConsStruct
<int>, int> (42, s
, 55);
1542 var s2
= new ConsStruct
<string> ();
1543 string sres
= c
.constrained_iface_call_gsharedvt_ret
<string, ConsStruct
<string>, int> ("A", s2
, 55);
1550 public static int test_0_constrained_normal_call () {
1551 IFaceConstrained c
= new ClassConstrained ();
1553 var o
= new VClass ();
1554 var res
= c
.constrained_normal_call
<int, VClass
> (1, o
);
1555 return res
== o
? 0 : 1;
1558 public static async Task
<T
> FooAsync
<T
> (int i
, int j
) {
1559 Task
<int> t
= new Task
<int> (delegate () { return 42; }
);
1560 var response
= await t
;
1564 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1565 public static void call_async
<T
> (int i
, int j
) {
1566 Task
<T
> t
= FooAsync
<T
> (1, 2);
1567 // FIXME: This doesn't work
1568 //t.RunSynchronously ();
1571 // In AOT mode, the async infrastructure depends on gsharedvt methods
1572 public static int test_0_async_call_from_generic () {
1573 call_async
<string> (1, 2);
1577 public static int test_0_array_helper_gsharedvt () {
1578 var arr
= new AnEnum
[16];
1579 var c
= new ReadOnlyCollection
<AnEnum
> (arr
);
1580 return c
.Contains (AnEnum
.Two
) == false ? 0 : 1;
1583 interface IFaceCallPatching
{
1584 bool caller
<T
, T2
> ();
1587 class CallPatching2
<T
> {
1591 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1592 public bool callee () {
1593 return (string)o
== "ABC";
1597 class CallPatching
: IFaceCallPatching
{
1598 public bool caller
<T
, T2
> () {
1599 var c
= new CallPatching2
<T
> ();
1606 // This tests that generic calls made from gsharedvt methods are not patched normally.
1607 // If they are, the first call to 'caller' would patch in the gshared version of
1608 // 'callee', causing the second call to fail because the gshared version of callee
1609 // wouldn't work with CallPatching2<bool> since it has a different object layout.
1611 public static int test_0_call_patching () {
1612 IFaceCallPatching c
= new CallPatching ();
1613 c
.caller
<object, bool> ();
1614 if (!c
.caller
<bool, bool> ())
1619 struct EmptyStruct
{
1622 public struct BStruct
{
1623 public int a
, b
, c
, d
;
1626 interface IFoo3
<T
> {
1627 int Bytes (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1628 byte b1
, byte b2
, byte b3
, byte b4
, byte b5
, byte b6
, byte b7
, byte b8
);
1629 int SBytes (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1630 sbyte b1
, sbyte b2
, sbyte b3
, sbyte b4
);
1631 int Shorts (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1632 short b1
, short b2
, short b3
, short b4
);
1633 int UShorts (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1634 ushort b1
, ushort b2
, ushort b3
, ushort b4
);
1635 int Ints (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1636 int i1
, int i2
, int i3
, int i4
);
1637 int UInts (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1638 uint i1
, uint i2
, uint i3
, uint i4
);
1639 int Structs (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1643 class Foo3
<T
> : IFoo3
<T
> {
1644 public int Bytes (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1645 byte b1
, byte b2
, byte b3
, byte b4
, byte b5
, byte b6
, byte b7
, byte b8
) {
1646 return b1
+ b2
+ b3
+ b4
+ b5
+ b6
+ b7
+ b8
;
1648 public int SBytes (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1649 sbyte b1
, sbyte b2
, sbyte b3
, sbyte b4
) {
1650 return b1
+ b2
+ b3
+ b4
;
1652 public int Shorts (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1653 short b1
, short b2
, short b3
, short b4
) {
1654 return b1
+ b2
+ b3
+ b4
;
1656 public int UShorts (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1657 ushort b1
, ushort b2
, ushort b3
, ushort b4
) {
1658 return b1
+ b2
+ b3
+ b4
;
1660 public int Ints (T t
, int a1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int a8
,
1661 int i1
, int i2
, int i3
, int i4
) {
1662 return i1
+ i2
+ i3
+ i4
;
1664 public int UInts (T t
, int a1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int a8
,
1665 uint i1
, uint i2
, uint i3
, uint i4
) {
1666 return (int)(i1
+ i2
+ i3
+ i4
);
1668 public int Structs (T t
, int dummy1
, int a2
, int a3
, int a4
, int a5
, int a6
, int a7
, int dummy8
,
1670 return s
.a
+ s
.b
+ s
.c
+ s
.d
;
1674 // Passing small normal arguments on the stack
1675 public static int test_0_arm64_small_stack_args () {
1676 IFoo3
<EmptyStruct
> o
= (IFoo3
<EmptyStruct
>)Activator
.CreateInstance (typeof (Foo3
<>).MakeGenericType (new Type
[] { typeof (EmptyStruct) }
));
1677 int res
= o
.Bytes (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8);
1680 int res2
= o
.SBytes (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4);
1683 int res3
= o
.Shorts (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4);
1686 int res4
= o
.UShorts (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4);
1689 int res5
= o
.Ints (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, -1, -2, -3, -4);
1692 int res6
= o
.UInts (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4);
1698 // Passing vtype normal arguments on the stack
1699 public static int test_0_arm64_vtype_stack_args () {
1700 IFoo3
<EmptyStruct
> o
= (IFoo3
<EmptyStruct
>)Activator
.CreateInstance (typeof (Foo3
<>).MakeGenericType (new Type
[] { typeof (EmptyStruct) }
));
1701 int res
= o
.Structs (new EmptyStruct (), 1, 2, 3, 4, 5, 6, 7, 8, new BStruct () { a = 1, b = 2, c = 3, d = 4 }
);
1707 interface IFoo4
<T
> {
1708 T
Get(T
[,] arr
, T t
);
1711 class Foo4
<T
> : IFoo4
<T
> {
1712 public T
Get(T
[,] arr
, T t
) {
1722 public static int test_0_multi_dim_arrays_2 () {
1723 IFoo4
<int> foo
= new Foo4
<int> ();
1724 var arr
= new int [10, 10];
1725 int res
= foo
.Get (arr
, 10);
1729 IFoo4
<AStruct
> foo2
= new Foo4
<AStruct
> ();
1730 var arr2
= new AStruct
[10, 10];
1731 var res2
= foo2
.Get (arr2
, new AStruct () { a = 1, b = 2 }
);
1732 if (res2
.a
!= 1 || res2
.b
!= 2)
1737 public interface IFaceTest
{
1738 int iface_method ();
1741 public interface IFaceConstrainedIFace
{
1742 int foo
<T
, T2
> (ref T val
) where T
: IFaceTest
;
1745 class ConstrainedIFace
: IFaceConstrainedIFace
{
1746 public int foo
<T
, T2
> (ref T val
) where T
: IFaceTest
{
1747 return val
.iface_method ();
1751 class ClassTest
: IFaceTest
{
1752 public int iface_method () {
1757 // Test constrained calls on an interface made from gsharedvt methods
1758 public static int test_42_gsharedvt_constrained_iface () {
1759 IFaceConstrainedIFace obj
= new ConstrainedIFace ();
1760 IFaceTest t
= new ClassTest ();
1761 return obj
.foo
<IFaceTest
, int> (ref t
);
1766 public class MobileServiceCollection
<TTable
, TCol
>
1768 public async Task
<int> LoadMoreItemsAsync(int count
= 0) {
1769 await Task
.Delay (1000);
1770 int results
= await ProcessQueryAsync ();
1774 protected async virtual Task
<int> ProcessQueryAsync() {
1775 await Task
.Delay (1000);
1776 throw new Exception ();
1781 public class GSharedTests
: Tests
{