diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Correctness/DynamicTests.cs b/ICSharpCode.Decompiler.Tests/TestCases/Correctness/DynamicTests.cs index daec209e77..5c74109563 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Correctness/DynamicTests.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Correctness/DynamicTests.cs @@ -24,6 +24,10 @@ static void Main(string[] args) PrintResult((ref dynamic x) => x = x / 2.0, 5); PrintResult((ref dynamic x) => x = x / 2, 5.0); PrintResult((ref dynamic x) => x = x / 2, 5); + PrintResult((ref dynamic x) => x = ~x, 5); + PrintResult((ref dynamic x) => x = -x, 5); + PrintResult((ref dynamic x) => x = +x, 5); + PrintResult((ref dynamic x) => x = !x, true); } private static void PrintResult(RefAction p, dynamic arg) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs index 6195401570..39a809f48a 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs @@ -310,6 +310,23 @@ private static void UncheckedArithmeticBinaryOperators(dynamic a, dynamic b) } } + private static void BitwiseAndShiftBinaryOperators(dynamic a, dynamic b) + { + DynamicTests.MemberAccess(a & b); + DynamicTests.MemberAccess(a & 1); + DynamicTests.MemberAccess(a & null); + DynamicTests.MemberAccess(a | b); + DynamicTests.MemberAccess(a | 1); + DynamicTests.MemberAccess(a | null); + DynamicTests.MemberAccess(a ^ b); + DynamicTests.MemberAccess(a ^ 1); + DynamicTests.MemberAccess(a ^ null); + DynamicTests.MemberAccess(a << b); + DynamicTests.MemberAccess(a << 1); + DynamicTests.MemberAccess(a >> b); + DynamicTests.MemberAccess(a >> 1); + } + private static void RelationalOperators(dynamic a, dynamic b) { DynamicTests.MemberAccess(a == b); @@ -369,6 +386,12 @@ private static void CompoundAssignment(dynamic a, dynamic b) a.Setter2 -= b; a.Setter2 *= b; a.Setter2 /= b; + a.Setter2 %= b; + a.Setter2 &= b; + a.Setter2 |= b; + a.Setter2 ^= b; + a.Setter2 <<= b; + a.Setter2 >>= b; field.Setter += 5; field.Setter -= 5; } @@ -394,6 +417,7 @@ private static void UnaryOperators(dynamic a) //++a; DynamicTests.Casts(-a); DynamicTests.Casts(+a); + DynamicTests.Casts(~a); } private static void Loops(dynamic list) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 0b6b87504f..f07420fb41 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -4540,6 +4540,8 @@ protected internal override TranslatedExpression VisitDynamicUnaryOperatorInstru return CreateUnaryOperator(UnaryOperatorType.Minus, isChecked: true); case ExpressionType.UnaryPlus: return CreateUnaryOperator(UnaryOperatorType.Plus, isChecked: inst.BinderFlags.HasFlag(CSharpBinderFlags.CheckedContext)); + case ExpressionType.OnesComplement: + return CreateUnaryOperator(UnaryOperatorType.BitNot); case ExpressionType.IsTrue: var operand = TranslateDynamicArgument(inst.Operand, inst.OperandArgumentInfo); Expression expr;