diff --git a/src/Analyzers/CSharp/Tests/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs b/src/Analyzers/CSharp/Tests/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs index bf6f66a330a77..af603723f36cd 100644 --- a/src/Analyzers/CSharp/Tests/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs +++ b/src/Analyzers/CSharp/Tests/RemoveUnusedParametersAndValues/RemoveUnusedValueAssignmentTests.cs @@ -9369,6 +9369,29 @@ private static void M(ref int destinationIndex, S buffer) ReferenceAssemblies = ReferenceAssemblies.Net.Net80, }.RunAsync(); + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/81554")] + public Task TestWriteIntoExtensionRefReceiver() + => new VerifyCS.Test + { + TestCode = """ + public static class E + { + extension(ref double number) + { + public void M(double max) + { + number = max; + } + } + } + """, + LanguageVersion = LanguageVersion.CSharp14, + Options = + { + { CSharpCodeStyleOptions.UnusedValueAssignment, UnusedValuePreference.DiscardVariable, NotificationOption2.Suggestion }, + }, + }.RunAsync(); + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/77258")] public Task TestWriteIntoStructIndexer() => new VerifyCS.Test diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/FlowAnalysis/SymbolUsageAnalysis/SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/FlowAnalysis/SymbolUsageAnalysis/SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs index fa5d00eb49c1b..5a5b53deedcf5 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/FlowAnalysis/SymbolUsageAnalysis/SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/FlowAnalysis/SymbolUsageAnalysis/SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs @@ -120,7 +120,8 @@ public static FlowGraphAnalysisData Create( { Debug.Assert(cfg.Parent == null); - var parameters = owningSymbol.GetParameters(); + var parameters = GetParameters(owningSymbol); + return new FlowGraphAnalysisData( cfg, owningSymbol, @@ -134,6 +135,21 @@ public static FlowGraphAnalysisData Create( reachingDelegateCreationTargets: PooledDictionary>.GetInstance(), localFunctionTargetsToAccessingCfgMap: PooledDictionary.GetInstance(), lambdaTargetsToAccessingCfgMap: PooledDictionary.GetInstance()); + + static ImmutableArray GetParameters(ISymbol owningSymbol) + { + var parameters = owningSymbol.GetParameters(); +#if !ROSLYN_4_12_OR_LOWER + if (owningSymbol.ContainingSymbol is INamedTypeSymbol { IsExtension: true, ExtensionParameter: { } extensionParameter }) + { + return parameters.Add(extensionParameter); // order doesn't matter + } + + return parameters; +#else + return parameters; +#endif + } } public static FlowGraphAnalysisData Create(