Roslyn: (Regression) C# compiler crashes on some switch statements involving value tuples

Created on 23 Aug 2020  路  2Comments  路  Source: dotnet/roslyn

Version Used:
Working in .NET Core 3.1.101 (Roslyn 3.4.1-beta4-19614-01 (16504609))
Broken in .NET Core 3.1.401 (Roslyn 3.7.0-6.20371.12 (917b9dfa))

also tested as working in VS2019 16.4.5 but broken in 16.7.1

Steps to Reproduce:

Compile the following minimal test case (using dotnet build or directly with csc)

Crashy.cs

namespace Test
{
    public class Crashy
    {
        void Method(object foo, int bar)
        {
            switch (foo, bar)
            {
                case (object _, 1): break;
                case (object _, 2): break;
                case (_, 3): break;
            }
        }
    }
}

Crashy.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
  </PropertyGroup>
</Project>

csc invocation that reproduces the issue:

"C:\Program Files\dotnet\dotnet.exe" exec 
    C:\Depot\ThirdParty\roslyn\artifacts\bin\csc\Debug\netcoreapp3.1\csc.dll 
    /noconfig /unsafe+ /checked- /nostdlib+ /errorreport:prompt /warn:4 
    /define:TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_1 /highentropyva+ 
    /reference:"C:\Program Files\dotnet\packs\NETStandard.Library.Ref\2.1.0\ref\netstandard2.1\mscorlib.dll" 
    /reference:"C:\Program Files\dotnet\packs\NETStandard.Library.Ref\2.1.0\ref\netstandard2.1\netstandard.dll" 
    /reference:"C:\Program Files\dotnet\packs\NETStandard.Library.Ref\2.1.0\ref\netstandard2.1\System.Core.dll" 
    /reference:"C:\Program Files\dotnet\packs\NETStandard.Library.Ref\2.1.0\ref\netstandard2.1\System.dll" 
    /debug+ /debug:portable /filealign:512 
    /out:obj\Debug\netstandard2.1\Test.dll 
    /target:library /utf8output /deterministic+
    Crashy.cs

Expected Behavior: Successful compilation

Actual Behavior:

Process terminated. System.NullReferenceException: Object reference not set to an instance of an object. 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.BasicBlock.ShortenBranches(Int32& delta) 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.ComputeOffsetsAndAdjustBranches() 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.RealizeBlocks() 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.Realize() 
   at Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.GenerateImpl() 
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.GenerateMethodBody(PEModuleBuilder moduleBuilder, MethodSymbol method, Int32 methodOrdinal, BoundStatement block, ImmutableArray`1 lambdaDebugInfo, ImmutableArray`1 closureDebugInfo, StateMachineTypeSymbol stateMachineTypeOpt, VariableSlotAllocator variableSlotAllocatorOpt, DiagnosticBag diagnostics, DebugDocumentProvider debugDocumentProvider, ImportChain importChainOpt, Boolean emittingPdb, Boolean emitTestCoverageData, ImmutableArray`1 dynamicAnalysisSpans, AsyncForwardEntryPoint entryPointOpt) 
   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.<CompileNamedTypeAsync>b__0() 
   at System.Environment.FailFast(System.String, System.Exception) 
   at Microsoft.CodeAnalysis.FailFast.OnFatalException(System.Exception) 
   at Microsoft.CodeAnalysis.FatalError.Report(System.Exception, System.Action`1<System.Exception>) 
   at Microsoft.CodeAnalysis.FatalError.ReportUnlessCanceled(System.Exception) 
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler+<>c__DisplayClass22_0.<CompileNamedTypeAsync>b__0() 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder+BasicBlock.ShortenBranches(Int32 ByRef) 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.ComputeOffsetsAndAdjustBranches() 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.RealizeBlocks() 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.Realize() 
   at Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.GenerateImpl() 
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.GenerateMethodBody(Microsoft.CodeAnalysis.CSharp.Emit.PEModuleBuilder, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Int32, Microsoft.CodeAnalysis.CSharp.BoundStatement, System.Collections.Immutable.ImmutableArray`1<Microsoft.CodeAnalysis.CodeGen.LambdaDebugInfo>, System.Collections.Immutable.ImmutableArray`1<Microsoft.CodeAnalysis.CodeGen.ClosureDebugInfo>, Microsoft.CodeAnalysis.CSharp.StateMachineTypeSymbol, Microsoft.CodeAnalysis.CodeGen.VariableSlotAllocator, Microsoft.CodeAnalysis.DiagnosticBag, Microsoft.CodeAnalysis.CodeGen.DebugDocumentProvider, Microsoft.CodeAnalysis.CSharp.ImportChain, Boolean, Boolean, System.Collections.Immutable.ImmutableArray`1<Microsoft.CodeAnalysis.CodeGen.SourceSpan>, AsyncForwardEntryPoint) 
   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.<CompileNamedTypeAsync>b__0() 
   at Roslyn.Utilities.UICultureUtilities+<>c__DisplayClass5_0.<WithCurrentUICulture>b__0() 
   at System.Threading.Tasks.Task.InnerInvoke() 
   at System.Threading.Tasks.Task+<>c.<.cctor>b__274_0(System.Object) 
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(System.Threading.Thread, System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread) 
   at System.Threading.Tasks.Task.ExecuteEntryUnsafe(System.Threading.Thread) 
   at System.Threading.Tasks.Task.ExecuteFromThreadPool(System.Threading.Thread) 
   at System.Threading.ThreadPoolWorkQueue.Dispatch() 
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() 
System.NullReferenceException: Object reference not set to an instance of an object. 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.BasicBlock.ShortenBranches(Int32& delta) 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.ComputeOffsetsAndAdjustBranches() 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.RealizeBlocks() 
   at Microsoft.CodeAnalysis.CodeGen.ILBuilder.Realize() 
   at Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator.GenerateImpl() 
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.GenerateMethodBody(PEModuleBuilder moduleBuilder, MethodSymbol method, Int32 methodOrdinal, BoundStatement block, ImmutableArray`1 lambdaDebugInfo, ImmutableArray`1 closureDebugInfo, StateMachineTypeSymbol stateMachineTypeOpt, VariableSlotAllocator variableSlotAllocatorOpt, DiagnosticBag diagnostics, DebugDocumentProvider debugDocumentProvider, ImportChain importChainOpt, Boolean emittingPdb, Boolean emitTestCoverageData, ImmutableArray`1 dynamicAnalysisSpans, AsyncForwardEntryPoint entryPointOpt) 
   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.<CompileNamedTypeAsync>b__0() 

