Roslyn: error MSB6006: "csc.exe" exited with code -2146232797 on a complex switch expression

Created on 10 Oct 2020  路  3Comments  路  Source: dotnet/roslyn

Version Used: Visual Studio 16.7.5

Steps to Reproduce: Try compiling the following code snippet (I'm using the default .NET Core Console App in VS).

The issue seems to have something to do with the complexity of the switch expression and amount of cases and usage of the .Any, but I cannot figure it out.

using System;
using System.Linq;

namespace Sample
{
    internal class Row
    {
        public string Message { get; set; }
    }

    internal class Program
    {
        private static void Main()
        {
            Console.WriteLine(ProcessRow(new Row()));
        }

        private static string ProcessRow(Row row)
        {
            if (row == null) throw new ArgumentNullException(nameof(row));
            return row switch
            {
                { Message: "stringA" } => "stringB",
                var r when new[] { "stringC", "stringD" }.Any(x => r.Message.Contains(x)) => "stringE",
                { Message: "stringF" } => "stringG",
                _ => "stringH",
            };
        }
    }
}

Expected Behavior: It either compiles (it looks valid to me) or gives me a reasonable error I can work with (if it's not actually valid code for some reason).

Actual Behavior: It takes a while, and then finishes with:

MSB6006 "csc.exe" exited with code -2146232797.

I also tried it on SharpLab and it was giving me this stack trace (not sure if it's actually related):

System.InvalidOperationException: Operation is not valid due to the current state of the object.
   at Microsoft.CodeAnalysis.SmallDictionary`2.HandleInsert(AvlNode node, AvlNode parent, K key, V value, Boolean add) in /_/src/Compilers/Core/Portable/Collections/SmallDictionary.cs:line 461
   at Microsoft.CodeAnalysis.SmallDictionary`2.Insert(Int32 hashCode, K key, V value, Boolean add) in /_/src/Compilers/Core/Portable/Collections/SmallDictionary.cs:line 310
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.DeclareLocals[TSymbol](Scope scope, ImmutableArray`1 locals, Boolean declareAsFree) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs:line 780
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitNestedFunction(MethodSymbol functionSymbol, BoundBlock body) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs:line 582
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitLambda(BoundLambda node) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs:line 430
   at Microsoft.CodeAnalysis.CSharp.BoundLambda.Accept(BoundTreeVisitor visitor) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 7002
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 88
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeVisitors.cs:line 218
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 78
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitConversion(BoundConversion node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 9014
   at Microsoft.CodeAnalysis.CSharp.BoundConversion.Accept(BoundTreeVisitor visitor) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 2513
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 88
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeVisitors.cs:line 218
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 78
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[T](ImmutableArray`1 list) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 22
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitCall(BoundCall node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 9408
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitCall(BoundCall node) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs:line 442
   at Microsoft.CodeAnalysis.CSharp.BoundCall.Accept(BoundTreeVisitor visitor) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 5694
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 88
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(BoundExpression node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeVisitors.cs:line 238
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeVisitors.cs:line 218
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 78
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitConditionalGoto(BoundConditionalGoto node) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs:line 521
   at Microsoft.CodeAnalysis.CSharp.BoundConditionalGoto.Accept(BoundTreeVisitor visitor) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 4434
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 78
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitSequencePointWithSpan(BoundSequencePointWithSpan node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 9040
   at Microsoft.CodeAnalysis.CSharp.BoundSequencePointWithSpan.Accept(BoundTreeVisitor visitor) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 2724
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 78
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[T](ImmutableArray`1 list) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 22
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitScope(BoundScope node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 9052
   at Microsoft.CodeAnalysis.CSharp.BoundScope.Accept(BoundTreeVisitor visitor) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 2891
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 78
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[T](ImmutableArray`1 list) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 22
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitBlock(BoundBlock node) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs:line 404
   at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 2862
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 78
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitSequencePoint(BoundSequencePoint node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 9035
   at Microsoft.CodeAnalysis.CSharp.BoundSequencePoint.Accept(BoundTreeVisitor visitor) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 2696
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 78
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[T](ImmutableArray`1 list) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 22
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitBlock(BoundBlock node) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs:line 404
   at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 2862
   at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeWalker.cs:line 78
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.Build() in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs:line 379
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.Build(BoundNode node, MethodSymbol topLevelMethod, HashSet`1 methodsConvertedToDelegates, DiagnosticBag diagnostics) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs:line 365
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.Analyze(BoundNode node, MethodSymbol method, Int32 topLevelMethodOrdinal, MethodSymbol substitutedSourceMethod, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, ArrayBuilder`1 closureDebugInfo, DiagnosticBag diagnostics) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.cs:line 77
   at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Rewrite(BoundStatement loweredBody, NamedTypeSymbol thisType, ParameterSymbol thisParameter, MethodSymbol method, Int32 methodOrdinal, MethodSymbol substitutedSourceMethod, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 closureDebugInfoBuilder, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, DiagnosticBag diagnostics, HashSet`1 assignLocals) in /_/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.cs:line 240
   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 /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 1400
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 886
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 508
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass22_0.<CompileNamedTypeAsync>b__0() in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 404
   at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass5_0.<WithCurrentUICulture>b__0() in /_/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.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.WaitForWorkers() in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 313
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethodBodies(CSharpCompilation compilation, PEModuleBuilder moduleBeingBuiltOpt, Boolean emittingPdb, Boolean emitTestCoverageData, Boolean hasDeclarationErrors, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 205
   at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, Boolean emitMetadataOnly, Boolean emitTestCoverageData, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken) in /_/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs:line 2937
   at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, CompilationTestData testData, CancellationToken cancellationToken) in /_/src/Compilers/Core/Portable/Compilation/Compilation.cs:line 2561
   at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, CancellationToken cancellationToken) in /_/src/Compilers/Core/Portable/Compilation/Compilation.cs:line 2517
   at SharpLab.Server.Compilation.Compiler.TryCompileToStreamAsync(MemoryStream assemblyStream, MemoryStream symbolStream, IWorkSession session, IList`1 diagnostics, CancellationToken cancellationToken) in D:\a\SharpLab\SharpLab\!roslyn-branches\dotnet-master\sharplab\source\Server\Compilation\Compiler.cs:line 31
   at SharpLab.Server.MirrorSharp.SlowUpdate.ProcessAsync(IWorkSession session, IList`1 diagnostics, CancellationToken cancellationToken) in D:\a\SharpLab\SharpLab\!roslyn-branches\dotnet-master\sharplab\source\Server\MirrorSharp\SlowUpdate.cs:line 110
   at MirrorSharp.Internal.Handlers.SlowUpdateHandler.ExecuteAsync(AsyncData data, WorkSession session, ICommandResultSender sender, CancellationToken cancellationToken)
   at MirrorSharp.Internal.Connection.ReceiveAndProcessInternalAsync(CancellationToken cancellationToken)
   at MirrorSharp.Internal.Connection.ReceiveAndProcessAsync(CancellationToken cancellationToken)

Might be somehow related to #40251 or #48259.

Area-Compilers Bug New Language Feature - Pattern Matching Tenet-Reliability

All 3 comments

@jaredpar The stack trace for this is showing a crash in SmallDictionary. Could this be related to your issue https://github.com/dotnet/roslyn/issues/40344? (Nope, looks like another issue).

This has been broken since at least Roslyn 3.100.19.26502 (e38a60d2).

We hit an assertion failure in debug mode:

https://github.com/dotnet/roslyn/blob/9e4e9c8a0ab89b2c0a7dca2e9327989d678d1842/src/Compilers/CSharp/Portable/Lowering/ClosureConversion/ClosureConversion.Analysis.Tree.cs#L771

System.InvalidOperationException :

Stack Trace:
  src\Test\Utilities\Portable\ThrowingTraceListener.cs(28,0): at Microsoft.CodeAnalysis.ThrowingTraceListener.Fail(String message, String detailMessage)
     at System.Diagnostics.TraceInternal.Fail(String message, String detailMessage)
     at System.Diagnostics.TraceInternal.TraceProvider.Fail(String message, String detailMessage)
     at System.Diagnostics.Debug.Fail(String message, String detailMessage)
     at System.Diagnostics.Debug.Assert(Boolean condition)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.Tree.cs(771,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.DeclareLocals[TSymbol](Scope scope, ImmutableArray`1 locals, Boolean declareAsFree)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.Tree.cs(575,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitNestedFunction(MethodSymbol functionSymbol, BoundBlock body)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.Tree.cs(431,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitLambda(BoundLambda node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(7002,0): at Microsoft.CodeAnalysis.CSharp.BoundLambda.Accept(BoundTreeVisitor visitor)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(88,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(207,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(75,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(9013,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitConversion(BoundConversion node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(2513,0): at Microsoft.CodeAnalysis.CSharp.BoundConversion.Accept(BoundTreeVisitor visitor)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(88,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(207,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(75,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(22,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[T](ImmutableArray`1 list)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(9407,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitCall(BoundCall node)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.Tree.cs(447,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitCall(BoundCall node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(5694,0): at Microsoft.CodeAnalysis.CSharp.BoundCall.Accept(BoundTreeVisitor visitor)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(88,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(232,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(BoundExpression node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(211,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(75,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(9231,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitConditionalGoto(BoundConditionalGoto node)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.Tree.cs(521,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitConditionalGoto(BoundConditionalGoto node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(4434,0): at Microsoft.CodeAnalysis.CSharp.BoundConditionalGoto.Accept(BoundTreeVisitor visitor)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(78,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(9039,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitSequencePointWithSpan(BoundSequencePointWithSpan node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(2724,0): at Microsoft.CodeAnalysis.CSharp.BoundSequencePointWithSpan.Accept(BoundTreeVisitor visitor)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(78,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(22,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[T](ImmutableArray`1 list)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(9052,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitScope(BoundScope node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(2891,0): at Microsoft.CodeAnalysis.CSharp.BoundScope.Accept(BoundTreeVisitor visitor)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(78,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(22,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[T](ImmutableArray`1 list)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(9047,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitBlock(BoundBlock node)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.Tree.cs(402,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitBlock(BoundBlock node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(2862,0): at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(78,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(9034,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitSequencePoint(BoundSequencePoint node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(2696,0): at Microsoft.CodeAnalysis.CSharp.BoundSequencePoint.Accept(BoundTreeVisitor visitor)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(78,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(22,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[T](ImmutableArray`1 list)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(9047,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitBlock(BoundBlock node)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.Tree.cs(402,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.VisitBlock(BoundBlock node)
  src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(2862,0): at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\BoundTree\BoundTreeWalker.cs(78,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeWalkerWithStackGuard.Visit(BoundNode node)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.Tree.cs(379,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.Build()
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.Tree.cs(365,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.ScopeTreeBuilder.Build(BoundNode node, MethodSymbol topLevelMethod, HashSet`1 methodsConvertedToDelegates, DiagnosticBag diagnostics)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.Analysis.cs(77,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Analysis.Analyze(BoundNode node, MethodSymbol method, Int32 topLevelMethodOrdinal, MethodSymbol substitutedSourceMethod, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, ArrayBuilder`1 closureDebugInfo, DiagnosticBag diagnostics)
  src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs(240,0): at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Rewrite(BoundStatement loweredBody, NamedTypeSymbol thisType, ParameterSymbol thisParameter, MethodSymbol method, Int32 methodOrdinal, MethodSymbol substitutedSourceMethod, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 closureDebugInfoBuilder, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, DiagnosticBag diagnostics, HashSet`1 assignLocals)
  src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(1359,0): 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)
  src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(1136,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState)
  src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(508,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType)
  src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(398,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass22_0.<CompileNamedTypeAsync>b__0()
  src\Compilers\Core\Portable\InternalUtilities\UICultureUtilities.cs(139,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__277_0(Object obj)
     at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
  --- End of stack trace from previous location ---
     at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
     at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
  --- End of stack trace from previous location ---
  src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(313,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.WaitForWorkers()
  src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(157,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethodBodies(CSharpCompilation compilation, PEModuleBuilder moduleBeingBuiltOpt, Boolean emittingPdb, Boolean emitTestCoverageData, Boolean hasDeclarationErrors, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
  src\Compilers\CSharp\Portable\Compilation\CSharpCompilation.cs(2920,0): at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, Boolean emitMetadataOnly, Boolean emitTestCoverageData, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
  src\Compilers\Core\Portable\Compilation\Compilation.cs(2585,0): at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, CompilationTestData testData, CancellationToken cancellationToken)
  src\Test\Utilities\Portable\Compilation\IRuntimeEnvironment.cs(254,0): at Roslyn.Test.Utilities.RuntimeEnvironmentUtilities.EmitCompilationCore(Compilation compilation, IEnumerable`1 manifestResources, DiagnosticBag diagnostics, CompilationTestData testData, EmitOptions emitOptions)
  src\Test\Utilities\Portable\Compilation\IRuntimeEnvironment.cs(227,0): at Roslyn.Test.Utilities.RuntimeEnvironmentUtilities.EmitCompilation(Compilation compilation, IEnumerable`1 manifestResources, List`1 dependencies, DiagnosticBag diagnostics, CompilationTestData testData, EmitOptions emitOptions)
  src\Test\Utilities\Portable\Platform\CoreClr\CoreCLRRuntimeEnvironment.cs(46,0): at Roslyn.Test.Utilities.CoreClr.CoreCLRRuntimeEnvironment.Emit(Compilation mainCompilation, IEnumerable`1 manifestResources, EmitOptions emitOptions, Boolean usePdbForDebugging)
  src\Test\Utilities\Portable\CompilationVerifier.cs(237,0): at Microsoft.CodeAnalysis.Test.Utilities.CompilationVerifier.Emit(IRuntimeEnvironment testEnvironment, IEnumerable`1 manifestResources, EmitOptions emitOptions)
  src\Test\Utilities\Portable\CompilationVerifier.cs(203,0): at Microsoft.CodeAnalysis.Test.Utilities.CompilationVerifier.Emit(String expectedOutput, Nullable`1 expectedReturnCode, String[] args, IEnumerable`1 manifestResources, EmitOptions emitOptions, Verification peVerify, SignatureDescription[] expectedSignatures)
  src\Test\Utilities\Portable\CommonTestBase.cs(152,0): at Microsoft.CodeAnalysis.Test.Utilities.CommonTestBase.Emit(Compilation compilation, IEnumerable`1 dependencies, IEnumerable`1 manifestResources, SignatureDescription[] expectedSignatures, String expectedOutput, Nullable`1 expectedReturnCode, String[] args, Action`1 assemblyValidator, Action`1 symbolValidator, EmitOptions emitOptions, Verification verify)
  src\Test\Utilities\Portable\CommonTestBase.cs(66,0): at Microsoft.CodeAnalysis.Test.Utilities.CommonTestBase.CompileAndVerifyCommon(Compilation compilation, IEnumerable`1 manifestResources, IEnumerable`1 dependencies, Action`1 sourceSymbolValidator, Action`1 assemblyValidator, Action`1 symbolValidator, SignatureDescription[] expectedSignatures, String expectedOutput, Nullable`1 expectedReturnCode, String[] args, EmitOptions emitOptions, Verification verify)
  src\Compilers\Test\Utilities\CSharp\CSharpTestBase.cs(828,0): at Microsoft.CodeAnalysis.CSharp.Test.Utilities.CSharpTestBase.CompileAndVerify(Compilation compilation, IEnumerable`1 manifestResources, IEnumerable`1 dependencies, Action`1 sourceSymbolValidator, Action`1 validator, Action`1 symbolValidator, SignatureDescription[] expectedSignatures, String expectedOutput, Nullable`1 expectedReturnCode, String[] args, EmitOptions emitOptions, Verification verify)
  src\Compilers\CSharp\Test\Emit\CodeGen\SwitchTests.cs(9766,0): at Microsoft.CodeAnalysis.CSharp.UnitTests.CodeGen.SwitchTests.CapturePatternVariable()

Here's the simplest repro I've found so far:

using System;

internal class Widget
{
    public bool IsGood { get; set; }
}

internal class Program
{
    private static bool M0(Func<bool> fn) => fn();

    private static void Main()
    {
        Console.Write(new Widget() switch
        {
            { IsGood: true } => 1,
            _ when M0(() => true) => 2,
            { } => 3,
        });
    }
}

The issue seems to manifest when:

  • there are at least 3 arms in the switch expression
  • the first and last arms perform tests on the input
  • the middle arm performs no tests on the input and has a when clause containing a lambda.
Was this page helpful?
0 / 5 - 0 ratings