SourceMemberMethodSymbol.IsMetadataVirtual should force complete declaring type when queried by a different module#84013
Open
AlekseyTs wants to merge 1 commit into
Open
SourceMemberMethodSymbol.IsMetadataVirtual should force complete declaring type when queried by a different module#84013AlekseyTs wants to merge 1 commit into
AlekseyTs wants to merge 1 commit into
Conversation
…aring type when queried by a different module Fixes dotnet#83978
Contributor
There was a problem hiding this comment.
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/IsMetadataNewSlotto accept a module context and thread that through C# compiler, EE, and tests. - Force completion in
SourceMemberMethodSymbol.IsMetadataVirtualwhen queried from a different module (unlessignoreInterfaceImplementationChangesis 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. |
333fred
approved these changes
Jun 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #83978
Microsoft Reviewers: Open in CodeFlow