Build FAILED.

or from debug build of csc:

Process terminated. Assertion failed.
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.DecisionDagRewriter.LowerDecisionDagCore(BoundDecisionDag decisionDag) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter.DecisionDagRewriter.cs:line 386
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.BaseSwitchLocalRewriter.LowerDecisionDag(BoundDecisionDag decisionDag) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter_BasePatternSwitchLocalRewriter.cs:line 72
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.SwitchStatementLocalRewriter.LowerSwitchStatement(BoundSwitchStatement node) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter_PatternSwitchStatement.cs:line 114
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.SwitchStatementLocalRewriter.Rewrite(LocalRewriter localRewriter, BoundSwitchStatement node) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter_PatternSwitchStatement.cs:line 32
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitSwitchStatement(BoundSwitchStatement node) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter_PatternSwitchStatement.cs:line 19
   at Microsoft.CodeAnalysis.CSharp.BoundSwitchStatement.Accept(BoundTreeVisitor visitor) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 3299
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitStatement(BoundStatement node) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter.cs:line 194
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitPossibleUsingDeclaration(BoundStatement node, ImmutableArray`1 statements, Int32 statementIndex, Boolean& replacedLocalDeclarations) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter_Block.cs:line 103
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitStatementSubList(ArrayBuilder`1 builder, ImmutableArray`1 statements, Int32 startIndex) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter_Block.cs:line 61
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitBlock(BoundBlock node) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter_Block.cs:line 22
   at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 2809
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitStatement(BoundStatement node) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter.cs:line 194
   at Microsoft.CodeAnalysis.CSharp.LocalRewriter.Rewrite(CSharpCompilation compilation, MethodSymbol method, Int32 methodOrdinal, NamedTypeSymbol containingType, BoundStatement statement, TypeCompilationState compilationState, SynthesizedSubmissionFields previousSubmissionFields, Boolean allowOmissionOfConditionalCalls, Boolean instrumentForDynamicAnalysis, ImmutableArray`1& dynamicAnalysisSpans, DebugDocumentProvider debugDocumentProvider, DiagnosticBag diagnostics, Boolean& sawLambdas, Boolean& sawLocalFunctions, Boolean& sawAwaitInExceptionHandler) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Lowering\LocalRewriter\LocalRewriter.cs:line 109
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.LowerBodyOrInitializer(MethodSymbol method, Int32 methodOrdinal, BoundStatement body, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState, Boolean instrumentForDynamicAnalysis, DebugDocumentProvider debugDocumentProvider, ImmutableArray`1& dynamicAnalysisSpans, DiagnosticBag diagnostics, VariableSlotAllocator& lazyVariableSlotAllocator, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 closureDebugInfoBuilder, StateMachineTypeSymbol& stateMachineTypeOpt) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 1299
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 1126
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType) in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 506
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass22_0.<CompileNamedTypeAsync>b__0() in C:\Depot\ThirdParty\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 396
   at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass5_0.<WithCurrentUICulture>b__0() in C:\Depot\ThirdParty\roslyn\src\Compilers\Core\Portable\InternalUtilities\UICultureUtilities.cs:line 141
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.<>c.<.cctor>b__274_0(Object obj)
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
   at System.Threading.Tasks.Task.ExecuteEntryUnsafe(Thread threadPoolThread)
   at System.Threading.Tasks.Task.ExecuteFromThreadPool(Thread threadPoolThread)
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
Area-Compilers Bug Resolution-Duplicate

Most helpful comment

This was fixed in #47127 and is expected to ship in a patch release for VS 16.7 and .NET Core 3.1.4xx. Thank you for reporting.

All 2 comments

The same issue for latest .NET 5: 5.0.0-preview.8.20411.6.

This was fixed in #47127 and is expected to ship in a patch release for VS 16.7 and .NET Core 3.1.4xx. Thank you for reporting.

Was this page helpful?
0 / 5 - 0 ratings