diff --git a/ChangeLog.md b/ChangeLog.md index c889f8fea5..516275e07c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- 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) + ## [4.15.0] - 2025-12-14 ### Added diff --git a/src/Analyzers/CSharp/Analysis/UnnecessaryEnumFlagAnalyzer.cs b/src/Analyzers/CSharp/Analysis/UnnecessaryEnumFlagAnalyzer.cs index fe10d18ecb..a71c65d8bc 100644 --- a/src/Analyzers/CSharp/Analysis/UnnecessaryEnumFlagAnalyzer.cs +++ b/src/Analyzers/CSharp/Analysis/UnnecessaryEnumFlagAnalyzer.cs @@ -62,8 +62,9 @@ private static void AnalyzeBitwiseOrExpression(SyntaxNodeAnalysisContext context for (int i = values.Count - 1; i >= 0; i--) { (ExpressionSyntax expression2, ulong value2) = values[i]; + ulong sharedBits = value & value2; - if ((value & value2) != 0) + if (sharedBits == value2 || sharedBits == value) { if (value <= value2) { diff --git a/src/Tests/Analyzers.Tests/RCS1258UnnecessaryEnumFlagTests.cs b/src/Tests/Analyzers.Tests/RCS1258UnnecessaryEnumFlagTests.cs index 3c9b5c8dad..081f921d48 100644 --- a/src/Tests/Analyzers.Tests/RCS1258UnnecessaryEnumFlagTests.cs +++ b/src/Tests/Analyzers.Tests/RCS1258UnnecessaryEnumFlagTests.cs @@ -79,4 +79,28 @@ void M() } "); } + + [Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.UnnecessaryEnumFlag)] + public async Task TestNoDiagnostic_PartiallySame() + { + await VerifyNoDiagnosticAsync( + @" +[System.Flags] +enum FooBar +{ + Shared = 1, + Foo = Shared | 2, + Bar = Shared | 4, +} + +class C +{ + public static bool M(FooBar x) + { + return x == (FooBar.Foo | FooBar.Bar); + } +} +" + ); + } }