Skip to content

Compiler crash in EnC with switch expressions #37047

@ivanbasov

Description

@ivanbasov

In #37025, I have added OutVar_InSwitchExpression to
src/Compilers/CSharp/Test/Emit/Emit/EditAndContinue/EditAndContinueTests.cs

It raises the following crash:

Microsoft.CodeAnalysis.CSharp.EditAndContinue.UnitTests.EditAndContinueTests.OutVar_InSwitchExpression FAILED:
	Exception type: 'System.ArgumentException', number: '0', parent: '-1'
	Exception message:
An item with the same key has already been added.
	Exception stacktrace
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
   at Microsoft.CodeAnalysis.Emit.EncVariableSlotAllocator..ctor(SymbolMatcher symbolMap, Func`2 syntaxMapOpt, IMethodSymbolInternal previousTopLevelMethod, DebugId methodId, ImmutableArray`1 previousLocals, IReadOnlyDictionary`2 lambdaMapOpt, IReadOnlyDictionary`2 closureMapOpt, String stateMachineTypeNameOpt, Int32 hoistedLocalSlotCount, IReadOnlyDictionary`2 hoistedLocalSlotsOpt, Int32 awaiterCount, IReadOnlyDictionary`2 awaiterMapOpt, LambdaSyntaxFacts lambdaSyntaxFacts)
   at Microsoft.CodeAnalysis.Emit.DefinitionMap`1.TryCreateVariableSlotAllocator(EmitBaseline baseline, Compilation compilation, IMethodSymbolInternal method, IMethodSymbol topLevelMethod, DiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.Emit.PEDeltaAssemblyBuilder.TryCreateVariableSlotAllocator(MethodSymbol method, MethodSymbol topLevelMethod, DiagnosticBag diagnostics)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.LowerBodyOrInitializer(MethodSymbol method, Int32 methodOrdinal, BoundStatement body, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState, Boolean instrumentForDynamicAnalysis, DebugDocumentProvider debugDocumentProvider, ImmutableArray`1& dynamicAnalysisSpans, DiagnosticBag diagnostics, VariableSlotAllocator& lazyVariableSlotAllocator, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 closureDebugInfoBuilder, StateMachineTypeSymbol& stateMachineTypeOpt)
   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[TArgument,TResult](CSharpSymbolVisitor`2 visitor, TArgument argument)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamespace(NamespaceSymbol symbol)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethodBodies(CSharpCompilation compilation, PEModuleBuilder moduleBeingBuiltOpt, Boolean emittingPdb, Boolean emitTestCoverageData, Boolean hasDeclarationErrors, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, Boolean emitMetadataOnly, Boolean emitTestCoverageData, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Compilation.Compile(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.CSharp.Emit.EmitHelpers.EmitDifference(CSharpCompilation compilation, EmitBaseline baseline, IEnumerable`1 edits, Func`2 isAddedSymbol, Stream metadataStream, Stream ilStream, Stream pdbStream, ICollection`1 updatedMethods, CompilationTestData testData, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.EmitDifference(EmitBaseline baseline, IEnumerable`1 edits, Func`2 isAddedSymbol, Stream metadataStream, Stream ilStream, Stream pdbStream, ICollection`1 updatedMethods, CompilationTestData testData, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Test.Utilities.CompilationExtensions.EmitDifference(Compilation compilation, EmitBaseline baseline, ImmutableArray`1 edits, IEnumerable`1 allAddedSymbols, CompilationTestData testData)
   at Microsoft.CodeAnalysis.CSharp.EditAndContinue.UnitTests.EditAndContinueTests.OutVar_InSwitchExpression()

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions