+
+ public enum IntEnum {
+ A,B,C
+ }
+
+ public enum UintEnum : uint {
+ A,B,C
+ }
+
+ static bool TryCast<T> (object o) {
+ return o is T[];
+ }
+
+ public static int test_0_primitive_array_cast () {
+ object a = new int[1];
+ object b = new uint[1];
+ object c = new IntEnum[1];
+ object d = new UintEnum[1];
+
+ object[] arr = new object[] { a, b, c, d };
+ int err = 1;
+
+ foreach (var v in arr) {
+ if (!TryCast<int> (v))
+ return err;
+ if (!TryCast<uint> (v))
+ return err + 1;
+ if (!TryCast<IntEnum> (v))
+ return err + 2;
+ if (!TryCast<UintEnum> (v))
+ return err + 3;
+ err += 4;
+ }
+
+ foreach (var v in arr) {
+ if (!(v is int[]))
+ return err;
+ if (!(v is uint[]))
+ return err;
+ if (!(v is IntEnum[]))
+ return err;
+ if (!(v is UintEnum[]))
+ return err;
+ err += 4;
+ }
+ return 0;
+ }
+
+ public static int test_0_intptr_array_cast () {
+ object[] a = new object[] { new int[1], new uint[1] };
+ object[] b = new object[] { new long[1], new ulong[1] };
+ object[] c = new object[] { new IntPtr[1], new UIntPtr[1] };
+
+ int err = 1;
+ if (IntPtr.Size == 4) {
+ foreach (var v in a) {
+ if (!(v is IntPtr[]))
+ return err;
+ if (!(v is IntPtr[]))
+ return err;
+ err += 2;
+ }
+ foreach (var v in b) {
+ if (v is IntPtr[])
+ return err;
+ if (v is IntPtr[])
+ return err;
+ err += 2;
+ }
+
+ foreach (var v in c) {
+ if (!(v is int[]))
+ return err;
+ if (!(v is uint[]))
+ return err;
+ err += 2;
+ }
+ } else {
+ foreach (var v in a) {
+ if (v is IntPtr[])
+ return err;
+ if (v is IntPtr[])
+ return err;
+ err += 2;
+ }
+ foreach (var v in b) {
+ if (!(v is IntPtr[]))
+ return err;
+ if (!(v is IntPtr[]))
+ return err;
+ err += 2;
+ }
+ foreach (var v in c) {
+ if (!(v is long[]))
+ return err;
+ if (!(v is ulong[]))
+ return err;
+ err += 2;
+ }
+ }
+ return 0;
+ }
+
+ public static int test_0_long_indices () {
+ int[] arr = new int [10];
+ int[,] arr2 = new int [10, 10];
+ long index = 1;
+ arr [index] = 5;
+ if (arr [index] != 5)
+ return 1;
+ arr2 [index, index] = 5;
+ if (arr2 [index, index] != 5)
+ return 2;
+ return 0;
+ }
+
+ // #7438
+ public static int test_0_ldelema_2_64bit () {
+ bool[,] test = new bool[201,201];
+ int x,y;
+ for(x=-100;x<100;x++) for(y=-100;y<100;y++){
+ test[x+100,y+100] = true;
+ }
+ return 0;
+ }
+
+ static bool alloc_long (long l) {
+ try {
+ var arr = new byte[l];
+ return false;
+ } catch (Exception e) {
+ return true;
+ }
+ }
+
+ // #13544
+ public static int test_0_newarr_ovf () {
+ if (!alloc_long (5000000000))
+ return 1;
+ if (!alloc_long (4000000000))
+ return 2;
+ if (!alloc_long (-1))
+ return 3;
+ if (!alloc_long (-4000000000))
+ return 4;
+ if (!alloc_long (-6000000000))
+ return 5;
+ return 0;
+ }
+
+ static int llvm_ldlen_licm (int[] arr) {
+ int sum = 0;
+ // The ldlen should be moved out of the loop
+ for (int i = 0; i < arr.Length; ++i)
+ sum += arr [i];
+ return sum;
+ }
+
+ public static int test_10_llvm_ldlen_licm () {
+ int[] arr = new int [10];
+ for (int i = 0; i < 10; ++i)
+ arr [i] = 1;
+ return llvm_ldlen_licm (arr);
+ }