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()
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.
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.