From a6bad8e501f2af68525ee4c6807c91a0b2fcc6e0 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Thu, 2 Dec 2021 19:53:02 -0500 Subject: [PATCH 1/2] Update overlapped field test to conflict on 32-bit arches Fixes https://github.com/dotnet/runtime/issues/62303 --- .../Loader/classloader/explicitlayout/NestedStructs/case04.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/Loader/classloader/explicitlayout/NestedStructs/case04.cs b/src/tests/Loader/classloader/explicitlayout/NestedStructs/case04.cs index 7e2cfc44758603..c89bea2ea3ba31 100644 --- a/src/tests/Loader/classloader/explicitlayout/NestedStructs/case04.cs +++ b/src/tests/Loader/classloader/explicitlayout/NestedStructs/case04.cs @@ -27,7 +27,7 @@ public struct SecondLevel [StructLayout(LayoutKind.Explicit)] public struct ThirdLevel { - [FieldOffset(6)] + [FieldOffset(2)] public short ConflictingValueTypeField; } From ddae3bbbc14a10d43311c0f5ba1a80ff5bc61c0d Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Thu, 2 Dec 2021 22:03:59 -0500 Subject: [PATCH 2/2] [class-init] Setup fields of nested structs in layout check On AOT the field's class may not have been fully inited yet. Related to https://github.com/dotnet/runtime/issues/62311 --- src/mono/mono/metadata/class-init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/class-init.c b/src/mono/mono/metadata/class-init.c index c53f4e5fe0b725..a7c333afb5eb8d 100644 --- a/src/mono/mono/metadata/class-init.c +++ b/src/mono/mono/metadata/class-init.c @@ -1903,7 +1903,7 @@ validate_struct_fields_overlaps (guint8 *layout_check, int layout_size, MonoClas if (mono_type_is_struct (ftype)) { // recursively check the layout of the embedded struct MonoClass *embedded_class = mono_class_from_mono_type_internal (ftype); - g_assert (m_class_is_fields_inited (embedded_class)); + mono_class_setup_fields (embedded_class); const int embedded_fields_count = mono_class_get_field_count (embedded_class); int *embedded_offsets = g_new0 (int, embedded_fields_count);