Version Used: Microsoft.CodeAnalysis.CSharp.Scripting 3.8.0.0
Steps to Reproduce:
- Use
CSharpScript to create a script that contains a switch expression (see Unit test below for a full demo).
- 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()
Version Used:
Microsoft.CodeAnalysis.CSharp.Scripting3.8.0.0Steps to Reproduce:
CSharpScriptto create a script that contains a switch expression (see Unit test below for a full demo).CompileorRunAsyncon theScript.Expected Behavior:
It works
Actual Behavior:
It fails
Here's a failing unit test that should pass. It demonstrates the problem.
The
script.Compile();call throws anAggregateException. The inner exception is aNullReferenceException.The stack trace for the
NullReferenceExceptionisDetails
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()