Skip to content

Compiler crushes with InvalidCastException in async method with switch-expression assignment to ref-return method #51930

@jl0pd

Description

@jl0pd

Version Used:

.NET SDK (reflecting any global.json):
 Version:   5.0.201
 Commit:    a09bd5c86c

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.18363
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\5.0.201\

Host (useful for support):
  Version: 5.0.4
  Commit:  f27d337295

.NET SDKs installed:
  3.1.101 [C:\Program Files\dotnet\sdk]
  5.0.201 [C:\Program Files\dotnet\sdk]

Steps to Reproduce:

  1. Write async method which will try to assign ref-return with switch expression that have await in branch
  2. Build in debug mode

Note: Also works with ref indexers (ref int this[x] => ...)

using System.Threading.Tasks;

namespace RoslynCrush
{
    class Program
    {
        static async Task Main(string[] args)
        {
            GetRef() = 3 switch
            {
                3 => await Task.FromResult(5),
                _ => 5,
            };
        }

        static ref int GetRef() => ref value;
        static int value = 0;
    }
}

Expected Behavior:

error CS8178: 'await' cannot be used in an expression containing a call to 'Program.GetRef()' because it returns by reference should be raised

Actual Behavior:

Program crushes with System.InvalidCastException: Unable to cast object of type 'Microsoft.CodeAnalysis.CSharp.Syntax.SwitchExpressionSyntax' to type 'Microsoft.CodeAnalysis.CSharp.Syntax.AwaitExpressionSyntax'.

stacktrace

