Skip to content

SourceMemberMethodSymbol.IsMetadataVirtual should force complete declaring type when queried by a different module#84013

Open
AlekseyTs wants to merge 1 commit into
dotnet:mainfrom
AlekseyTs:Issue83978
Open

SourceMemberMethodSymbol.IsMetadataVirtual should force complete declaring type when queried by a different module#84013
AlekseyTs wants to merge 1 commit into
dotnet:mainfrom
AlekseyTs:Issue83978

Conversation

@AlekseyTs
Copy link
Copy Markdown
Contributor

@AlekseyTs AlekseyTs commented Jun 4, 2026

Fixes #83978

Microsoft Reviewers: Open in CodeFlow

…aring type when queried by a different module

Fixes dotnet#83978
Copilot AI review requested due to automatic review settings June 4, 2026 14:12
@AlekseyTs AlekseyTs requested a review from a team as a code owner June 4, 2026 14:12
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR makes C# compiler “metadata virtual/newslot” queries context-aware (by passing the asking ModuleSymbol) so that querying a SourceMemberMethodSymbol from a different module can force completion first, preventing state corruption/assertions seen with compilation references (Fixes #83978).

Changes:

  • Update MethodSymbol.IsMetadataVirtual/IsMetadataNewSlot to accept a module context and thread that through C# compiler, EE, and tests.
  • Force completion in SourceMemberMethodSymbol.IsMetadataVirtual when queried from a different module (unless ignoreInterfaceImplementationChanges is used).
  • Add a regression test for #83978 and update helper/test-call sites accordingly (plus VB mechanical signature updates for IsMetadataNewSlot).

Reviewed changes

Copilot reviewed 66 out of 66 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/SynthesizedContextMethodSymbol.cs Update overrides for context-aware IsMetadataVirtual/IsMetadataNewSlot.
src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/PlaceholderMethodSymbol.cs Update overrides for context-aware IsMetadataVirtual/IsMetadataNewSlot.
src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/EEMethodSymbol.cs Update overrides for context-aware IsMetadataVirtual/IsMetadataNewSlot.
src/Compilers/VisualBasic/Portable/Symbols/Wrapped/WrappedMethodSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/SynthesizedSymbols/SynthesizedIntrinsicOperatorSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/SubstitutedMethodSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/Source/SynthesizedEntryPointSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/Source/SourceNamedTypeSymbol_ComClass.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/Source/LambdaSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/SignatureOnlyMethodSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/Retargeting/RetargetingMethodSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/ReducedExtensionMethodSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/PEMethodSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Symbols/ErrorMethodSymbol.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Lowering/StateMachineRewriter/SynthesizedStateMachineMethod.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Lowering/MethodToClassRewriter/MethodToClassRewriter.MyBaseMyClassWrapper.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Lowering/LambdaRewriter/SynthesizedLambdaMethod.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Lowering/LambdaRewriter/LambdaFrameConstructor.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/VisualBasic/Portable/Emit/MethodSymbolAdapter.vb Align IMethodSymbolInternal member + IsMetadataNewSlot signature changes.
src/Compilers/VisualBasic/Portable/Binding/Binder_XmlLiterals.vb Mechanical update to IsMetadataNewSlot signature.
src/Compilers/Test/Utilities/CSharp/FunctionPointerUtilities.cs Update test calls to pass context/ignore flags explicitly.
src/Compilers/Test/Utilities/CSharp/Extensions.cs Add test extension helpers to supply default context for metadata queries.
src/Compilers/CSharp/Test/Symbol/Symbols/Source/CompletionTests.cs Add regression test for #83978.
src/Compilers/CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs Update test calls for new signature.
src/Compilers/CSharp/Portable/Symbols/Wrapped/WrappedMethodSymbol.cs Thread context/ignore flags through wrapper symbol.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedStaticConstructor.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedSealedPropertyAccessor.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedIntrinsicOperatorSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedInteractiveInitializerMethod.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedInstanceConstructor.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedImplementationMethod.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedGlobalMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedEntryPointSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedEmbeddedMemorySafetyRulesAttributeSymbol.cs Use renamed embedded-attribute property symbol helper.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedEmbeddedExtensionMarkerNameAttributeSymbol.cs Use renamed embedded-attribute property symbol helper.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedEmbeddedAttributePropertySymbol.cs Rename/adjust embedded attribute property symbol + override signatures.
src/Compilers/CSharp/Portable/Symbols/Synthesized/SynthesizedDelegateSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberMethodSymbol.cs Core fix: context-aware IsMetadataVirtual forces completion for cross-module queries.
src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol_ImplementationChecks.cs Update call sites to use new signature (ignore interface impl changes).
src/Compilers/CSharp/Portable/Symbols/Source/SourceDestructorSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Source/LocalFunctionSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Source/LambdaSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/SignatureOnlyMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/ReducedExtensionMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/OverriddenOrHiddenMembersHelpers.cs Update internal logic to use new signature (ignore interface impl changes).
src/Compilers/CSharp/Portable/Symbols/MethodSymbolExtensions.cs Update runtime-finalizer logic to use new signature (ignore interface impl changes).
src/Compilers/CSharp/Portable/Symbols/MethodSymbol.cs Update IMethodSymbolInternal implementation for renamed member.
src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PEMethodSymbol.cs Implement new overrides + helper methods for metadata-backed symbols.
src/Compilers/CSharp/Portable/Symbols/FunctionPointers/FunctionPointerMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/Extensions/SourceExtensionImplementationMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/ErrorMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/AnonymousTypes/SynthesizedSymbols/AnonymousType.ToStringMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/AnonymousTypes/SynthesizedSymbols/AnonymousType.SynthesizedMethodBase.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/AnonymousTypes/SynthesizedSymbols/AnonymousType.PropertyAccessorSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/AnonymousTypes/SynthesizedSymbols/AnonymousType.GetHashCodeMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/AnonymousTypes/SynthesizedSymbols/AnonymousType.EqualsMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Symbols/AnonymousTypes/SynthesizedSymbols/AnonymousType.ConstructorSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Lowering/SyntheticBoundNodeFactory.cs Pass module context into struct-call decision helper.
src/Compilers/CSharp/Portable/Lowering/MethodToClassRewriter.cs Pass module context into metadata-virtual checks during rewriting.
src/Compilers/CSharp/Portable/Lowering/IteratorRewriter/IteratorFinallyMethodSymbol.cs Update overrides for context-aware metadata queries.
src/Compilers/CSharp/Portable/Emitter/NoPia/EmbeddedMethod.cs Use module-being-built context when querying metadata virtual/newslot for embedded methods.
src/Compilers/CSharp/Portable/Emitter/Model/MethodSymbolAdapter.cs Define new abstract signatures + update adapter call sites/docs.
src/Compilers/CSharp/Portable/CodeGen/EmitExpression.cs Pass module context into virtual/newslot decisions and struct-call optimization.
src/Compilers/CSharp/Portable/CodeGen/EmitConversion.cs Pass module context into metadata-virtual decision for delegate creation.
src/Compilers/Core/Portable/Symbols/IMethodSymbolInternal.cs Rename internal surface to clarify “ignoring interface implementation changes” semantics.
src/Compilers/Core/Portable/Emit/EditAndContinue/DeletedPEMethodDefinition.cs Update EnC consumer to renamed IMethodSymbolInternal member.

Comment thread src/Compilers/CSharp/Portable/Emitter/Model/MethodSymbolAdapter.cs
Comment thread src/Compilers/CSharp/Portable/Emitter/NoPia/EmbeddedMethod.cs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

An assertion failure in SourceMemberMethodSymbol.Flags.EnsureMetadataVirtual()

3 participants