diff --git a/src/Analyzers/CSharp/Analyzers/UsePatternCombinators/CSharpUsePatternCombinatorsAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/UsePatternCombinators/CSharpUsePatternCombinatorsAnalyzer.cs index 0fc5ec3a5e484..e8afa1654b21b 100644 --- a/src/Analyzers/CSharp/Analyzers/UsePatternCombinators/CSharpUsePatternCombinatorsAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/UsePatternCombinators/CSharpUsePatternCombinatorsAnalyzer.cs @@ -159,7 +159,7 @@ public static BinaryOperatorKind Flip(BinaryOperatorKind operatorKind) private static bool IsConstant(IOperation operation) { // By-design, constants will not propagate to conversions. - return operation is IConversionOperation op + return operation is IConversionOperation { Conversion.IsUserDefined: false } op ? IsConstant(op.Operand) : operation.ConstantValue.HasValue; } diff --git a/src/Features/CSharpTest/UsePatternCombinators/CSharpUsePatternCombinatorsDiagnosticAnalyzerTests.cs b/src/Features/CSharpTest/UsePatternCombinators/CSharpUsePatternCombinatorsDiagnosticAnalyzerTests.cs index e415d3e041c98..10aca277a0933 100644 --- a/src/Features/CSharpTest/UsePatternCombinators/CSharpUsePatternCombinatorsDiagnosticAnalyzerTests.cs +++ b/src/Features/CSharpTest/UsePatternCombinators/CSharpUsePatternCombinatorsDiagnosticAnalyzerTests.cs @@ -258,6 +258,30 @@ bool M1(int v) """); } + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/66787")] + public async Task TestConvertedConstants() + { + await TestAllAsync( + """ + class C + { + bool M(long l) + { + return {|FixAllInDocument:(l > int.MaxValue || l < int.MinValue)|}; + } + } + """, + """ + class C + { + bool M(long l) + { + return (l is > int.MaxValue or < int.MinValue); + } + } + """); + } + [Fact] public async Task TestMissingInExpressionTree() { @@ -397,6 +421,42 @@ private static bool IsS(char[] ch, int count) }}"); } + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/66787")] + public async Task TestMissingForImplicitUserDefinedCasts1() + { + await TestMissingAsync( + """ + using System; + class C + { + void M0(Int128 i) + { + if (i == int.MaxValue [||] i == int.MinValue) + { + } + } + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/66787")] + public async Task TestMissingForImplicitUserDefinedCasts2() + { + await TestMissingAsync( + """ + using System; + class C + { + void M0(Int128 i) + { + if (i > int.MaxValue [||] i < int.MinValue) + { + } + } + } + """); + } + [Fact] public async Task TestOnSideEffects1() { diff --git a/src/Features/Core/Portable/ConvertIfToSwitch/AbstractConvertIfToSwitchCodeRefactoringProvider.Analyzer.cs b/src/Features/Core/Portable/ConvertIfToSwitch/AbstractConvertIfToSwitchCodeRefactoringProvider.Analyzer.cs index 96f06ca0432d4..2f738b5682ccd 100644 --- a/src/Features/Core/Portable/ConvertIfToSwitch/AbstractConvertIfToSwitchCodeRefactoringProvider.Analyzer.cs +++ b/src/Features/Core/Portable/ConvertIfToSwitch/AbstractConvertIfToSwitchCodeRefactoringProvider.Analyzer.cs @@ -434,7 +434,7 @@ private static bool IsRelationalOperator(BinaryOperatorKind operatorKind) private static bool IsConstant(IOperation operation) { // Constants do not propagate to conversions - return operation is IConversionOperation op + return operation is IConversionOperation { Conversion.IsUserDefined: false } op ? IsConstant(op.Operand) : operation.ConstantValue.HasValue; }