Skip to content

Compiler crash when array access with from-end expression used in deconstruction assignment lowers to use a ref local and the right-hand side contains an await expression #58569

@bartdesmet

Description

@bartdesmet

Version Used:

.NET SDK 6.0.101

Steps to Reproduce:

var ts = new (int x, int y)[0];
(ts[^1].x, ts[0].y) = (0, await Task.FromResult(0));

Expected Behavior:

No crash.

Actual Behavior:

System.InvalidOperationException: Unexpected value 'Sequence' of type 'Microsoft.CodeAnalysis.CSharp.BoundKind' [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.HoistExpression(BoundExpression expr, SyntaxNode awaitSyntaxOpt, Int32 syntaxOffset, RefKind refKind, ArrayBuilder`1 sideEffects, ArrayBuilder`1 hoistedFields, Boolean& needsSacrificialEvaluation) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.HoistExpression(BoundExpression expr, SyntaxNode awaitSyntaxOpt, Int32 syntaxOffset, RefKind refKind, ArrayBuilder`1 sideEffects, ArrayBuilder`1 hoistedFields, Boolean& needsSacrificialEvaluation) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.HoistRefInitialization(SynthesizedLocal local, BoundAssignmentOperator node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.VisitAssignmentOperator(BoundAssignmentOperator node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundAssignmentOperator.Accept(BoundTreeVisitor visitor) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(BoundExpression node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.AsyncMethodToStateMachineRewriter.VisitExpressionStatement(BoundExpressionStatement node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundExpressionStatement.Accept(BoundTreeVisitor visitor) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[T](ImmutableArray`1 list) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(BoundBlock node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.<>c__DisplayClass41_0.<VisitBlock>b__0() [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(ImmutableArray`1 locals, Func`1 wrapped) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.VisitBlock(BoundBlock node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitSequencePoint(BoundSequencePoint node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundSequencePoint.Accept(BoundTreeVisitor visitor) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[T](ImmutableArray`1 list) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(BoundBlock node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.<>c__DisplayClass41_0.<VisitBlock>b__0() [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(ImmutableArray`1 locals, Func`1 wrapped) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.VisitBlock(BoundBlock node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.AsyncMethodToStateMachineRewriter.VisitBody(BoundStatement body) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.AsyncMethodToStateMachineRewriter.GenerateMoveNext(BoundStatement body, MethodSymbol moveNextMethod) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.AsyncRewriter.GenerateMoveNext(SynthesizedImplementationMethod moveNextMethod) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.AsyncRewriter.GenerateMethodImplementations() [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.StateMachineRewriter.Rewrite() [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.AsyncRewriter.Rewrite(BoundStatement bodyWithAwaitLifted, MethodSymbol method, Int32 methodOrdinal, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, BindingDiagnosticBag diagnostics, AsyncStateMachine& stateMachineType) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.LowerBodyOrInitializer(MethodSymbol method, Int32 methodOrdinal, BoundStatement body, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState, Boolean instrumentForDynamicAnalysis, DebugDocumentProvider debugDocumentProvider, ImmutableArray`1& dynamicAnalysisSpans, BindingDiagnosticBag diagnostics, VariableSlotAllocator& lazyVariableSlotAllocator, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 closureDebugInfoBuilder, StateMachineTypeSymbol& stateMachineTypeOpt) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType) [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass25_0.<CompileNamedTypeAsync>b__0() [C:\temp\repro_deconstruction_await_ref_local\repro_deconstruction_await_ref_local.csproj]

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions