Browse Source

Fix #3322: Add missing checks for equality comparison

pull/3403/head
Siegfried Pammer 4 months ago
parent
commit
2c419f68cf
  1. 1
      ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj
  2. 6
      ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs
  3. 18
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/Comparisons.cs
  4. 5
      ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs

1
ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj

@ -130,6 +130,7 @@ @@ -130,6 +130,7 @@
<Compile Include="ProjectDecompiler\TargetFrameworkTests.cs" />
<Compile Include="TestAssemblyResolver.cs" />
<Compile Include="TestCases\ILPretty\MonoFixed.cs" />
<Compile Include="TestCases\Pretty\Comparisons.cs" />
<None Include="TestCases\VBPretty\VBAutomaticEvents.vb" />
<Compile Include="TestCases\VBPretty\VBAutomaticEvents.cs" />
<Compile Include="TestCases\VBPretty\VBNonGenericForEach.cs" />

6
ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs

@ -586,6 +586,12 @@ namespace ICSharpCode.Decompiler.Tests @@ -586,6 +586,12 @@ namespace ICSharpCode.Decompiler.Tests
await RunForLibrary(cscOptions: cscOptions);
}
[Test]
public async Task Comparisons([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions)
{
await RunForLibrary(cscOptions: cscOptions);
}
[Test]
public async Task ConstantsTests([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions)
{

18
ICSharpCode.Decompiler.Tests/TestCases/Pretty/Comparisons.cs

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
public class Comparisons
{
private class A
{
}
private class B
{
}
private bool CompareUnrelatedNeedsCast(A a, B b)
{
return (object)a == b;
}
}
}

5
ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs

@ -805,7 +805,10 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver @@ -805,7 +805,10 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
}
if (op == BinaryOperatorType.Equality || op == BinaryOperatorType.InEquality)
{
if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true)
if (lhsType.IsReferenceType == true && rhsType.IsReferenceType == true
&& (conversions.IdentityConversion(lhsType, rhsType)
|| conversions.ExplicitConversion(lhsType, rhsType).IsReferenceConversion
|| conversions.ExplicitConversion(rhsType, lhsType).IsReferenceConversion))
{
// If it's a reference comparison
if (op == BinaryOperatorType.Equality)

Loading…
Cancel
Save