diff --git a/src/Analyzers/CSharp/Analysis/RefReadOnlyParameterAnalyzer.cs b/src/Analyzers/CSharp/Analysis/RefReadOnlyParameterAnalyzer.cs index 671d5643db..67201725ed 100644 --- a/src/Analyzers/CSharp/Analysis/RefReadOnlyParameterAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/RefReadOnlyParameterAnalyzer.cs @@ -272,7 +272,8 @@ public override void VisitIdentifierName(IdentifierNameSyntax node) && SymbolEqualityComparer.Default.Equals(parameterSymbol, SemanticModel.GetSymbol(node, CancellationToken))) { if (_localFunctionDepth > 0 - || _anonymousFunctionDepth > 0) + || _anonymousFunctionDepth > 0 + || node.IsInExpressionTree(SemanticModel, CancellationToken)) { Parameters.Remove(name); } diff --git a/src/Tests/Analyzers.Tests/RCS1231MakeParameterRefReadOnlyTests.cs b/src/Tests/Analyzers.Tests/RCS1231MakeParameterRefReadOnlyTests.cs index 4c32619e30..80404a0f39 100644 --- a/src/Tests/Analyzers.Tests/RCS1231MakeParameterRefReadOnlyTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1231MakeParameterRefReadOnlyTests.cs @@ -177,6 +177,29 @@ void M(bool value) { } } +"); + } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.MakeParameterRefReadOnly)] + public async Task TestNoDiagnostic_ExpressionTree() + { + await VerifyNoDiagnosticAsync(@" +using System; +using System.Linq; + +class C +{ + public void M(DateTime dt) + { + var items = default(IQueryable); + + var x = from item in items + where item.P <= dt + select item; + } + + public DateTime P { get; set; } +} "); } }