diff --git a/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/TypeNameParser.cs b/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/TypeNameParser.cs index 5a5bbe04a0c18..e5acbf2acc44b 100644 --- a/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/TypeNameParser.cs +++ b/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/TypeNameParser.cs @@ -194,7 +194,7 @@ private TypeNameParser(ReadOnlySpan name, bool throwOnError, TypeNameParse { while (TryParseNextDecorator(ref capturedBeforeProcessing, out int parsedModifier)) { - result = new(fullName: null, assemblyName, elementOrGenericType: result, rankOrModifier: (sbyte)parsedModifier); + result = new(fullName: null, assemblyName, elementOrGenericType: result, rankOrModifier: parsedModifier); } } diff --git a/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/TypeNameParserHelpers.cs b/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/TypeNameParserHelpers.cs index ef0a9e702a1a2..b299a22567394 100644 --- a/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/TypeNameParserHelpers.cs +++ b/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/TypeNameParserHelpers.cs @@ -11,9 +11,9 @@ namespace System.Reflection.Metadata { internal static class TypeNameParserHelpers { - internal const sbyte SZArray = -1; - internal const sbyte Pointer = -2; - internal const sbyte ByRef = -3; + internal const int SZArray = -1; + internal const int Pointer = -2; + internal const int ByRef = -3; private const char EscapeCharacter = '\\'; #if NET8_0_OR_GREATER private static readonly SearchValues s_endOfFullTypeNameDelimitersSearchValues = SearchValues.Create("[]&*,+\\"); diff --git a/src/libraries/System.Reflection.Metadata/tests/Metadata/TypeNameTests.cs b/src/libraries/System.Reflection.Metadata/tests/Metadata/TypeNameTests.cs index 1fbc9f4e011d1..893c10b912579 100644 --- a/src/libraries/System.Reflection.Metadata/tests/Metadata/TypeNameTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/TypeNameTests.cs @@ -705,6 +705,18 @@ public void TheNumberAfterBacktickDoesNotEnforceGenericArgCount(string input, st Assert.Equal("bool", parsed.GetGenericArguments()[1].Name); } + [Fact] + public void ArrayRank_SByteOverflow() + { + const string Input = "WeDontEnforceAnyMaxArrayRank[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]"; + + TypeName typeName = TypeName.Parse(Input.AsSpan()); + + Assert.Equal(Input, typeName.FullName); + Assert.True(typeName.IsArray); + Assert.Equal(128, typeName.GetArrayRank()); + } + [Theory] [InlineData(typeof(int))] [InlineData(typeof(int?))]