[aot] Add instances of LongEnumEqualityComparer which is used by EqualityComparer...
authorZoltan Varga <vargaz@gmail.com>
Fri, 20 Nov 2015 11:15:56 +0000 (06:15 -0500)
committerZoltan Varga <vargaz@gmail.com>
Fri, 20 Nov 2015 11:16:00 +0000 (06:16 -0500)
mono/mini/aot-compiler.c
mono/mini/aot-tests.cs

index 8e96bed61a6b55bbbe21bb2d61a4cf731f3c243c..f83f2baa933c607382e82143e8a15d8c32e2d8c0 100644 (file)
@@ -4482,6 +4482,26 @@ add_generic_instances (MonoAotCompile *acfg)
                if (klass)
                        add_instances_of (acfg, klass, insts, ninsts, TRUE);
 
+               /* Add an instance of LongEnumEqualityComparer<long/ulong> which is created by EqualityComparer<T> for enums */
+               {
+                       MonoClass *enum_comparer;
+                       MonoGenericContext ctx;
+                       MonoType *args [16];
+
+                       enum_comparer = mono_class_from_name (mono_defaults.corlib, "System.Collections.Generic", "LongEnumEqualityComparer`1");
+                       g_assert (enum_comparer);
+
+                       memset (&ctx, 0, sizeof (ctx));
+                       args [0] = &mono_defaults.int64_class->byval_arg;
+                       ctx.class_inst = mono_metadata_get_generic_inst (1, args);
+                       add_generic_class (acfg, mono_class_inflate_generic_class (enum_comparer, &ctx), FALSE, "EqualityComparer<T>");
+
+                       memset (&ctx, 0, sizeof (ctx));
+                       args [0] = &mono_defaults.uint64_class->byval_arg;
+                       ctx.class_inst = mono_metadata_get_generic_inst (1, args);
+                       add_generic_class (acfg, mono_class_inflate_generic_class (enum_comparer, &ctx), FALSE, "EqualityComparer<T>");
+               }
+
                /* Add instances of the array generic interfaces for primitive types */
                /* This will add instances of the InternalArray_ helper methods in Array too */
                klass = mono_class_from_name (acfg->image, "System.Collections.Generic", "ICollection`1");
index 98bd905faf3550cfae9354d3c34360ba53cdebd9..f49afaf84995f41cbc83954a108bd8db98443aff 100644 (file)
@@ -291,4 +291,14 @@ class Tests
                        return 1;
                return 0;
        }
+
+       enum LongEnum : ulong {
+               A = 1
+                       }
+
+       public static int test_0_long_enum_eq_comparer () {
+               var c = EqualityComparer<LongEnum>.Default;
+               c.GetHashCode (LongEnum.A);
+               return 0;
+       }
 }