Nullability analysis assert with collection expression and `Add(params)`
- Dominant language
- C#
- Stars
- 20.7k
- Forks
- 4.3k
- PR merge metrics
- PR metrics pending
Description
**Version Used**: main: https://github.com/dotnet/roslyn/commit/0ee3dc108794175b764e434baa54ab9a47214a57
**Steps to Reproduce**:
```cs
using System.Collections;
using System.Collections.Generic;
C c = [1];
class C : IEnumerable
{
public IEnumerator GetEnumerator() => throw null;
IEnumerator IEnumerable.GetEnumerator() => throw null;
public void Add(params object[] xs) { }
}
```
Note: changing `params object[]` to `params List` crashes similarly but with `Found unexpected Microsoft.CodeAnalysis.CSharp.BoundConversion` instead.
**Expected Behavior**: Compiles fine, like in `Release` mode.
**Actual Behavior**: Crashes on an assert in `Debug` mode:
```
System.InvalidOperationException: Found unexpected Microsoft.CodeAnalysis.CSharp.BoundArrayCreation `1` in the map.
at DotNetLab.ThrowingTraceListener.Fail(String message, String detailMessage)
at System.Diagnostics.TraceInternal.Fail(String message, String detailMessage)
at System.Diagnostics.TraceInternal.TraceProvider.Fail(String message, String detailMessage)
at System.Diagnostics.Debug.Fail(String message, String detailMessage)
at System.Diagnostics.Debug.Fail(String message)
at Roslyn.Utilities.RoslynDebug.Assert(Boolean condition, AssertInterpolatedStringHandler& message)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.VerifyExpression(BoundExpression expression, Boolean overrideSkippedExpression)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.VisitExpressionOrPatternWithoutStackGuard(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[BoundExpression](ImmutableArray`1 list)
at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitCollectionElementInitializer(BoundCollectionElementInitializer node)
at Microsoft.CodeAnalysis.CSharp.BoundCollectionElementInitializer.Accept(BoundTreeVisitor visitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.VisitExpressionOrPatternWithoutStackGuard(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.VisitCollectionExpression(BoundCollectionExpression node)
at Microsoft.CodeAnalysis.CSharp.BoundCollectionExpression.Accept(BoundTreeVisitor visitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.VisitExpressionOrPatternWithoutStackGuard(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitConversion(BoundConversion node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.VisitConversion(BoundConversion node)
at Microsoft.CodeAnalysis.CSharp.BoundConversion.Accept(BoundTreeVisitor visitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.VisitExpressionOrPatternWithoutStackGuard(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitLocalDeclaration(BoundLocalDeclaration node)
at Microsoft.CodeAnalysis.CSharp.BoundLocalDeclaration.Accept(BoundTreeVisitor visitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitList[BoundStatement](ImmutableArray`1 list)
at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitBlock(BoundBlock node)
at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.BoundTreeWalker.VisitNonConstructorMethodBody(BoundNonConstructorMethodBody node)
at Microsoft.CodeAnalysis.CSharp.BoundNonConstructorMethodBody.Accept(BoundTreeVisitor visitor)
at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.Visit(BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.DebugVerifier.Verify(ImmutableDictionary`2 analyzedNullabilityMap, SnapshotManager snapshotManagerOpt, BoundNode node)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.AnalyzeWithSemanticInfo(CSharpCompilation compilation, Symbol symbol, BoundNode node, Binder binder, VariableState initialState, DiagnosticBag diagnostics, Boolean createSnapshots, Boolean requiresAnalysis)
at Microsoft.CodeAnalysis.CSharp.NullableWalker.AnalyzeAndRewrite(CSharpCompilation compilation, Symbol symbol, BoundNode node, Binder binder, VariableState initialState, DiagnosticBag diagnostics, Boolean createSnapshots, SnapshotManager& snapshotManager, ImmutableDictionary`2& remappedSymbols)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.BindMethodBody(MethodSymbol method, TypeCompilationState compilationState, BindingDiagnosticBag diagnostics, Boolean includeInitializersInBody, BoundNode initializersBody, Boolean reportNullableDiagnostics, ImportChain& importChain, Boolean& originalBodyNested, Boolean& prependedDefaultValueTypeConstructorInitializer, InitialState& forSemanticModel)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.VisitNamedType(NamedTypeSymbol symbol, TypeCompilationState arg)
at Microsoft.CodeAnalysis.CSharp.Symbols.NamedTypeSymbol.Accept[TypeCompilationState,Object](CSharpSymbolVisitor`2 visitor, TypeCompilationState argument)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamespace(NamespaceSymbol symbol)
at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethodBodies(CSharpCompilation compilation, PEModuleBuilder moduleBeingBuiltOpt, Boolean emittingPdb, Boolean hasDeclarationErrors, Boolean emitMethodBodies, BindingDiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, RebuildData rebuildData, CompilationTestData testData, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, RebuildData rebuildData, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, CancellationToken cancellationToken)
at DotNetLab.Compiler.g__getEmitDiagnostics|6_17(CSharpCompilation compilation)
at DotNetLab.Compiler.CompileNoCache(CompilationInput compilationInput, ImmutableDictionary`2 assemblies, ImmutableDictionary`2 builtInAssemblies, AssemblyLoadContext alc)
at DotNetLab.Compiler.Compile(CompilationInput input, ImmutableDictionary`2 assemblies, ImmutableDictionary`2 builtInAssemblies, AssemblyLoadContext alc)
at DotNetLab.Lab.CompilerProxy.CompileAsync(CompilationInput input)
```
Contributor guide
Assessment
This issue has not been assessed yet.