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.
@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:
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: