.NET 9 `Preview.5`, `Preview.6`, `Preview.7` C# compiler crashes on LINQ expression with string interpolation
Version Used: .NET 9 SDK 9.0.100-preview.5.24307.3 tried also Preview.6 and today's Preview.7
Steps to Reproduce: Following code:
using System.Linq;
class Program
{
static IQueryable<string> GetStrings() => null;
public static void Main() =>
GetStrings().Select(o => $"{o} {o} {o} {o}"); // Crashes with 4 or more `{o}`
}
with .csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<LangVersion>Preview</LangVersion>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>
</Project>
Diagnostic Id:
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInference.targets(314,5): message NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : Process terminated. System.InvalidOperationException: Unexpected value 'Sequence' of type 'Microsoft.CodeAnalysis.CSharp.BoundKind' [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(BoundExpression node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(BoundExpression node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(BoundExpression node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Expressions(ImmutableArray`1 expressions) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitCall(BoundCall node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(BoundExpression node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(BoundExpression node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitConversion(BoundConversion node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(BoundExpression node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(BoundExpression node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.TranslateLambdaBody(BoundBlock block) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitLambdaInternal(BoundLambda node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.RewriteLambda(BoundLambda node, TypeCompilationState compilationState, TypeMap typeMap, Int32 recursionDepth, BindingDiagnosticBag diagnostics) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ClosureConversion.RewriteLambdaConversion(BoundLambda node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.ClosureConversion.VisitConversion(BoundConversion conversion) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node) [D:\WORK\CS\CS.csproj]
C:\Program Files\dotnet\sdk\9.0.100-preview.5.24307.3\Roslyn\Microsoft.CSharp.Core.targets(85,5): error : at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[T](ImmutableArray`1 list) [D:\WORK\CS\CS.csproj]
...
Expected Behavior: Successful build
Actual Behavior:
Compiler crash
(does work without <LangVersion>Preview</LangVersion> setting)
The string interpolation is handled internally as collection-expression conversion to a readonly span (a debug assert is also triggered). This is okay only in non expression trees.
Currently: System.String! System.String.Format(System.String! format, params System.ReadOnlySpan<System.Object?> args) is selected to handle the string interpolation. The reason is because the code is essentially lowered to:
using System.Collections.Generic;
using System.Linq;
class Program
{
static IQueryable<string> GetStrings() => null;
public static void Main() =>
GetStrings().Select(o => string.Format("{0} {1} {2} {3}", o, o, o, o));
}
For expression trees we could lower it to (no ref struct allowed):
using System.Collections.Generic;
using System.Linq;
class Program
{
static IQueryable<string> GetStrings() => null;
public static void Main() =>
GetStrings().Select(o => string.Format("{0} {1} {2} {3}", new object[] { o, o, o, o }));
}
But it would be maybe better to handle it in the invocation binding.
It sounds like a usage of a non-array params collection is making its way to an expression tree without triggering an error.
DiagnosticsPass is supposed to detect the usage and report an error like:
// (8,46): error CS9226: An expression tree may not contain an expanded form of non-array params collection parameter.
// Expression<System.Action> e1 = () => Test();
Diagnostic(ErrorCode.ERR_ParamsCollectionExpressionTree, "Test()").WithLocation(8, 46),
The following method is supposed to detect the situation:
public override BoundNode VisitCollectionExpression(BoundCollectionExpression node)
{
if (_inExpressionLambda)
{
Error(
node.IsParamsArrayOrCollection ?
ErrorCode.ERR_ParamsCollectionExpressionTree :
ErrorCode.ERR_ExpressionTreeContainsCollectionExpression,
node);
}
return base.VisitCollectionExpression(node);
}
At the moment there is no clarity how exactly a collection expression is getting through. Understanding that should be the next step in instigation of this issue.
@bernd5
The string interpolation is handled internally as collection-expression conversion to a readonly span (a debug assert is also triggered).
Could you please provide more details?
The string interpolation is handled internally as collection-expression conversion to a readonly span
Where exactly this handling is happening?
a debug assert is also triggered
What does assert check? Where it is in the code? What the call stack looks like?
The collection-conversion comes to play at (here we lower and assume overload resolution to pick the right one): https://github.com/dotnet/roslyn/blob/3a3c108d86c3cbb00049bfc4f5f9a04a42fa4b1b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_StringInterpolation.cs#L354
This is great because we have multiple overloads, with and without params. Overload resolution chooses the best one. And this allows the same code for less than 4 parameters, too.
The problem arises now for the params overload because we have 2 of them and the span overload is better.
What does assert check? Where it is in the code? What the call stack looks like?
It is here https://github.com/dotnet/roslyn/blob/3a3c108d86c3cbb00049bfc4f5f9a04a42fa4b1b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_CollectionExpression.cs#L34
The callstack is:
> Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.RewriteCollectionExpressionConversion(Microsoft.CodeAnalysis.CSharp.Conversion conversion, Microsoft.CodeAnalysis.CSharp.BoundCollectionExpression node) Zeile 34 C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitConversion(Microsoft.CodeAnalysis.CSharp.BoundConversion node) Zeile 66 C#
[Externer Code]
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression node) Zeile 97 C#
[Externer Code]
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression node) Zeile 92 C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitExpressionImpl(Microsoft.CodeAnalysis.CSharp.BoundExpression node) Zeile 273 C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitExpression(Microsoft.CodeAnalysis.CSharp.BoundExpression node) Zeile 230 C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitArgumentsAndCaptureReceiverIfNeeded(ref Microsoft.CodeAnalysis.CSharp.BoundExpression rewrittenReceiver, Microsoft.CodeAnalysis.CSharp.LocalRewriter.ReceiverCaptureMode captureReceiverMode, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.CSharp.BoundExpression> arguments, Microsoft.CodeAnalysis.CSharp.Symbol methodOrIndexer, System.Collections.Immutable.ImmutableArray<int> argsToParamsOpt, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.RefKind> argumentRefKindsOpt, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder<Microsoft.CodeAnalysis.CSharp.BoundExpression> storesOpt, ref Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder<Microsoft.CodeAnalysis.CSharp.Symbols.LocalSymbol> tempsOpt, Microsoft.CodeAnalysis.CSharp.BoundExpression firstRewrittenArgument) Zeile 741 C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitCall.__visitArgumentsAndFinishRewrite|151_1(Microsoft.CodeAnalysis.CSharp.BoundCall node, Microsoft.CodeAnalysis.CSharp.BoundExpression rewrittenReceiver) Zeile 384 C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitCall(Microsoft.CodeAnalysis.CSharp.BoundCall node) Zeile 341 C#
[Externer Code]
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression node) Zeile 97 C#
[Externer Code]
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression node) Zeile 92 C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitExpressionImpl(Microsoft.CodeAnalysis.CSharp.BoundExpression node) Zeile 273 C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitExpression(Microsoft.CodeAnalysis.CSharp.BoundExpression node) Zeile 230 C#
Microsoft.CodeAnalysis.CSharp.dll!Microsoft.CodeAnalysis.CSharp.LocalRewriter.VisitInterpolatedString(Microsoft.CodeAnalysis.CSharp.BoundInterpolatedString node) Zeile 362 C#
This is great because we have multiple overloads, with and without params. Overload resolution chooses the best one. And this allows the same code for less than 4 parameters, too.
Well, as we can see this approach is fragile and/or lacks proper validation of the result that it produces.
Other parts of LocalRewriter that utilize similar approach could be vulnerable too.
I think it would be good to understand what overloads String.Format were available in .Net8 and which of them the previous version of the compiler could possibly pick at https://github.com/dotnet/roslyn/blob/3a3c108d86c3cbb00049bfc4f5f9a04a42fa4b1b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_StringInterpolation.cs#L354
More detailed call stack for the following scenario:
using System.Linq.Expressions;
class Program
{
public static void Main()
{
Expression<Func<string, string>> e = (s) => $"{s} {s} {s} {s}";
}
}
Call stack:
Process terminated. System.InvalidOperationException: Unexpected value 'Sequence' of type 'Microsoft.CodeAnalysis.CSharp.BoundKind'
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 251
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 267
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 176
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Expressions(ImmutableArray`1 expressions) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 333
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitCall(BoundCall node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 579
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 202
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 267
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 176
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitConversion(BoundConversion node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 652
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 206
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 267
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 176
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.TranslateLambdaBody(BoundBlock block) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 143
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitLambdaInternal(BoundLambda node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 781
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.RewriteLambda(BoundLambda node, TypeCompilationState compilationState, TypeMap typeMap, Int32 recursionDepth, BindingDiagnosticBag diagnostics) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 119
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.RewriteLambdaConversion(BoundLambda node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 1621
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.VisitConversion(BoundConversion conversion) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 1390
at Microsoft.CodeAnalysis.CSharp.BoundConversion.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 2948
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 97
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 212
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 84
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitAssignmentOperator(BoundAssignmentOperator node) in src\Compilers\CSharp\Portable\Lowering\MethodToClassRewriter.cs:line 503
at Microsoft.CodeAnalysis.CSharp.BoundAssignmentOperator.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 1840
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 97
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 242
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 216
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 84
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitExpressionStatement(BoundExpressionStatement node) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 11290
at Microsoft.CodeAnalysis.CSharp.BoundExpressionStatement.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 3649
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 87
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitSequencePointWithSpan(BoundSequencePointWithSpan node) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 11225
at Microsoft.CodeAnalysis.CSharp.BoundSequencePointWithSpan.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 3152
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 87
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.RewriteBlock(BoundBlock node, ArrayBuilder`1 prologue, ArrayBuilder`1 newLocals) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 1172
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.VisitBlock(BoundBlock node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 1153
at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 3293
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 87
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Rewrite(BoundStatement loweredBody, NamedTypeSymbol thisType, ParameterSymbol thisParameter, MethodSymbol method, Int32 methodOrdinal, MethodSymbol substitutedSourceMethod, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 lambdaRuntimeRudeEditsBuilder, ArrayBuilder`1 closureDebugInfoBuilder, VariableSlotAllocator slotAllocator, TypeCompilationState compilationState, BindingDiagnosticBag diagnostics, HashSet`1 assignLocals) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 272
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.LowerBodyOrInitializer(MethodSymbol method, Int32 methodOrdinal, BoundStatement body, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState, MethodInstrumentation instrumentation, DebugDocumentProvider debugDocumentProvider, ImmutableArray`1& codeCoverageSpans, BindingDiagnosticBag diagnostics, VariableSlotAllocator& lazyVariableSlotAllocator, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 lambdaRuntimeRudeEditsBuilder, ArrayBuilder`1 closureDebugInfoBuilder, ArrayBuilder`1 stateMachineStateDebugInfoBuilder, StateMachineTypeSymbol& stateMachineTypeOpt) in src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 1420
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 1159
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType) in src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 530
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass25_0.<CompileNamedTypeAsync>b__0() in src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 432
at System.Environment.FailFast(System.String, System.Exception)
at Microsoft.CodeAnalysis.FailFast.OnFatalException(System.Exception)
at Microsoft.CodeAnalysis.FailFast+<>c.<.cctor>b__5_0(System.Exception, Microsoft.CodeAnalysis.ErrorReporting.ErrorSeverity, Boolean)
at Microsoft.CodeAnalysis.ErrorReporting.FatalError.ReportException(System.Exception, Microsoft.CodeAnalysis.ErrorReporting.ErrorSeverity, Boolean, ErrorReporterHandler)
at Microsoft.CodeAnalysis.ErrorReporting.FatalError.Report(System.Exception, Microsoft.CodeAnalysis.ErrorReporting.ErrorSeverity, Boolean)
at Microsoft.CodeAnalysis.ErrorReporting.FatalError.ReportAndPropagate(System.Exception, Microsoft.CodeAnalysis.ErrorReporting.ErrorSeverity)
at Microsoft.CodeAnalysis.ErrorReporting.FatalError.ReportAndPropagateUnlessCanceled(System.Exception, Microsoft.CodeAnalysis.ErrorReporting.ErrorSeverity)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler+<>c__DisplayClass25_0.<CompileNamedTypeAsync>b__0()
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Expressions(System.Collections.Immutable.ImmutableArray`1<Microsoft.CodeAnalysis.CSharp.BoundExpression>)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitCall(Microsoft.CodeAnalysis.CSharp.BoundCall)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitConversion(Microsoft.CodeAnalysis.CSharp.BoundConversion)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.TranslateLambdaBody(Microsoft.CodeAnalysis.CSharp.BoundBlock)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitLambdaInternal(Microsoft.CodeAnalysis.CSharp.BoundLambda)
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.RewriteLambda(Microsoft.CodeAnalysis.CSharp.BoundLambda, Microsoft.CodeAnalysis.CSharp.TypeCompilationState, Microsoft.CodeAnalysis.CSharp.Symbols.TypeMap, Int32, Microsoft.CodeAnalysis.CSharp.BindingDiagnosticBag)
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.RewriteLambdaConversion(Microsoft.CodeAnalysis.CSharp.BoundLambda)
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.VisitConversion(Microsoft.CodeAnalysis.CSharp.BoundConversion)
at Microsoft.CodeAnalysis.CSharp.BoundConversion.Accept(Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32 ByRef, Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitAssignmentOperator(Microsoft.CodeAnalysis.CSharp.BoundAssignmentOperator)
at Microsoft.CodeAnalysis.CSharp.BoundAssignmentOperator.Accept(Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32 ByRef, Microsoft.CodeAnalysis.CSharp.BoundExpression)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitExpressionStatement(Microsoft.CodeAnalysis.CSharp.BoundExpressionStatement)
at Microsoft.CodeAnalysis.CSharp.BoundExpressionStatement.Accept(Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitSequencePointWithSpan(Microsoft.CodeAnalysis.CSharp.BoundSequencePointWithSpan)
at Microsoft.CodeAnalysis.CSharp.BoundSequencePointWithSpan.Accept(Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.RewriteBlock(Microsoft.CodeAnalysis.CSharp.BoundBlock, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.CSharp.BoundExpression>, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.CSharp.Symbols.LocalSymbol>)
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.VisitBlock(Microsoft.CodeAnalysis.CSharp.BoundBlock)
at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(Microsoft.CodeAnalysis.CSharp.BoundNode)
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Rewrite(Microsoft.CodeAnalysis.CSharp.BoundStatement, Microsoft.CodeAnalysis.CSharp.Symbols.NamedTypeSymbol, Microsoft.CodeAnalysis.CSharp.Symbols.ParameterSymbol, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Int32, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.Emit.EncLambdaInfo>, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.CodeGen.LambdaRuntimeRudeEditInfo>, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.Emit.EncClosureInfo>, Microsoft.CodeAnalysis.CodeGen.VariableSlotAllocator, Microsoft.CodeAnalysis.CSharp.TypeCompilationState, Microsoft.CodeAnalysis.CSharp.BindingDiagnosticBag, System.Collections.Generic.HashSet`1<Microsoft.CodeAnalysis.CSharp.Symbols.LocalSymbol>)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.LowerBodyOrInitializer(Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Int32, Microsoft.CodeAnalysis.CSharp.BoundStatement, Microsoft.CodeAnalysis.CSharp.SynthesizedSubmissionFields, Microsoft.CodeAnalysis.CSharp.TypeCompilationState, Microsoft.CodeAnalysis.Emit.MethodInstrumentation, Microsoft.CodeAnalysis.CodeGen.DebugDocumentProvider, System.Collections.Immutable.ImmutableArray`1<Microsoft.CodeAnalysis.CodeGen.SourceSpan> ByRef, Microsoft.CodeAnalysis.CSharp.BindingDiagnosticBag, Microsoft.CodeAnalysis.CodeGen.VariableSlotAllocator ByRef, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.Emit.EncLambdaInfo>, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.CodeGen.LambdaRuntimeRudeEditInfo>, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.Emit.EncClosureInfo>, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1<Microsoft.CodeAnalysis.CodeGen.StateMachineStateDebugInfo>, Microsoft.CodeAnalysis.CSharp.StateMachineTypeSymbol ByRef)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Int32, ProcessedFieldInitializers ByRef, Microsoft.CodeAnalysis.CSharp.SynthesizedSubmissionFields, Microsoft.CodeAnalysis.CSharp.TypeCompilationState)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(Microsoft.CodeAnalysis.CSharp.Symbols.NamedTypeSymbol)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler+<>c__DisplayClass25_0.<CompileNamedTypeAsync>b__0()
at Roslyn.Utilities.UICultureUtilities+<>c__DisplayClass5_0.<WithCurrentUICulture>b__0()
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.ThreadPoolWorkQueue.Dispatch()
at System.Threading.PortableThreadPool+WorkerThread.WorkerThreadStart()
System.InvalidOperationException: Unexpected value 'Sequence' of type 'Microsoft.CodeAnalysis.CSharp.BoundKind'
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 251
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 267
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 176
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Expressions(ImmutableArray`1 expressions) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 333
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitCall(BoundCall node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 579
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 202
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 267
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 176
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitConversion(BoundConversion node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 652
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 206
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitInternal(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 267
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.Visit(BoundExpression node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 176
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.TranslateLambdaBody(BoundBlock block) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 143
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.VisitLambdaInternal(BoundLambda node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 781
at Microsoft.CodeAnalysis.CSharp.ExpressionLambdaRewriter.RewriteLambda(BoundLambda node, TypeCompilationState compilationState, TypeMap typeMap, Int32 recursionDepth, BindingDiagnosticBag diagnostics) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ExpressionLambdaRewriter.cs:line 119
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.RewriteLambdaConversion(BoundLambda node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 1621
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.VisitConversion(BoundConversion conversion) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 1390
at Microsoft.CodeAnalysis.CSharp.BoundConversion.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 2948
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 97
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 212
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 84
at Microsoft.CodeAnalysis.CSharp.Symbols.MethodToClassRewriter.VisitAssignmentOperator(BoundAssignmentOperator node) in src\Compilers\CSharp\Portable\Lowering\MethodToClassRewriter.cs:line 503
at Microsoft.CodeAnalysis.CSharp.BoundAssignmentOperator.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 1840
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionWithoutStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 97
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 242
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionWithStackGuard(Int32& recursionDepth, BoundExpression node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 216
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 84
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitExpressionStatement(BoundExpressionStatement node) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 11290
at Microsoft.CodeAnalysis.CSharp.BoundExpressionStatement.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 3649
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 87
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitSequencePointWithSpan(BoundSequencePointWithSpan node) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 11225
at Microsoft.CodeAnalysis.CSharp.BoundSequencePointWithSpan.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 3152
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 87
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.RewriteBlock(BoundBlock node, ArrayBuilder`1 prologue, ArrayBuilder`1 newLocals) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 1172
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.VisitBlock(BoundBlock node) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 1153
at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor) in src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs:line 3293
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs:line 151
at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node) in src\Compilers\CSharp\Portable\BoundTree\BoundTreeRewriter.cs:line 87
at Microsoft.CodeAnalysis.CSharp.ClosureConversion.Rewrite(BoundStatement loweredBody, NamedTypeSymbol thisType, ParameterSymbol thisParameter, MethodSymbol method, Int32 methodOrdinal, MethodSymbol substitutedSourceMethod, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 lambdaRuntimeRudeEditsBuilder, ArrayBuilder`1 closureDebugInfoBuilder, VariableSlotAllocator slotAllocator, TypeCompilationState compilationState, BindingDiagnosticBag diagnostics, HashSet`1 assignLocals) in src\Compilers\CSharp\Portable\Lowering\ClosureConversion\ClosureConversion.cs:line 272
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.LowerBodyOrInitializer(MethodSymbol method, Int32 methodOrdinal, BoundStatement body, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState, MethodInstrumentation instrumentation, DebugDocumentProvider debugDocumentProvider, ImmutableArray`1& codeCoverageSpans, BindingDiagnosticBag diagnostics, VariableSlotAllocator& lazyVariableSlotAllocator, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 lambdaRuntimeRudeEditsBuilder, ArrayBuilder`1 closureDebugInfoBuilder, ArrayBuilder`1 stateMachineStateDebugInfoBuilder, StateMachineTypeSymbol& stateMachineTypeOpt) in src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 1420
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 1159
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType) in src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 530
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass25_0.<CompileNamedTypeAsync>b__0() in src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs:line 432
Here is a unit-test that hits the same exception once all debug asserts on the way are disabled:
[Fact]
[WorkItem("https://github.com/dotnet/roslyn/issues/74163")]
public void StringInterpolation_01()
{
string source = """
class Program
{
public static void Test()
{
System.Linq.Expressions.Expression<System.Func<string, string>> e = (s) => $"{s} {s} {s} {s}";
}
}
namespace System
{
public class Object {}
public class ValueType {}
public abstract partial class Enum {}
public struct Void {}
public struct Boolean {}
public struct Byte {}
public struct Int32 {}
public struct IntPtr {}
public class String
{
public static string Format(string format, params object[] args) => null;
public static string Format(string format, params ReadOnlySpan<object> args) => null;
}
public abstract partial class Attribute {}
public sealed class ParamArrayAttribute : Attribute {}
public enum AttributeTargets
{
Assembly = 1,
Module = 2,
Class = 4,
Struct = 8,
Enum = 16,
Constructor = 32,
Method = 64,
Property = 128,
Field = 256,
Event = 512,
Interface = 1024,
Parameter = 2048,
Delegate = 4096,
ReturnValue = 8192,
GenericParameter = 16384,
All = 32767
}
public sealed class AttributeUsageAttribute : Attribute
{
public AttributeUsageAttribute(AttributeTargets validOn)
{
}
internal AttributeUsageAttribute(AttributeTargets validOn, bool allowMultiple, bool inherited)
{
}
public AttributeTargets ValidOn {get; set;}
public bool AllowMultiple {get; set;}
public bool Inherited {get; set;}
}
public abstract partial class Delegate {}
public abstract partial class MulticastDelegate : Delegate {}
public delegate TResult Func<in T, out TResult>(T arg);
public interface IDisposable
{
void Dispose();
}
public partial struct Nullable<T> where T : struct {}
public unsafe partial struct RuntimeTypeHandle {}
public unsafe partial struct RuntimeMethodHandle {}
public abstract partial class Type
{
public static Type GetTypeFromHandle(RuntimeTypeHandle handle) => null;
}
public ref struct ReadOnlySpan<T>
{
public ReadOnlySpan(T[] array)
{
}
public ReadOnlySpan(T[] array, int start, int length)
{
}
public unsafe ReadOnlySpan(void* pointer, int length)
{
}
}
}
namespace System.Collections
{
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
}
namespace System.Collections.Generic
{
public interface IEnumerator<out T> : IEnumerator, IDisposable
{
new T Current { get; }
}
public interface IEnumerable<out T> : IEnumerable
{
new IEnumerator<T> GetEnumerator();
}
}
namespace System.Reflection
{
public abstract unsafe partial class MethodBase
{
public static MethodBase GetMethodFromHandle(RuntimeMethodHandle handle) => null;
public static MethodBase GetMethodFromHandle(RuntimeMethodHandle handle, RuntimeTypeHandle declaringType) => null;
}
public abstract partial class MethodInfo : MethodBase {}
public abstract partial class ConstructorInfo : MethodBase {}
}
namespace System.Linq.Expressions
{
using System.Collections.Generic;
using System.Reflection;
public partial class Expression
{
public static ParameterExpression Parameter(Type type) => null;
public static ParameterExpression Parameter(Type type, string name) => null;
public static ConstantExpression Constant(object value) => null;
public static ConstantExpression Constant(object value, Type type) => null;
public static Expression<TDelegate> Lambda<TDelegate>(Expression body, params ParameterExpression[] parameters) => null;
public static NewArrayExpression NewArrayInit(Type type, params Expression[] initializers) => null;
public static NewExpression New(ConstructorInfo constructor, IEnumerable<Expression> arguments) => null;
public static MethodCallExpression Call(Expression instance, MethodInfo method, params Expression[] arguments) => null;
}
public abstract class LambdaExpression : Expression {}
public class Expression<TDelegate> : LambdaExpression {}
public class ParameterExpression : Expression {}
public class ConstantExpression : Expression {}
public class NewArrayExpression : Expression {}
public class NewExpression : Expression {}
public class MethodCallExpression : Expression {}
}
namespace System.Runtime.CompilerServices
{
public sealed class InlineArrayAttribute : Attribute
{
public InlineArrayAttribute(int length)
{
}
}
}
""";
var comp = CreateEmptyCompilation(source, options: TestOptions.ReleaseDll.WithAllowUnsafe(true));
comp.VerifyEmitDiagnostics(
// warning CS8021: No value for RuntimeMetadataVersion found. No assembly containing System.Object was found nor was a value for RuntimeMetadataVersion specified through options.
Diagnostic(ErrorCode.WRN_NoRuntimeMetadataVersion).WithLocation(1, 1)
);
}