From 1f0db3919a89d006f69b9a8e20896ddd17c9bbe5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Feb 2026 21:39:27 +0000 Subject: [PATCH 1/3] Initial plan From 3a1f19974242da30b8450e4c721b4958389ff77d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Feb 2026 22:05:10 +0000 Subject: [PATCH 2/3] Fix NRange.GetOffsetAndLength: change (uint) casts to (nuint) and add tests Co-authored-by: vcsjones <361677+vcsjones@users.noreply.github.com> --- .../src/System/Buffers/NRange.cs | 6 +- .../tests/NRangeTests.cs | 62 ++++++++++++------- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/libraries/System.Numerics.Tensors/src/System/Buffers/NRange.cs b/src/libraries/System.Numerics.Tensors/src/System/Buffers/NRange.cs index ad452f8385c4b8..26ed4538581579 100644 --- a/src/libraries/System.Numerics.Tensors/src/System/Buffers/NRange.cs +++ b/src/libraries/System.Numerics.Tensors/src/System/Buffers/NRange.cs @@ -70,7 +70,7 @@ public override string ToString() span[0] = '^'; pos = 1; } - bool formatted = ((uint)Start.Value).TryFormat(span.Slice(pos), out int charsWritten); + bool formatted = ((nuint)Start.Value).TryFormat(span.Slice(pos), out int charsWritten); Debug.Assert(formatted); pos += charsWritten; @@ -81,7 +81,7 @@ public override string ToString() { span[pos++] = '^'; } - formatted = ((uint)End.Value).TryFormat(span.Slice(pos), out charsWritten); + formatted = ((nuint)End.Value).TryFormat(span.Slice(pos), out charsWritten); Debug.Assert(formatted); pos += charsWritten; @@ -110,7 +110,7 @@ public override string ToString() nint start = Start.GetOffset(length); nint end = End.GetOffset(length); - if ((uint)end > (uint)length || (uint)start > (uint)end) + if ((nuint)end > (nuint)length || (nuint)start > (nuint)end) { ThrowArgumentOutOfRangeException(); } diff --git a/src/libraries/System.Numerics.Tensors/tests/NRangeTests.cs b/src/libraries/System.Numerics.Tensors/tests/NRangeTests.cs index eb5d7ba88ae45e..f4371cb7a34491 100644 --- a/src/libraries/System.Numerics.Tensors/tests/NRangeTests.cs +++ b/src/libraries/System.Numerics.Tensors/tests/NRangeTests.cs @@ -48,30 +48,46 @@ public static void CreationTest() Assert.True(NativeRange.End.IsFromEnd); } - [Fact] - public static void GetOffsetAndLengthTest() + [Theory] + [InlineData(5, false, 0, true, 20, 5, 15)] + [InlineData(5, false, 0, true, 5, 5, 0)] + [InlineData(5, false, 0, true, -10, 5, -15)] + [InlineData(0, false, 4, false, 20, 0, 4)] + public static void GetOffsetAndLengthTest(nint startValue, bool startFromEnd, nint endValue, bool endFromEnd, nint length, nint expectedOffset, nint expectedLength) + { + NRange range = new NRange(new NIndex(startValue, startFromEnd), new NIndex(endValue, endFromEnd)); + (nint offset, nint actualLength) = range.GetOffsetAndLength(length); + Assert.Equal(expectedOffset, offset); + Assert.Equal(expectedLength, actualLength); + } + + [Theory] + [InlineData(5, false, 0, true, 4)] + [InlineData(0, false, 4, false, 1)] + public static void GetOffsetAndLengthThrowsTest(nint startValue, bool startFromEnd, nint endValue, bool endFromEnd, nint length) + { + NRange range = new NRange(new NIndex(startValue, startFromEnd), new NIndex(endValue, endFromEnd)); + Assert.Throws(() => range.GetOffsetAndLength(length)); + } + + [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.Is64BitProcess))] + [InlineData(5, false, 0, true, (long)uint.MaxValue + 20, 5, (long)uint.MaxValue + 15)] + [InlineData(0, false, (long)uint.MaxValue + 5, false, (long)uint.MaxValue + 20, 0, (long)uint.MaxValue + 5)] + public static void GetOffsetAndLengthTest64(long startValue, bool startFromEnd, long endValue, bool endFromEnd, long length, long expectedOffset, long expectedLength) + { + NRange range = new NRange(new NIndex((nint)startValue, startFromEnd), new NIndex((nint)endValue, endFromEnd)); + (nint offset, nint actualLength) = range.GetOffsetAndLength((nint)length); + Assert.Equal((nint)expectedOffset, offset); + Assert.Equal((nint)expectedLength, actualLength); + } + + [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.Is64BitProcess))] + [InlineData((long)uint.MaxValue + 1, false, 2, false, (long)uint.MaxValue + 3)] + [InlineData((long)uint.MaxValue + 5, false, 0, true, (long)uint.MaxValue + 1)] + public static void GetOffsetAndLengthThrowsTest64(long startValue, bool startFromEnd, long endValue, bool endFromEnd, long length) { - NRange NativeRange = NRange.StartAt(new NIndex(5)); - (nint offset, nint length) = NativeRange.GetOffsetAndLength(20); - Assert.Equal(5, offset); - Assert.Equal(15, length); - - (offset, length) = NativeRange.GetOffsetAndLength(5); - Assert.Equal(5, offset); - Assert.Equal(0, length); - - // we don't validate the length in the GetOffsetAndLength so passing negative length will just return the regular calculation according to the length value. - (offset, length) = NativeRange.GetOffsetAndLength(-10); - Assert.Equal(5, offset); - Assert.Equal(-15, length); - - Assert.Throws(() => NativeRange.GetOffsetAndLength(4)); - - NativeRange = NRange.EndAt(new NIndex(4)); - (offset, length) = NativeRange.GetOffsetAndLength(20); - Assert.Equal(0, offset); - Assert.Equal(4, length); - Assert.Throws(() => NativeRange.GetOffsetAndLength(1)); + NRange range = new NRange(new NIndex((nint)startValue, startFromEnd), new NIndex((nint)endValue, endFromEnd)); + Assert.Throws(() => range.GetOffsetAndLength((nint)length)); } [Fact] From 7314fec1ce893b9e01bf3527957d9f4df175191f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Feb 2026 22:06:14 +0000 Subject: [PATCH 3/3] Revert unintended ToString() changes - only fix GetOffsetAndLength Co-authored-by: vcsjones <361677+vcsjones@users.noreply.github.com> --- .../System.Numerics.Tensors/src/System/Buffers/NRange.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Numerics.Tensors/src/System/Buffers/NRange.cs b/src/libraries/System.Numerics.Tensors/src/System/Buffers/NRange.cs index 26ed4538581579..810985e18ff627 100644 --- a/src/libraries/System.Numerics.Tensors/src/System/Buffers/NRange.cs +++ b/src/libraries/System.Numerics.Tensors/src/System/Buffers/NRange.cs @@ -70,7 +70,7 @@ public override string ToString() span[0] = '^'; pos = 1; } - bool formatted = ((nuint)Start.Value).TryFormat(span.Slice(pos), out int charsWritten); + bool formatted = ((uint)Start.Value).TryFormat(span.Slice(pos), out int charsWritten); Debug.Assert(formatted); pos += charsWritten; @@ -81,7 +81,7 @@ public override string ToString() { span[pos++] = '^'; } - formatted = ((nuint)End.Value).TryFormat(span.Slice(pos), out charsWritten); + formatted = ((uint)End.Value).TryFormat(span.Slice(pos), out charsWritten); Debug.Assert(formatted); pos += charsWritten;