Skip to content

IndexOutOfRangeException in overload resolution of C# 14 extensions #79193

@DaZombieKiller

Description

@DaZombieKiller

Version Used:
4.14.0-3.25279.5 (995f12b)

Steps to Reproduce:
Try to compile the following code:

using System;

public class C
{
}

public static class E
{
    extension(C @this)
    {
        public void M<T>(T x)
        {
            @this.M(x, default);
        }

        public void M(params ReadOnlySpan<object?> span)
        {
            @this.M(0, span);
        }

        private void M<T>(T x, ReadOnlySpan<object?> span)
        {
        }
    }
}

.NET Lab URL

Expected Behavior:
The code either compiles successfully or produces an error diagnostic.

Actual Behavior:
The compiler crashes in GetParameterOrExtensionParameter:

System.IndexOutOfRangeException: Arg_IndexOutOfRangeException
   at System.Collections.Immutable.ImmutableArray`1[[Microsoft.CodeAnalysis.CSharp.Symbols.ParameterSymbol, Microsoft.CodeAnalysis.CSharp, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]].get_Item(Int32 index)
   at Microsoft.CodeAnalysis.CSharp.OverloadResolution.GetParameterOrExtensionParameter[MethodSymbol](Int32 argIndex, MemberAnalysisResult result, ImmutableArray`1 parameters, MethodSymbol member)
   at Microsoft.CodeAnalysis.CSharp.OverloadResolution.<BetterFunctionMember>g__getParameterTypeAndRefKind|94_0[MethodSymbol](Int32 i, MemberAnalysisResult memberResolutionResult, ImmutableArray`1 parameters, TypeWithAnnotations paramsElementTypeOpt, MethodSymbol member, RefKind& parameter1RefKind)
   at Microsoft.CodeAnalysis.CSharp.OverloadResolution.BetterFunctionMember[MethodSymbol](MemberResolutionResult`1 m1, MemberResolutionResult`1 m2, ArrayBuilder`1 arguments, Boolean considerRefKinds, CompoundUseSiteInfo`1& useSiteInfo)
   at Microsoft.CodeAnalysis.CSharp.OverloadResolution.BetterFunctionMember[MethodSymbol](MemberResolutionResult`1 m1, MemberResolutionResult`1 m2, ArrayBuilder`1 arguments, CompoundUseSiteInfo`1& useSiteInfo)
   at Microsoft.CodeAnalysis.CSharp.OverloadResolution.GetTheBestCandidateIndex[MethodSymbol](ArrayBuilder`1 results, AnalyzedArguments arguments, CompoundUseSiteInfo`1& useSiteInfo)
   at Microsoft.CodeAnalysis.CSharp.OverloadResolution.RemoveWorseMembers[MethodSymbol](ArrayBuilder`1 results, AnalyzedArguments arguments, CompoundUseSiteInfo`1& useSiteInfo)
   at Microsoft.CodeAnalysis.CSharp.OverloadResolution.PerformMemberOverloadResolution[MethodSymbol](ArrayBuilder`1 results, ArrayBuilder`1 members, ArrayBuilder`1 typeArguments, BoundExpression receiver, AnalyzedArguments arguments, Boolean completeResults, RefKind returnRefKind, TypeSymbol returnType, CallingConventionInfo& callingConventionInfo, CompoundUseSiteInfo`1& useSiteInfo, Options options, Boolean checkOverriddenOrHidden)
   at Microsoft.CodeAnalysis.CSharp.OverloadResolution.MethodOrPropertyOverloadResolution[MethodSymbol](ArrayBuilder`1 members, ArrayBuilder`1 typeArguments, BoundExpression receiver, AnalyzedArguments arguments, OverloadResolutionResult`1 result, CompoundUseSiteInfo`1& useSiteInfo, Options options, RefKind returnRefKind, TypeSymbol returnType, CallingConventionInfo& callingConventionInfo)
   at Microsoft.CodeAnalysis.CSharp.OverloadResolution.MethodInvocationOverloadResolution(ArrayBuilder`1 methods, ArrayBuilder`1 typeArguments, BoundExpression receiver, AnalyzedArguments arguments, OverloadResolutionResult`1 result, CompoundUseSiteInfo`1& useSiteInfo, Options options, RefKind returnRefKind, TypeSymbol returnType, CallingConventionInfo& callingConventionInfo)
   at Microsoft.CodeAnalysis.CSharp.Binder.<ResolveExtension>g__resolveMethods|522_1(SyntaxNode expression, BoundExpression left, ImmutableArray`1 typeArgumentsWithAnnotations, TypeSymbol returnType, RefKind returnRefKind, LookupResult lookupResult, AnalyzedArguments analyzedArguments, AnalyzedArguments& actualMethodArguments, Options options, CallingConventionInfo& callingConvention, Binder binder, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.<ResolveExtension>g__tryResolveExtensionInScope|522_0(SyntaxNode expression, BoundExpression left, String memberName, Int32 arity, ImmutableArray`1 typeArgumentsWithAnnotations, TypeSymbol returnType, RefKind returnRefKind, LookupResult lookupResult, AnalyzedArguments analyzedArguments, AnalyzedArguments& actualMethodArguments, AnalyzedArguments& actualReceiverArguments, CompoundUseSiteInfo`1& useSiteInfo, MethodGroupResolution& firstResult, Options options, CallingConventionInfo callingConvention, LookupResult classicExtensionLookupResult, LookupOptions lookupOptions, Binder binder, ExtensionScope scope, Boolean acceptOnlyMethods, BindingDiagnosticBag diagnostics, MethodGroupResolution& result)
   at Microsoft.CodeAnalysis.CSharp.Binder.ResolveExtension(SyntaxNode expression, String memberName, AnalyzedArguments analyzedArguments, BoundExpression left, ImmutableArray`1 typeArgumentsWithAnnotations, Options options, RefKind returnRefKind, TypeSymbol returnType, CompoundUseSiteInfo`1& useSiteInfo, Boolean acceptOnlyMethods, CallingConventionInfo& callingConvention)
   at Microsoft.CodeAnalysis.CSharp.Binder.ResolveMethodGroupInternal(BoundMethodGroup methodGroup, SyntaxNode expression, String memberName, AnalyzedArguments analyzedArguments, CompoundUseSiteInfo`1& useSiteInfo, Options options, Boolean acceptOnlyMethods, RefKind returnRefKind, TypeSymbol returnType, CallingConventionInfo& callingConvention)
   at Microsoft.CodeAnalysis.CSharp.Binder.ResolveMethodGroup(BoundMethodGroup node, SyntaxNode expression, String memberName, AnalyzedArguments analyzedArguments, CompoundUseSiteInfo`1& useSiteInfo, Options options, Boolean acceptOnlyMethods, RefKind returnRefKind, TypeSymbol returnType, CallingConventionInfo& callingConventionInfo)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindMethodGroupInvocation(SyntaxNode syntax, SyntaxNode expression, String methodName, BoundMethodGroup methodGroup, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics, CSharpSyntaxNode queryClause, Boolean ignoreNormalFormIfHasValidParamsParameter, Boolean& anyApplicableCandidates, Boolean disallowExpandedNonArrayParams, Boolean acceptOnlyMethods)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindInvocationExpression(SyntaxNode node, SyntaxNode expression, String methodName, BoundExpression boundExpression, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics, Boolean acceptOnlyMethods, CSharpSyntaxNode queryClause, Boolean ignoreNormalFormIfHasValidParamsParameter, Boolean disallowExpandedNonArrayParams)
   at Microsoft.CodeAnalysis.CSharp.Binder.<BindInvocationExpression>g__bindArgumentsAndInvocation|614_0(InvocationExpressionSyntax node, BoundExpression boundExpression, AnalyzedArguments analyzedArguments, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindInvocationExpression(InvocationExpressionSyntax node, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.<BindExpressionInternal>g__bindExpressionInternal|347_0(ExpressionSyntax node, BindingDiagnosticBag diagnostics, Boolean invoked, Boolean indexed)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindExpressionInternal(ExpressionSyntax node, BindingDiagnosticBag diagnostics, Boolean invoked, Boolean indexed)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindExpression(ExpressionSyntax node, BindingDiagnosticBag diagnostics, Boolean invoked, Boolean indexed)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindValue(ExpressionSyntax node, BindingDiagnosticBag diagnostics, BindValueKind valueKind)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindRValueWithoutTargetType(ExpressionSyntax node, BindingDiagnosticBag diagnostics, Boolean reportNoTargetType)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindExpressionStatement(CSharpSyntaxNode node, ExpressionSyntax syntax, Boolean allowsAnyExpression, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindExpressionStatement(ExpressionStatementSyntax node, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindStatement(StatementSyntax node, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindBlockParts(BlockSyntax node, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindBlock(BlockSyntax node, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindStatement(StatementSyntax node, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindMethodBody(CSharpSyntaxNode declaration, BlockSyntax blockBody, ArrowExpressionClauseSyntax expressionBody, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindMethodBody(CSharpSyntaxNode syntax, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c.<BindMethodBody>b__44_1(Binder bodyBinder, CSharpSyntaxNode syntaxNode, Object _, BindingDiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Binder.BindWithLambdaBindingCountDiagnostics[CSharpSyntaxNode,Object,BoundNode](CSharpSyntaxNode syntax, Object arg, BindingDiagnosticBag diagnostics, Func`5 bind)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.BindMethodBody(MethodSymbol method, TypeCompilationState compilationState, BindingDiagnosticBag diagnostics, Boolean includeInitializersInBody, BoundNode initializersBody, Boolean reportNullableDiagnostics, ImportChain& importChain, Boolean& originalBodyNested, Boolean& prependedDefaultValueTypeConstructorInitializer, InitialState& forSemanticModel)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.VisitNamedType(NamedTypeSymbol symbol, TypeCompilationState arg)
   at Microsoft.CodeAnalysis.CSharp.Symbols.NamedTypeSymbol.Accept[TypeCompilationState,Object](CSharpSymbolVisitor`2 visitor, TypeCompilationState argument)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamespace(NamespaceSymbol symbol)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethodBodies(CSharpCompilation compilation, PEModuleBuilder moduleBeingBuiltOpt, Boolean emittingPdb, Boolean hasDeclarationErrors, Boolean emitMethodBodies, BindingDiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions