From 91b74550fee0a5f93293bf568e2f25966790a534 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 12 Apr 2012 21:02:37 +0200 Subject: [PATCH] implement special cases for enum type inference; closes #248 --- ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs | 13 +++++++++++++ ICSharpCode.Decompiler/Tests/TypeAnalysisTests.cs | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs index b2af46d97..9cb5523ab 100644 --- a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs +++ b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs @@ -1004,6 +1004,19 @@ namespace ICSharpCode.Decompiler.ILAst InferTypeForExpression(right, typeSystem.IntPtr); return leftPreferred; } + if (IsEnum(leftPreferred)) { + if (expectedType != null && IsEnum(expectedType)) { + // E-U=E + left.InferredType = left.ExpectedType = leftPreferred; + InferTypeForExpression(right, GetEnumUnderlyingType(leftPreferred)); + return leftPreferred; + } else { + // E-E=U + left.InferredType = left.ExpectedType = leftPreferred; + InferTypeForExpression(right, leftPreferred); + return GetEnumUnderlyingType(leftPreferred); + } + } return InferBinaryArguments(left, right, expectedType, leftPreferred: leftPreferred); } diff --git a/ICSharpCode.Decompiler/Tests/TypeAnalysisTests.cs b/ICSharpCode.Decompiler/Tests/TypeAnalysisTests.cs index 3c0ffc4b9..760bb862d 100644 --- a/ICSharpCode.Decompiler/Tests/TypeAnalysisTests.cs +++ b/ICSharpCode.Decompiler/Tests/TypeAnalysisTests.cs @@ -140,4 +140,14 @@ public class TypeAnalysisTests { return new byte[length]; } + + public StringComparison EnumDiffNumber(StringComparison data) + { + return data - 1; + } + + public int EnumDiff(StringComparison a, StringComparison b) + { + return Math.Abs(a - b); + } }