Merge pull request #1876 from esdrubal/mmf-segfault
[mono.git] / mono / mini / aot-tests.cs
index 74e7f61b55465814806816621ef99e414633c097..17e3cfafee9a6476951c576492969fa282691f5b 100644 (file)
@@ -3,6 +3,7 @@ using System.Text;
 using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Runtime.CompilerServices;
+using System.Collections.Generic;
 
 /*
  * Regression tests for the AOT/FULL-AOT code.
@@ -15,8 +16,8 @@ class Tests
 #endif
 {
 #if !MOBILE
-       static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
+       static int Main (String[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
        }
 #endif
 
@@ -49,6 +50,9 @@ class Tests
                public static T Get_T (double d, T t) {
                        return t;
                }
+               public static T Get_T2 (double d, int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8, T t) {
+                       return t;
+               }
        }
 
        class Foo3<T> {
@@ -57,6 +61,7 @@ class Tests
                }
        }
 
+       [Category ("DYNCALL")]
        static int test_0_arm64_dyncall_double () {
                double arg1 = 1.0f;
                double s = 2.0f;
@@ -66,6 +71,7 @@ class Tests
                return 0;
        }
 
+       [Category ("DYNCALL")]
        static int test_0_arm64_dyncall_float () {
                double arg1 = 1.0f;
                float s = 2.0f;
@@ -75,6 +81,7 @@ class Tests
                return 0;
        }
 
+       [Category ("DYNCALL")]
        static int test_0_arm64_dyncall_hfa_double () {
                double arg1 = 1.0f;
                // HFA with double members
@@ -87,6 +94,7 @@ class Tests
                return 0;
        }
 
+       [Category ("DYNCALL")]
        static int test_0_arm64_dyncall_hfa_float () {
                double arg1 = 1.0f;
                var s = new Struct2 ();
@@ -98,6 +106,8 @@ class Tests
                return 0;
        }
 
+       [Category ("DYNCALL")]
+       [Category ("GSHAREDVT")]
        static int test_0_arm64_dyncall_gsharedvt_out_hfa_double () {
                /* gsharedvt out trampoline with double hfa argument */
                double arg1 = 1.0f;
@@ -115,6 +125,8 @@ class Tests
                return 0;
        }
 
+       [Category ("DYNCALL")]
+       [Category ("GSHAREDVT")]
        static int test_0_arm64_dyncall_gsharedvt_out_hfa_float () {
                /* gsharedvt out trampoline with double hfa argument */
                double arg1 = 1.0f;
@@ -134,18 +146,23 @@ class Tests
 
        interface IFaceFoo4<T> {
                T Get_T (double d, T t);
+               T Get_T2 (double d, T t);
        }
 
        class Foo4<T> : IFaceFoo4<T> {
                public T Get_T (double d, T t) {
                        return Foo2<T>.Get_T (d, t);
                }
+               public T Get_T2 (double d, T t) {
+                       return Foo2<T>.Get_T2 (d, 1, 2, 3, 4, 5, 6, 7, 8, t);
+               }
        }
 
        struct VTypeByRefStruct {
                public long o1, o2, o3;
        }
 
+       [Category ("GSHAREDVT")]
        public static int test_0_arm64_gsharedvt_out_vtypebyref () {
                /* gsharedvt out trampoline with vtypebyref argument */
                var s = new VTypeByRefStruct () { o1 = 1, o2 = 2, o3 = 3 };
@@ -157,6 +174,87 @@ class Tests
                var s_res = o.Get_T (1.0f, s);
                if (s_res.o1 != 1 || s_res.o2 != 2 || s_res.o3 != 3)
                        return 1;
+               // Same with the byref argument passed on the stack
+               s_res = o.Get_T2 (1.0f, s);
+               if (s_res.o1 != 1 || s_res.o2 != 2 || s_res.o3 != 3)
+                       return 2;
+               return 0;
+       }
+
+       class Foo5<T> {
+               public static T Get_T (object o) {
+                       return (T)o;
+               }
+       }
+
+       [Category ("DYNCALL")]
+       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) });
+               var o = Activator.CreateInstance (t);
+               try {
+                       var s_res = (VTypeByRefStruct)t.GetMethod ("Get_T").Invoke (o, new object [] { s });
+                       if (s_res.o1 != 1 || s_res.o2 != 2 || s_res.o3 != 3)
+                               return 1;
+               } catch (TargetInvocationException) {
+                       return 2;
+               }
                return 0;
        }
+
+       static int test_0_partial_sharing_regress_30204 () {
+               var t = typeof (System.Collections.Generic.Comparer<System.Collections.Generic.KeyValuePair<string, string>>);
+               var d = new SortedDictionary<string, string> ();
+               d.Add ("key1", "banana");
+               return d ["key1"] == "banana" ? 0 : 1;
+       }
+
+       class NullableMethods {
+               [MethodImplAttribute (MethodImplOptions.NoInlining)]
+               public static bool GetHasValue<T>(Nullable<T> value) where T : struct {
+                       return value.HasValue;
+               }
+
+               [MethodImplAttribute (MethodImplOptions.NoInlining)]
+               public static T GetValue<T>(Nullable<T> value) where T : struct {
+                       return value.Value;
+               }
+       }
+
+       [Category ("DYNCALL")]
+       public static int test_0_dyncall_nullable () {
+               int? v;
+
+               v = 42;
+               NullableMethods.GetHasValue (v);
+               bool b = (bool)typeof (NullableMethods).GetMethod ("GetHasValue").MakeGenericMethod (new Type [] { typeof (int) }).Invoke (null, new object [] { v });
+               if (!b)
+                       return 1;
+               v = null;
+               b = (bool)typeof (NullableMethods).GetMethod ("GetHasValue").MakeGenericMethod (new Type [] { typeof (int) }).Invoke (null, new object [] { v });
+               if (b)
+                       return 2;
+
+               v = 42;
+               NullableMethods.GetValue (v);
+               var res = (int)typeof (NullableMethods).GetMethod ("GetValue").MakeGenericMethod (new Type [] { typeof (int) }).Invoke (null, new object [] { v });
+               if (res != 42)
+                       return 3;
+               return 0;
+       }
+
+       enum AnEnum {
+               A = 0,
+               B = 1
+       }
+
+       public static int test_0_enum_eq_comparer () {
+               var c = EqualityComparer<AnEnum>.Default;
+               return (!c.Equals (AnEnum.A, AnEnum.B) && c.Equals (AnEnum.A, AnEnum.A)) ? 0 : 1;
+       }
+
+       public static int test_0_enum_comparer () {
+               var c = Comparer<AnEnum>.Default;
+               return c.Compare (AnEnum.A, AnEnum.A);
+       }
 }