Application: csc.exe
Framework Version: v4.0.30319
Description: The application requested process termination through System.Environment.FailFast(string message).
Message: System.InvalidCastException: Unable to cast object of type 'Microsoft.CodeAnalysis.CSharp.Syntax.SwitchExpressionSyntax' to type 'Microsoft.CodeAnalysis.CSharp.Syntax.AwaitExpressionSyntax'.
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.HoistRefInitialization(SynthesizedLocal local, BoundAssignmentOperator node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(BoundExpression node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.AsyncMethodToStateMachineRewriter.VisitExpressionStatement(BoundExpressionStatement node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[T](ImmutableArray1 list) at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(BoundBlock node) at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.<>c__DisplayClass41_0.<VisitBlock>b__0() at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(ImmutableArray1 locals, Func1 wrapped) at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node) at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitSequencePoint(BoundSequencePoint node) at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node) at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[T](ImmutableArray1 list)
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(BoundBlock node)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.<>c__DisplayClass41_0.b__0()
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(ImmutableArray1 locals, Func1 wrapped)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.VisitTryStatement(BoundTryStatement node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[T](ImmutableArray1 list) at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(BoundBlock node) at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.<>c__DisplayClass41_0.<VisitBlock>b__0() at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(ImmutableArray1 locals, Func1 wrapped) at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node) at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[T](ImmutableArray1 list)
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(BoundBlock node)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.<>c__DisplayClass41_0.b__0()
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(ImmutableArray1 locals, Func1 wrapped)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[T](ImmutableArray1 list) at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(BoundBlock node) at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.<>c__DisplayClass41_0.<VisitBlock>b__0() at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(ImmutableArray1 locals, Func1 wrapped) at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(BoundNode node) at Microsoft.CodeAnalysis.CSharp.AsyncMethodToStateMachineRewriter.VisitBody(BoundStatement body) at Microsoft.CodeAnalysis.CSharp.AsyncMethodToStateMachineRewriter.GenerateMoveNext(BoundStatement body, MethodSymbol moveNextMethod) at Microsoft.CodeAnalysis.CSharp.AsyncRewriter.GenerateMoveNext(SynthesizedImplementationMethod moveNextMethod) at Microsoft.CodeAnalysis.CSharp.AsyncRewriter.GenerateMethodImplementations() at Microsoft.CodeAnalysis.CSharp.StateMachineRewriter.Rewrite() at Microsoft.CodeAnalysis.CSharp.AsyncRewriter.Rewrite(BoundStatement bodyWithAwaitLifted, MethodSymbol method, Int32 methodOrdinal, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, DiagnosticBag diagnostics, AsyncStateMachine& stateMachineType) at Microsoft.CodeAnalysis.CSharp.MethodCompiler.LowerBodyOrInitializer(MethodSymbol method, Int32 methodOrdinal, BoundStatement body, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState, Boolean instrumentForDynamicAnalysis, DebugDocumentProvider debugDocumentProvider, ImmutableArray1& dynamicAnalysisSpans, DiagnosticBag diagnostics, VariableSlotAllocator& lazyVariableSlotAllocator, ArrayBuilder1 lambdaDebugInfoBuilder, ArrayBuilder1 closureDebugInfoBuilder, StateMachineTypeSymbol& stateMachineTypeOpt)
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.<>c__DisplayClass22_0.b__0()
Stack:
at System.Environment.FailFast(System.String, System.Exception)
at Microsoft.CodeAnalysis.FailFast.OnFatalException(System.Exception)
at Microsoft.CodeAnalysis.FatalError.ReportAndPropagateUnlessCanceled(System.Exception)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler+<>c__DisplayClass22_0.b__0()
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.HoistRefInitialization(Microsoft.CodeAnalysis.CSharp.Symbols.SynthesizedLocal, Microsoft.CodeAnalysis.CSharp.BoundAssignmentOperator)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32 ByRef, Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.AsyncMethodToStateMachineRewriter.VisitExpressionStatement(Microsoft.CodeAnalysis.CSharp.BoundExpressionStatement)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(Microsoft.CodeAnalysis.CSharp.BoundBlock)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter+<>c__DisplayClass41_0.b__0()
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(System.Collections.Immutable.ImmutableArray1<Microsoft.CodeAnalysis.CSharp.Symbols.LocalSymbol>, System.Func1<Microsoft.CodeAnalysis.CSharp.BoundStatement>)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitSequencePoint(Microsoft.CodeAnalysis.CSharp.BoundSequencePoint)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(Microsoft.CodeAnalysis.CSharp.BoundBlock)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter+<>c__DisplayClass41_0.b__0()
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(System.Collections.Immutable.ImmutableArray1<Microsoft.CodeAnalysis.CSharp.Symbols.LocalSymbol>, System.Func1<Microsoft.CodeAnalysis.CSharp.BoundStatement>)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.VisitTryStatement(Microsoft.CodeAnalysis.CSharp.BoundTryStatement)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(Microsoft.CodeAnalysis.CSharp.BoundBlock)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter+<>c__DisplayClass41_0.b__0()
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(System.Collections.Immutable.ImmutableArray1<Microsoft.CodeAnalysis.CSharp.Symbols.LocalSymbol>, System.Func1<Microsoft.CodeAnalysis.CSharp.BoundStatement>)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(Microsoft.CodeAnalysis.CSharp.BoundBlock)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter+<>c__DisplayClass41_0.b__0()
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(System.Collections.Immutable.ImmutableArray1<Microsoft.CodeAnalysis.CSharp.Symbols.LocalSymbol>, System.Func1<Microsoft.CodeAnalysis.CSharp.BoundStatement>)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitBlock(Microsoft.CodeAnalysis.CSharp.BoundBlock)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter+<>c__DisplayClass41_0.b__0()
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.PossibleIteratorScope(System.Collections.Immutable.ImmutableArray1<Microsoft.CodeAnalysis.CSharp.Symbols.LocalSymbol>, System.Func1<Microsoft.CodeAnalysis.CSharp.BoundStatement>)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.MethodToStateMachineRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.AsyncMethodToStateMachineRewriter.VisitBody(Microsoft.CodeAnalysis.CSharp.BoundStatement)
at Microsoft.CodeAnalysis.CSharp.AsyncMethodToStateMachineRewriter.GenerateMoveNext(Microsoft.CodeAnalysis.CSharp.BoundStatement, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol)
at Microsoft.CodeAnalysis.CSharp.AsyncRewriter.GenerateMoveNext(Microsoft.CodeAnalysis.CSharp.Symbols.SynthesizedImplementationMethod)
at Microsoft.CodeAnalysis.CSharp.AsyncRewriter.GenerateMethodImplementations()
at Microsoft.CodeAnalysis.CSharp.StateMachineRewriter.Rewrite()
at Microsoft.CodeAnalysis.CSharp.AsyncRewriter.Rewrite(Microsoft.CodeAnalysis.CSharp.BoundStatement, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Int32, Microsoft.CodeAnalysis.CodeGen.VariableSlotAllocator, Microsoft.CodeAnalysis.CSharp.TypeCompilationState, Microsoft.CodeAnalysis.DiagnosticBag, Microsoft.CodeAnalysis.CSharp.AsyncStateMachine ByRef)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.LowerBodyOrInitializer(Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Int32, Microsoft.CodeAnalysis.CSharp.BoundStatement, Microsoft.CodeAnalysis.CSharp.SynthesizedSubmissionFields, Microsoft.CodeAnalysis.CSharp.TypeCompilationState, Boolean, Microsoft.CodeAnalysis.CodeGen.DebugDocumentProvider, System.Collections.Immutable.ImmutableArray1<Microsoft.CodeAnalysis.CodeGen.SourceSpan> ByRef, Microsoft.CodeAnalysis.DiagnosticBag, Microsoft.CodeAnalysis.CodeGen.VariableSlotAllocator ByRef, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder1<Microsoft.CodeAnalysis.CodeGen.LambdaDebugInfo>, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.CodeGen.ClosureDebugInfo>, Microsoft.CodeAnalysis.CSharp.StateMachineTypeSymbol ByRef)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Int32, ProcessedFieldInitializers ByRef, Microsoft.CodeAnalysis.CSharp.SynthesizedSubmissionFields, Microsoft.CodeAnalysis.CSharp.TypeCompilationState)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(Microsoft.CodeAnalysis.CSharp.Symbols.NamedTypeSymbol)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler+<>c__DisplayClass22_0.b__0()
at Roslyn.Utilities.UICultureUtilities+<>c__DisplayClass5_0.b__0()
at System.Threading.Tasks.Task.Execute()
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)
at System.Threading.Tasks.Task.ExecuteEntry(Boolean)
at System.Threading.ThreadPoolWorkQueue.Dispatch()

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