Skip to content

NullReferenceException when using switch expression with CSharpScript #49529

@haacked

Description

@haacked

Version Used: Microsoft.CodeAnalysis.CSharp.Scripting 3.8.0.0

Steps to Reproduce:

  1. Use CSharpScript to create a script that contains a switch expression (see Unit test below for a full demo).
  2. Attempt to call Compile or RunAsync on the Script.

Expected Behavior:
It works

Actual Behavior:
It fails

Here's a failing unit test that should pass. It demonstrates the problem.

[Fact]
public async Task RoslynCrashTest()
{
    var options = ScriptOptions.Default
        .WithLanguageVersion(LanguageVersion.CSharp8);
    var code = @"
using System;
var reply = Arguments switch {
    null => ""Arguments are null"",
    """" => ""Arguments are empty"",
    _ => Arguments
};

return reply;
";
    
    var script = CSharpScript.Create<string>(code, options, typeof(ScriptGlobals));
    var compilation = script.Compile();
    var result = await script.RunAsync(new ScriptGlobals {Arguments = typeof(CSharpScript).AssemblyQualifiedName});
    Assert.Equal(
        "Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript, Microsoft.CodeAnalysis.CSharp.Scripting, Version=3.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35",
        result.ReturnValue);
}

public class ScriptGlobals
{
    public string Arguments { get; set; }
}

The script.Compile(); call throws an AggregateException. The inner exception is a NullReferenceException.

The stack trace for the NullReferenceException is

Details at Microsoft.CodeAnalysis.CSharp.Binder.BindSwitchExpression(SwitchExpressionSyntax node, DiagnosticBag diagnostics) at Microsoft.CodeAnalysis.CSharp.Binder.BindExpressionInternal(ExpressionSyntax node, DiagnosticBag diagnostics, Boolean invoked, Boolean indexed) at Microsoft.CodeAnalysis.CSharp.Binder.BindExpression(ExpressionSyntax node, DiagnosticBag diagnostics, Boolean invoked, Boolean indexed) at Microsoft.CodeAnalysis.CSharp.Binder.BindValue(ExpressionSyntax node, DiagnosticBag diagnostics, BindValueKind valueKind) at Microsoft.CodeAnalysis.CSharp.Binder.BindInferredVariableInitializer(DiagnosticBag diagnostics, ExpressionSyntax initializer, BindValueKind valueKind, RefKind refKind, CSharpSyntaxNode errorSyntax) at Microsoft.CodeAnalysis.CSharp.Binder.BindInferredVariableInitializer(DiagnosticBag diagnostics, RefKind refKind, EqualsValueClauseSyntax initializer, CSharpSyntaxNode errorSyntax) at Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberFieldSymbolFromDeclarator.GetFieldType(ConsList`1 fieldsBeingBound) at Microsoft.CodeAnalysis.CSharp.Symbols.FieldSymbol.get_TypeWithAnnotations() at Microsoft.CodeAnalysis.CSharp.Symbols.FieldSymbol.get_Type() at Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberFieldSymbolFromDeclarator.AfterAddingTypeMembersChecks(ConversionsBase conversions, DiagnosticBag diagnostics) at Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberContainerTypeSymbol.CheckSpecialMemberErrors(DiagnosticBag diagnostics) at Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberContainerTypeSymbol.AfterMembersChecks(DiagnosticBag diagnostics) at Microsoft.CodeAnalysis.CSharp.Symbols.SourceMemberContainerTypeSymbol.ForceComplete(SourceLocation locationOpt, CancellationToken cancellationToken) at Microsoft.CodeAnalysis.CSharp.Symbol.ForceCompleteMemberByLocation(SourceLocation locationOpt, Symbol member, CancellationToken cancellationToken) at Microsoft.CodeAnalysis.CSharp.Symbols.SourceNamespaceSymbol.<>c__DisplayClass49_1.b__0(Int32 i) at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass6_0`1.b__0(T param) at System.Threading.Tasks.Parallel.<>c__DisplayClass19_0`1.b__1(RangeWorker& currentWorker, Int32 timeout, Boolean& replicationDelegateYieldedBeforeCompletion) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(Exception source) at System.Threading.Tasks.Parallel.<>c__DisplayClass19_0`1.b__1(RangeWorker& currentWorker, Int32 timeout, Boolean& replicationDelegateYieldedBeforeCompletion) at System.Threading.Tasks.TaskReplicator.Replica`1.ExecuteAction(Boolean& yieldedBeforeCompletion) at System.Threading.Tasks.TaskReplicator.Replica.Execute()

Metadata

Metadata

Assignees

No one assigned

    Labels

    Area-InteractiveBughelp wantedThe issue is "up for grabs" - add a comment if you are interested in working on it

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions