[runtime] Fix a jit assertion on a class which contains an empty struct as a static...
authorZoltan Varga <vargaz@gmail.com>
Thu, 5 Jun 2014 17:05:39 +0000 (19:05 +0200)
committerZoltan Varga <vargaz@gmail.com>
Thu, 5 Jun 2014 17:05:50 +0000 (19:05 +0200)
mono/metadata/class.c
mono/mini/objects.cs

index 36a86794e77bf55a723c6e26bebff446b1fdb4ce..2a0b76e97dd170699e318dc54da0a740ef83f1ae 100644 (file)
@@ -1749,6 +1749,7 @@ mono_class_layout_fields (MonoClass *class)
        guint32 layout = class->flags & TYPE_ATTRIBUTE_LAYOUT_MASK;
        guint32 pass, passes, real_size;
        gboolean gc_aware_layout = FALSE;
+       gboolean has_static_fields = FALSE;
        MonoClassField *field;
 
        /*
@@ -1989,6 +1990,8 @@ mono_class_layout_fields (MonoClass *class)
                        break;
                }
 
+               has_static_fields = TRUE;
+
                size = mono_type_size (field->type, &align);
                field->offset = class->sizes.class_size;
                /*align is always non-zero here*/
@@ -1996,6 +1999,10 @@ mono_class_layout_fields (MonoClass *class)
                field->offset &= ~(align - 1);
                class->sizes.class_size = field->offset + size;
        }
+
+       if (has_static_fields && class->sizes.class_size == 0)
+               /* Simplify code which depends on class_size != 0 if the class has static fields */
+               class->sizes.class_size = 8;
 }
 
 static MonoMethod*
index 40c79e6280f38c5376fc57c0958b8ee60721e0d2..0e8ea1a4d7b4d2adc725597559b547ad8c2d5a78 100644 (file)
@@ -1625,6 +1625,20 @@ ncells ) {
        [MethodImplAttribute (MethodImplOptions.NoInlining)]
        static void t_14217_inner (BugStruct bug) {
     }
+
+       [StructLayout(LayoutKind.Sequential)]
+       public struct EmptyStruct {
+       }
+
+       class EmptyClass {
+               public static EmptyStruct s;
+       }
+
+       // #20349
+       static int test_0_empty_struct_as_static () {
+               var s = EmptyClass.s;
+               return 0;
+       }
 }
 
 #if MOBILE