diff --git a/src/vm/argdestination.h b/src/vm/argdestination.h index 857e596079d6..d8f6c854b223 100644 --- a/src/vm/argdestination.h +++ b/src/vm/argdestination.h @@ -136,7 +136,7 @@ class ArgDestination _ASSERTE(eightByteSize == 4); *(UINT32*)floatRegDest = *(UINT32*)src; } - floatRegDest += 8; + floatRegDest += 16; } else { diff --git a/tests/src/Regressions/coreclr/GitHub_7685/Test7685.csproj b/tests/src/Regressions/coreclr/GitHub_7685/Test7685.csproj new file mode 100644 index 000000000000..777c8dbf8d61 --- /dev/null +++ b/tests/src/Regressions/coreclr/GitHub_7685/Test7685.csproj @@ -0,0 +1,44 @@ + + + + + Debug + AnyCPU + 2.0 + {E55A6F8B-B9E3-45CE-88F4-22AE70F606CB} + Exe + Properties + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + $(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages + ..\..\ + 7a9bfb7d + true + false + BuildAndRun + 1 + + + + + + + + + False + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/src/Regressions/coreclr/GitHub_7685/test7685.cs b/tests/src/Regressions/coreclr/GitHub_7685/test7685.cs new file mode 100644 index 000000000000..a1d35bc11c9f --- /dev/null +++ b/tests/src/Regressions/coreclr/GitHub_7685/test7685.cs @@ -0,0 +1,48 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +using System; +using System.Reflection; + +public class Test7685 +{ + static RectangleF argumentInDStuff; + + public static int Main() + { + int iRetVal = 100; + + var r = new RectangleF(1.2f, 3.4f, 5.6f, 7.8f); + typeof(Test7685).GetTypeInfo().GetDeclaredMethod("DoStuff").Invoke(null, new object[] { r }); + + if (!RectangleF.Equals(ref argumentInDStuff, ref r)) + { + TestLibrary.Logging.WriteLine($"Error: passing struct with floats via reflection. Callee received {argumentInDStuff} instead of {r}"); + iRetVal = 0; + } + + return iRetVal; + } + + public static void DoStuff(RectangleF r) + { + argumentInDStuff = r; + } +} + +public struct RectangleF +{ + private float _x, _y, _width, _height; + + public RectangleF(float x, float y, float width, float height) + { + _x = x; _y = y; _width = width; _height = height; + } + + public static bool Equals(ref RectangleF r1, ref RectangleF r2) + { + return (r2._x == r1._x) && (r2._y == r1._y) && (r2._width == r1._width) && (r2._height == r1._height); + } + + public override string ToString() => $"[{_x}, {_y}, {_width}, {_height}]"; +}