From d985a2ada08df9617364def8326b9c81f1d05f98 Mon Sep 17 00:00:00 2001 From: Noah Stolk Date: Sat, 1 Aug 2026 19:43:15 +0200 Subject: [PATCH 1/3] Fix RCS1118 to not report local variable passed as 'in' argument --- .../MarkLocalVariableAsConstWalker.cs | 11 ++++++ .../RCS1118MarkLocalVariableAsConstTests.cs | 36 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/Analyzers/CSharp/Analysis/MarkLocalVariableAsConst/MarkLocalVariableAsConstWalker.cs b/src/Analyzers/CSharp/Analysis/MarkLocalVariableAsConst/MarkLocalVariableAsConstWalker.cs index ff3b34df15..8ef6f53e6d 100644 --- a/src/Analyzers/CSharp/Analysis/MarkLocalVariableAsConst/MarkLocalVariableAsConstWalker.cs +++ b/src/Analyzers/CSharp/Analysis/MarkLocalVariableAsConst/MarkLocalVariableAsConstWalker.cs @@ -33,6 +33,17 @@ public override void VisitAssignedExpression(ExpressionSyntax expression) Result = true; } + public override void VisitArgument(ArgumentSyntax node) + { + if (node.RefKindKeyword.IsKind(SyntaxKind.InKeyword) + && IsLocalReference(node.Expression)) + { + Result = true; + } + + base.VisitArgument(node); + } + public override void VisitIdentifierName(IdentifierNameSyntax node) { if (node.IsParentKind(SyntaxKind.SimpleMemberAccessExpression, SyntaxKind.AddressOfExpression) diff --git a/src/Tests/Analyzers.Tests/RCS1118MarkLocalVariableAsConstTests.cs b/src/Tests/Analyzers.Tests/RCS1118MarkLocalVariableAsConstTests.cs index a4f8ca703f..1f7af076a3 100644 --- a/src/Tests/Analyzers.Tests/RCS1118MarkLocalVariableAsConstTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1118MarkLocalVariableAsConstTests.cs @@ -120,6 +120,42 @@ public static int Bar(this ref int p1, int p2) { return p1 + p2; } +}"); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.MarkLocalVariableAsConst)] + public async Task TestNoDiagnostic_InArgument() + { + await VerifyNoDiagnosticAsync(@" +public static class C +{ + static void Foo() + { + int x = 0; + Bar(in x); + } + + public static void Bar(in int p) + { + } +}"); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.MarkLocalVariableAsConst)] + public async Task TestNoDiagnostic_InArgument_RefReadOnlyParameter() + { + await VerifyNoDiagnosticAsync(@" +public static class C +{ + static void Foo() + { + int x = 0; + Bar(in x); + } + + public static void Bar(ref readonly int p) + { + } }"); } } From a89f88b1724de36ceadccf8e080e8c12419b0a7c Mon Sep 17 00:00:00 2001 From: Noah Stolk Date: Sat, 1 Aug 2026 21:14:23 +0200 Subject: [PATCH 2/3] Add test for local variable passed to 'in' parameter without keyword --- .../RCS1118MarkLocalVariableAsConstTests.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/Tests/Analyzers.Tests/RCS1118MarkLocalVariableAsConstTests.cs b/src/Tests/Analyzers.Tests/RCS1118MarkLocalVariableAsConstTests.cs index 1f7af076a3..16220d5bcc 100644 --- a/src/Tests/Analyzers.Tests/RCS1118MarkLocalVariableAsConstTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1118MarkLocalVariableAsConstTests.cs @@ -156,6 +156,36 @@ static void Foo() public static void Bar(ref readonly int p) { } +}"); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.MarkLocalVariableAsConst)] + public async Task Test_InParameter_WithoutInKeyword() + { + await VerifyDiagnosticAndFixAsync(@" +public static class C +{ + static void Foo() + { + [|int|] x = 0; + Bar(x); + } + + public static void Bar(in int p) + { + } +}", @" +public static class C +{ + static void Foo() + { + const int x = 0; + Bar(x); + } + + public static void Bar(in int p) + { + } }"); } } From b48266926e96eda66b97db405809aeb9262019db Mon Sep 17 00:00:00 2001 From: Noah Stolk Date: Sat, 1 Aug 2026 21:14:48 +0200 Subject: [PATCH 3/3] Update ChangeLog.md --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index 6df918b2c2..f078248b7b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fix analyzer [RCS1118](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1118) to not report local variable passed as 'in' argument ([PR](https://github.com/dotnet/roslynator/pull/1782) by @NoahStolk) - Fix analyzer [RCS1074](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1074) ([PR](https://github.com/dotnet/roslynator/pull/1768) by @cbersch) - Fix enum contained flags check for partial matches in [RCS1258](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1258) ([PR](https://github.com/dotnet/roslynator/pull/1740) by @ovska) - Fix analyzer [RCS1146](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS1146) ([PR](https://github.com/dotnet/roslynator/pull/1747))