diff --git a/ICSharpCode.Decompiler/Ast/Transforms/AddCheckedBlocks.cs b/ICSharpCode.Decompiler/Ast/Transforms/AddCheckedBlocks.cs index 21638c0b4..ade17ffc0 100644 --- a/ICSharpCode.Decompiler/Ast/Transforms/AddCheckedBlocks.cs +++ b/ICSharpCode.Decompiler/Ast/Transforms/AddCheckedBlocks.cs @@ -339,7 +339,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms result.NodesToInsertInCheckedContext = result.NodesToInsertInUncheckedContext + new ConvertCompoundAssignment(expr, false); } } - } else { + } else if (expr.Role.IsValid(Expression.Null)) { // We use '<' so that expressions are introduced on the deepest level possible (goal 3) if (result.CostInCheckedContext + new Cost(0, 1) < result.CostInUncheckedContext) { result.CostInUncheckedContext = result.CostInCheckedContext + new Cost(0, 1); diff --git a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs index 967a3e338..de7d2be9a 100644 --- a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs +++ b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs @@ -916,14 +916,12 @@ namespace ICSharpCode.Decompiler.ILAst } GenericParameter gp = type as GenericParameter; if (gp != null) { - if (gp.Owner.GenericParameterType == GenericParameterType.Method) { + if (member.DeclaringType is ArrayType) { + return ((ArrayType)member.DeclaringType).ElementType; + } else if (gp.Owner.GenericParameterType == GenericParameterType.Method) { return ((GenericInstanceMethod)member).GenericArguments[gp.Position]; - } else { - if (member.DeclaringType is ArrayType) { - return ((ArrayType)member.DeclaringType).ElementType; - } else { - return ((GenericInstanceType)member.DeclaringType).GenericArguments[gp.Position]; - } + } else { + return ((GenericInstanceType)member.DeclaringType).GenericArguments[gp.Position]; } } return type; diff --git a/ICSharpCode.Decompiler/Tests/CheckedUnchecked.cs b/ICSharpCode.Decompiler/Tests/CheckedUnchecked.cs index 08c5b39a3..fd1c4d89f 100644 --- a/ICSharpCode.Decompiler/Tests/CheckedUnchecked.cs +++ b/ICSharpCode.Decompiler/Tests/CheckedUnchecked.cs @@ -16,6 +16,8 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. +using System; + public class CheckedUnchecked { public int Operators(int a, int b) @@ -63,4 +65,53 @@ public class CheckedUnchecked } } } + public void ObjectCreationInitializerChecked() + { + this.TestHelp(new + { + x = 0, + l = 0 + }, n => checked(new + { + x = n.x + 1, + l = n.l + 1 + })); + } + + public void ObjectCreationWithOneFieldChecked() + { + this.TestHelp(new + { + x = 0, + l = 0 + }, n => new + { + x = checked(n.x + 1), + l = n.l + 1 + }); + } + + + public void ArrayInitializerChecked() + { + this.TestHelp(new int[] + { + 1, + 2 + }, (int[] n) => checked(new int[] + { + n[0] + 1, + n[1] + 1 + })); + } + + public T TestHelp(T t, Func f) + { + return f(t); + } + + public void CheckedInArrayCreationArgument(int a, int b) + { + Console.WriteLine(new int[checked(a + b)]); + } } diff --git a/ICSharpCode.Decompiler/Tests/Generics.cs b/ICSharpCode.Decompiler/Tests/Generics.cs index 9b7bd3fea..5adb934c6 100644 --- a/ICSharpCode.Decompiler/Tests/Generics.cs +++ b/ICSharpCode.Decompiler/Tests/Generics.cs @@ -97,6 +97,11 @@ public static class Generics { } + private static void MultidimensionalArray(T[,] array) + { + array[0, 0] = array[0, 1]; + } + public static Dictionary.KeyCollection.Enumerator GetEnumerator(Dictionary d, Generics.MyArray.NestedClass nc) { // Tests references to inner classes in generic classes