Skip to content

Generation of record equality is not resilient to missing APIs #44988

@AlekseyTs

Description

@AlekseyTs
        [Fact]
        public void Equality_22()
        {
            var source =
@"
record C
{
    int x = 0;
}
";
            var comp = CreateCompilation(source, parseOptions: TestOptions.RegularPreview, options: TestOptions.ReleaseDll);
            comp.MakeMemberMissing(WellKnownMember.System_Collections_Generic_EqualityComparer_T__get_Default);
            comp.VerifyEmitDiagnostics(
                );
        }

Observed:

Microsoft.CodeAnalysis.CSharp.UnitTests.Semantics.RecordTests.Equality_22 [FAIL]
  Microsoft.CodeAnalysis.CSharp.SyntheticBoundNodeFactory+MissingPredefinedMember : (2,1): error CS0656: Missing compiler required member 'System.Collections.Generic.EqualityComparer`1.get_Default'
  Stack Trace:
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Lowering\SyntheticBoundNodeFactory.cs(359,0): at Microsoft.CodeAnalysis.CSharp.SyntheticBoundNodeFactory.WellKnownMember(WellKnownMember wm, Boolean isOptional)
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Lowering\SyntheticBoundNodeFactory.cs(374,0): at Microsoft.CodeAnalysis.CSharp.SyntheticBoundNodeFactory.WellKnownMethod(WellKnownMember wm)
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodBodySynthesizer.Lowered.cs(316,0): at Microsoft.CodeAnalysis.CSharp.Symbols.MethodBodySynthesizer.GenerateFieldEquals(BoundExpression initialExpression, BoundExpression otherReceiver, ArrayBuilder`1 fields, SyntheticBoundNodeFactory F)
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Symbols\Synthesized\Records\SynthesizedRecordEquals.cs(241,0): at Microsoft.CodeAnalysis.CSharp.Symbols.SynthesizedRecordEquals.GenerateMethodBody(TypeCompilationState compilationState, DiagnosticBag diagnostics)
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(932,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState)
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(506,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType)
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(396,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass22_0.<CompileNamedTypeAsync>b__0()
    F:\GitHub\roslyn\src\Compilers\Core\Portable\InternalUtilities\UICultureUtilities.cs(141,0): at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass5_0.<WithCurrentUICulture>b__0()
       at System.Threading.Tasks.Task.InnerInvoke()
       at System.Threading.Tasks.Task.<>c.<.cctor>b__274_0(Object obj)
       at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
    --- End of stack trace from previous location where exception was thrown ---
       at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
    --- End of stack trace from previous location where exception was thrown ---
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(311,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.WaitForWorkers()
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(155,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethodBodies(CSharpCompilation compilation, PEModuleBuilder moduleBeingBuiltOpt, Boolean emittingPdb, Boolean emitTestCoverageData, Boolean hasDeclarationErrors, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
    F:\GitHub\roslyn\src\Compilers\CSharp\Portable\Compilation\CSharpCompilation.cs(2846,0): at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, Boolean emitMetadataOnly, Boolean emitTestCoverageData, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
    F:\GitHub\roslyn\src\Compilers\Core\Portable\Compilation\Compilation.cs(2542,0): 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, CompilationTestData testData, CancellationToken cancellationToken)
    F:\GitHub\roslyn\src\Compilers\Core\Portable\Compilation\Compilation.cs(2485,0): 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)
    F:\GitHub\roslyn\src\Test\Utilities\Portable\Diagnostics\DiagnosticExtensions.cs(343,0): at Microsoft.CodeAnalysis.DiagnosticExtensions.GetEmitDiagnostics[TCompilation](TCompilation c, EmitOptions options, IEnumerable`1 manifestResources)
    F:\GitHub\roslyn\src\Test\Utilities\Portable\Diagnostics\DiagnosticExtensions.cs(332,0): at Microsoft.CodeAnalysis.DiagnosticExtensions.VerifyEmitDiagnostics[TCompilation](TCompilation c, EmitOptions options, DiagnosticDescription[] expected)
    F:\GitHub\roslyn\src\Test\Utilities\Portable\Diagnostics\DiagnosticExtensions.cs(349,0): at Microsoft.CodeAnalysis.DiagnosticExtensions.VerifyEmitDiagnostics[TCompilation](TCompilation c, DiagnosticDescription[] expected)
    F:\GitHub\roslyn\src\Compilers\CSharp\Test\Semantic\Semantics\RecordTests.cs(6468,0): at Microsoft.CodeAnalysis.CSharp.UnitTests.Semantics.RecordTests.Equality_22()

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions