diff --git a/src/coreclr/vm/classlayoutinfo.cpp b/src/coreclr/vm/classlayoutinfo.cpp index bdef0e40596f34..612c119be79f01 100644 --- a/src/coreclr/vm/classlayoutinfo.cpp +++ b/src/coreclr/vm/classlayoutinfo.cpp @@ -612,7 +612,7 @@ VOID EEClassLayoutInfo::CollectLayoutFieldMetadataThrowing( pEEClassLayoutInfoOut->m_cbPackingSize = packingSize; BOOL fParentHasLayout = pParentMT && pParentMT->HasLayout(); - UINT32 cbAdjustedParentLayoutNativeSize = 0; + UINT32 cbAdjustedParentLayoutSize = 0; EEClassLayoutInfo *pParentLayoutInfo = NULL; if (fParentHasLayout) { @@ -622,11 +622,11 @@ VOID EEClassLayoutInfo::CollectLayoutFieldMetadataThrowing( // got bumped up to a size of 1 for compatibility reasons, then // we need to remove the padding, but ONLY for inheritance situations. if (pParentLayoutInfo->IsZeroSized()) { - cbAdjustedParentLayoutNativeSize = 0; + cbAdjustedParentLayoutSize = 0; } else { - cbAdjustedParentLayoutNativeSize = pParentMT->GetNumInstanceFieldBytes(); + cbAdjustedParentLayoutSize = pParentMT->GetNumInstanceFieldBytes(); } } @@ -668,7 +668,7 @@ VOID EEClassLayoutInfo::CollectLayoutFieldMetadataThrowing( } CQuickArray pSortArray; pSortArray.ReSizeThrows(cbSortArraySize.Value()); - SetOffsetsAndSortFields(pInternalImport, cl, pInfoArrayOut, cInstanceFields, fExplicitOffsets, cbAdjustedParentLayoutNativeSize, pModule, pSortArray.Ptr()); + SetOffsetsAndSortFields(pInternalImport, cl, pInfoArrayOut, cInstanceFields, fExplicitOffsets, cbAdjustedParentLayoutSize, pModule, pSortArray.Ptr()); ULONG classSizeInMetadata = 0; if (FAILED(pInternalImport->GetClassTotalSize(cl, &classSizeInMetadata))) @@ -690,14 +690,13 @@ VOID EEClassLayoutInfo::CollectLayoutFieldMetadataThrowing( } BYTE parentManagedAlignmentRequirement = 0; - UINT32 parentSize = pParentMT->GetNumInstanceFieldBytes(); if (pParentMT && (pParentMT->IsManagedSequential() || (pParentMT->GetClass()->HasExplicitFieldOffsetLayout() && pParentMT->IsBlittable()))) { parentManagedAlignmentRequirement = pParentLayoutInfo->m_ManagedLargestAlignmentRequirementOfAllMembers; } CalculateSizeAndFieldOffsets( - parentSize, + cbAdjustedParentLayoutSize, cInstanceFields, fExplicitOffsets, pSortArray.Ptr(), diff --git a/src/tests/Interop/LayoutClass/LayoutClassTest.cs b/src/tests/Interop/LayoutClass/LayoutClassTest.cs index d87be9e81c3955..2181bb30528d44 100644 --- a/src/tests/Interop/LayoutClass/LayoutClassTest.cs +++ b/src/tests/Interop/LayoutClass/LayoutClassTest.cs @@ -12,6 +12,11 @@ public class EmptyBase { } + [StructLayout(LayoutKind.Sequential)] + public class EmptyBase2 : EmptyBase + { + } + [StructLayout(LayoutKind.Sequential)] public class SeqDerivedClass : EmptyBase { @@ -23,6 +28,17 @@ public SeqDerivedClass(int _a) } } + [StructLayout(LayoutKind.Sequential)] + public class SeqDerivedClass2 : EmptyBase2 + { + public int a; + + public SeqDerivedClass2(int _a) + { + a = _a; + } + } + [StructLayout(LayoutKind.Sequential)] public sealed class SeqClass { @@ -185,8 +201,8 @@ public static void DerivedClassWithEmptyBase() Console.WriteLine($"Running {nameof(DerivedClassWithEmptyBase)}..."); string s = "before"; - var p = new SeqDerivedClass(42); - Assert.IsTrue(DerivedSeqLayoutClassByRef(p, 42)); + Assert.IsTrue(DerivedSeqLayoutClassByRef(new SeqDerivedClass(42), 42)); + Assert.IsTrue(DerivedSeqLayoutClassByRef(new SeqDerivedClass2(42), 42)); } public static void ExplicitClass()