Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / mini / aot-tests.cs
index 6092346ea4ccb21349b8d22bba00ef891fad4a79..82fb3ae674dfe4030e7ff8b9fe35be8cb2c56d12 100644 (file)
@@ -4,6 +4,7 @@ using System.Linq;
 using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Runtime.CompilerServices;
+using System.Collections;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 
@@ -25,6 +26,7 @@ class Tests
 
        public delegate void ArrayDelegate (int[,] arr);
 
+       [Category ("!WASM")] //Requires a working threadpool
        static int test_0_array_delegate_full_aot () {
                ArrayDelegate d = delegate (int[,] arr) {
                };
@@ -84,6 +86,7 @@ class Tests
        }
 
        [Category ("DYNCALL")]
+       [Category ("!FULLAOT-AMD64")]
        static int test_0_arm64_dyncall_hfa_double () {
                double arg1 = 1.0f;
                // HFA with double members
@@ -97,6 +100,7 @@ class Tests
        }
 
        [Category ("DYNCALL")]
+       [Category ("!FULLAOT-AMD64")]
        static int test_0_arm64_dyncall_hfa_float () {
                double arg1 = 1.0f;
                var s = new Struct2 ();
@@ -110,6 +114,7 @@ class Tests
 
        [Category ("DYNCALL")]
        [Category ("GSHAREDVT")]
+       [Category ("!FULLAOT-AMD64")]
        static int test_0_arm64_dyncall_gsharedvt_out_hfa_double () {
                /* gsharedvt out trampoline with double hfa argument */
                double arg1 = 1.0f;
@@ -129,6 +134,7 @@ class Tests
 
        [Category ("DYNCALL")]
        [Category ("GSHAREDVT")]
+       [Category ("!FULLAOT-AMD64")]
        static int test_0_arm64_dyncall_gsharedvt_out_hfa_float () {
                /* gsharedvt out trampoline with double hfa argument */
                double arg1 = 1.0f;
@@ -190,6 +196,8 @@ class Tests
        }
 
        [Category ("DYNCALL")]
+       [Category ("GSHAREDVT")]
+       [Category ("!FULLAOT-AMD64")]
        static int test_0_arm64_dyncall_vtypebyref_ret () {
                var s = new VTypeByRefStruct () { o1 = 1, o2 = 2, o3 = 3 };
                Type t = typeof (Foo5<>).MakeGenericType (new Type [] { typeof (VTypeByRefStruct) });
@@ -210,7 +218,8 @@ class Tests
                }
        }
 
-       [Category("DYNCALL")]
+       [Category ("DYNCALL")]
+       [Category ("GSHAREDVT")]
        static int test_0_arm_dyncall_reg_stack_split () {
                var m = typeof (Foo6).GetMethod ("reg_stack_split_inner").MakeGenericMethod (new Type[] { typeof (long) });
                var o = new Foo6 ();
@@ -238,9 +247,21 @@ class Tests
                public static T GetValue<T>(Nullable<T> value) where T : struct {
                        return value.Value;
                }
+
+               [MethodImplAttribute (MethodImplOptions.NoInlining)]
+               public static Nullable<T> Get<T>(T t) where T : struct {
+                       return t;
+               }
+
+               [MethodImplAttribute (MethodImplOptions.NoInlining)]
+               public static Nullable<T> GetNull<T>() where T : struct {
+                       return null;
+               }
        }
 
        [Category ("DYNCALL")]
+       [Category ("!FULLAOT-AMD64")]
+       [Category ("!INTERPRETER")] //known bug in the interpreter
        public static int test_0_dyncall_nullable () {
                int? v;
 
@@ -259,6 +280,14 @@ class Tests
                var res = (int)typeof (NullableMethods).GetMethod ("GetValue").MakeGenericMethod (new Type [] { typeof (int) }).Invoke (null, new object [] { v });
                if (res != 42)
                        return 3;
+
+               NullableMethods.Get (42);
+               var res2 = (int?)typeof (NullableMethods).GetMethod ("Get").MakeGenericMethod (new Type [] { typeof (int) }).Invoke (null, new object [] { 42 });
+               if (res2 != 42)
+                       return 4;
+               res2 = (int?)typeof (NullableMethods).GetMethod ("GetNull").MakeGenericMethod (new Type [] { typeof (int) }).Invoke (null, new object [] { });
+               if (res2.HasValue)
+                       return 5;
                return 0;
        }
 
@@ -349,6 +378,7 @@ class Tests
                return 0;
        }
 
+       [Category ("DYNCALL")]
        public static int test_0_array_accessor_runtime_invoke_ref () {
                var t = typeof (string[]);
                var arr = Array.CreateInstance (typeof (string), 1);
@@ -381,6 +411,8 @@ class Tests
        }
 
        [Category ("DYNCALL")]
+       [Category ("!FULLAOT-AMD64")]
+       [Category ("!INTERPRETER")] //known bug in the interpreter
        public static int test_0_large_nullable_invoke () {
                var s = new LargeStruct () { a = 1, b = 2, c = 3, d = 4 };
 
@@ -401,4 +433,72 @@ class Tests
                        return 2;
                return 0;
        }
+
+       struct FpStruct {
+               public float a, b, c;
+       }
+
+       struct LargeStruct2 {
+               public FpStruct x;
+               public int a, b, c, d, e, f, g, h;
+       }
+
+       [MethodImplAttribute (MethodImplOptions.NoInlining)]
+       static int pass_hfa_on_stack (FpStruct s1, FpStruct s2, FpStruct s3) {
+               return (int)s3.c;
+       }
+
+       public static int test_10_arm64_hfa_on_stack_llvm () {
+               var arr = new LargeStruct2 [10, 10];
+               for (int i = 0; i < 10; ++i)
+                       for (int j = 0; j < 10; ++j)
+                               arr [i, j].x = new FpStruct ();
+
+               var s1 = new FpStruct () { a = 1, b = 1, c = 10 };
+               return pass_hfa_on_stack (s1, s1, s1);
+       }
+
+       public static int test_0_get_current_method () {
+               var m = MethodBase.GetCurrentMethod ();
+#if __MOBILE__
+               var m2 = typeof (AotTests).GetMethod ("test_0_get_current_method");
+#else
+               var m2 = typeof (Tests).GetMethod ("test_0_get_current_method");
+#endif
+               return m == m2 ? 0 : 1;
+       }
+
+       class GetCurrentMethodClass<T> {
+               [MethodImplAttribute (MethodImplOptions.NoInlining)]
+               public MethodBase get_current () {
+                       return MethodBase.GetCurrentMethod ();
+               }
+       }
+
+       public static int test_0_get_current_method_generic () {
+               var c = new GetCurrentMethodClass<string> ();
+               var m = c.get_current ();
+               var m2 = typeof (GetCurrentMethodClass<>).GetMethod ("get_current");
+               return m == m2 ? 0 : 1;
+       }
+
+       public static int test_0_array_wrappers_runtime_invoke () {
+               string[][] arr = new string [10][];
+               IEnumerable<string[]> iface = arr;
+               var m = typeof(IEnumerable<string[]>).GetMethod ("GetEnumerator");
+               m.Invoke (arr, null);
+               return 0;
+       }
+
+       public static int test_0_fault_clauses () {
+               object [] data = { 1, 2, 3 };
+               int [] expected = { 1, 2, 3 };
+
+               try {
+                       Action d = delegate () { data.Cast<IEnumerable> ().GetEnumerator ().MoveNext (); };
+                       d ();
+               } catch (Exception ex) {
+               }
+               return 0;
+       }
 }