roslyn icon indicating copy to clipboard operation
roslyn copied to clipboard

.NET 9 `Preview.5`, `Preview.6`, `Preview.7` C# compiler crashes on LINQ expression with string interpolation

Open SergeiPavlov opened this issue 1 year ago • 7 comments

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)

SergeiPavlov avatar Jun 26 '24 04:06 SergeiPavlov

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.

bernd5 avatar Jun 26 '24 08:06 bernd5

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.

AlekseyTs avatar Jun 26 '24 12:06 AlekseyTs

@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?

AlekseyTs avatar Jun 26 '24 12:06 AlekseyTs

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#

bernd5 avatar Jun 26 '24 12:06 bernd5

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.

AlekseyTs avatar Jun 26 '24 13:06 AlekseyTs

Other parts of LocalRewriter that utilize similar approach could be vulnerable too.

AlekseyTs avatar Jun 26 '24 13:06 AlekseyTs

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

AlekseyTs avatar Jun 26 '24 13:06 AlekseyTs

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

AlekseyTs avatar Jul 03 '24 14:07 AlekseyTs

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)
                );
        }

AlekseyTs avatar Jul 03 '24 14:07 AlekseyTs