using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Linq; using Microsoft.Cci; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Collections; using Microsoft.CodeAnalysis.Symbols; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp; internal sealed class OverloadResolution { internal static class BinopEasyOut { private const BinaryOperatorKind ERR = BinaryOperatorKind.Error; private const BinaryOperatorKind OBJ = BinaryOperatorKind.Object; private const BinaryOperatorKind STR = BinaryOperatorKind.String; private const BinaryOperatorKind OSC = BinaryOperatorKind.ObjectAndString; private const BinaryOperatorKind SOC = BinaryOperatorKind.StringAndObject; private const BinaryOperatorKind INT = BinaryOperatorKind.Int; private const BinaryOperatorKind UIN = BinaryOperatorKind.UInt; private const BinaryOperatorKind LNG = BinaryOperatorKind.Long; private const BinaryOperatorKind ULG = BinaryOperatorKind.ULong; private const BinaryOperatorKind NIN = BinaryOperatorKind.NInt; private const BinaryOperatorKind NUI = BinaryOperatorKind.NUInt; private const BinaryOperatorKind FLT = BinaryOperatorKind.Float; private const BinaryOperatorKind DBL = BinaryOperatorKind.Double; private const BinaryOperatorKind DEC = BinaryOperatorKind.Decimal; private const BinaryOperatorKind BOL = BinaryOperatorKind.Bool; private const BinaryOperatorKind LIN = BinaryOperatorKind.Int | BinaryOperatorKind.Lifted; private const BinaryOperatorKind LUN = BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted; private const BinaryOperatorKind LLG = BinaryOperatorKind.Long | BinaryOperatorKind.Lifted; private const BinaryOperatorKind LUL = BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted; private const BinaryOperatorKind LNI = BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted; private const BinaryOperatorKind LNU = BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted; private const BinaryOperatorKind LFL = BinaryOperatorKind.Float | BinaryOperatorKind.Lifted; private const BinaryOperatorKind LDB = BinaryOperatorKind.Double | BinaryOperatorKind.Lifted; private const BinaryOperatorKind LDC = BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted; private const BinaryOperatorKind LBL = BinaryOperatorKind.Bool | BinaryOperatorKind.Lifted; private static readonly BinaryOperatorKind[,] s_arithmetic = new BinaryOperatorKind[32, 32] { { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.Long, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Long, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted } }; private static readonly BinaryOperatorKind[,] s_addition = new BinaryOperatorKind[32, 32] { { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.StringAndObject, BinaryOperatorKind.String, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject, BinaryOperatorKind.StringAndObject }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.UInt, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.Long, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Long, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.ObjectAndString, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted } }; private static readonly BinaryOperatorKind[,] s_shift = new BinaryOperatorKind[32, 32] { { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.Error, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error } }; private static readonly BinaryOperatorKind[,] s_equality = new BinaryOperatorKind[32, 32] { { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object }, { BinaryOperatorKind.Object, BinaryOperatorKind.String, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Bool, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Bool | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.UInt, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.Long, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Long, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Float, BinaryOperatorKind.Double, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Double, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Decimal, BinaryOperatorKind.Object, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Bool | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Bool | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Float | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Double | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object }, { BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted, BinaryOperatorKind.Object, BinaryOperatorKind.Object, BinaryOperatorKind.Decimal | BinaryOperatorKind.Lifted } }; private static readonly BinaryOperatorKind[,] s_logical = new BinaryOperatorKind[32, 32] { { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Bool, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Bool | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.Long, BinaryOperatorKind.Int, BinaryOperatorKind.Int, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.NInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.Long, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.UInt, BinaryOperatorKind.ULong, BinaryOperatorKind.Long, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Long, BinaryOperatorKind.NInt, BinaryOperatorKind.NInt, BinaryOperatorKind.Long, BinaryOperatorKind.Error, BinaryOperatorKind.NInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.NUInt, BinaryOperatorKind.ULong, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Bool | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Bool | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.Int | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.UInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Long | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.ULong | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.NUInt | BinaryOperatorKind.Lifted, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error }, { BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error, BinaryOperatorKind.Error } }; private static readonly BinaryOperatorKind[][,] s_opkind = new BinaryOperatorKind[17][,] { s_arithmetic, s_addition, s_arithmetic, s_arithmetic, s_arithmetic, s_shift, s_shift, s_equality, s_equality, s_arithmetic, s_arithmetic, s_arithmetic, s_arithmetic, s_logical, s_logical, s_logical, s_shift }; public static BinaryOperatorKind OpKind(BinaryOperatorKind kind, TypeSymbol left, TypeSymbol right) { int num = left.TypeToIndex(); if (num < 0) { return BinaryOperatorKind.Error; } int num2 = right.TypeToIndex(); if (num2 < 0) { return BinaryOperatorKind.Error; } BinaryOperatorKind binaryOperatorKind = BinaryOperatorKind.Error; if (!kind.IsLogical() || (num == 15 && num2 == 15)) { binaryOperatorKind = s_opkind[kind.OperatorIndex()][num, num2]; } if (binaryOperatorKind != BinaryOperatorKind.Error) { return binaryOperatorKind | kind; } return binaryOperatorKind; } } private enum LiftingResult { NotLifted, LiftOperandsAndResult, LiftOperandsButNotResult } internal static class UnopEasyOut { private const UnaryOperatorKind ERR = UnaryOperatorKind.Error; private const UnaryOperatorKind BOL = UnaryOperatorKind.Bool; private const UnaryOperatorKind CHR = UnaryOperatorKind.Char; private const UnaryOperatorKind I08 = UnaryOperatorKind.SByte; private const UnaryOperatorKind U08 = UnaryOperatorKind.Byte; private const UnaryOperatorKind I16 = UnaryOperatorKind.Short; private const UnaryOperatorKind U16 = UnaryOperatorKind.UShort; private const UnaryOperatorKind I32 = UnaryOperatorKind.Int; private const UnaryOperatorKind U32 = UnaryOperatorKind.UInt; private const UnaryOperatorKind I64 = UnaryOperatorKind.Long; private const UnaryOperatorKind U64 = UnaryOperatorKind.ULong; private const UnaryOperatorKind NIN = UnaryOperatorKind.NInt; private const UnaryOperatorKind NUI = UnaryOperatorKind.NUInt; private const UnaryOperatorKind R32 = UnaryOperatorKind.Float; private const UnaryOperatorKind R64 = UnaryOperatorKind.Double; private const UnaryOperatorKind DEC = UnaryOperatorKind.Decimal; private const UnaryOperatorKind LBOL = UnaryOperatorKind.Bool | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LCHR = UnaryOperatorKind.Char | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LI08 = UnaryOperatorKind.SByte | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LU08 = UnaryOperatorKind.Byte | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LI16 = UnaryOperatorKind.Short | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LU16 = UnaryOperatorKind.UShort | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LI32 = UnaryOperatorKind.Int | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LU32 = UnaryOperatorKind.UInt | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LI64 = UnaryOperatorKind.Long | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LU64 = UnaryOperatorKind.ULong | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LNI = UnaryOperatorKind.NInt | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LNU = UnaryOperatorKind.NUInt | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LR32 = UnaryOperatorKind.Float | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LR64 = UnaryOperatorKind.Double | UnaryOperatorKind.Lifted; private const UnaryOperatorKind LDEC = UnaryOperatorKind.Decimal | UnaryOperatorKind.Lifted; private static readonly UnaryOperatorKind[] s_increment = new UnaryOperatorKind[32] { UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Char, UnaryOperatorKind.SByte, UnaryOperatorKind.Short, UnaryOperatorKind.Int, UnaryOperatorKind.Long, UnaryOperatorKind.Byte, UnaryOperatorKind.UShort, UnaryOperatorKind.UInt, UnaryOperatorKind.ULong, UnaryOperatorKind.NInt, UnaryOperatorKind.NUInt, UnaryOperatorKind.Float, UnaryOperatorKind.Double, UnaryOperatorKind.Decimal, UnaryOperatorKind.Error, UnaryOperatorKind.Char | UnaryOperatorKind.Lifted, UnaryOperatorKind.SByte | UnaryOperatorKind.Lifted, UnaryOperatorKind.Short | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Long | UnaryOperatorKind.Lifted, UnaryOperatorKind.Byte | UnaryOperatorKind.Lifted, UnaryOperatorKind.UShort | UnaryOperatorKind.Lifted, UnaryOperatorKind.UInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.ULong | UnaryOperatorKind.Lifted, UnaryOperatorKind.NInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.NUInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.Float | UnaryOperatorKind.Lifted, UnaryOperatorKind.Double | UnaryOperatorKind.Lifted, UnaryOperatorKind.Decimal | UnaryOperatorKind.Lifted }; private static readonly UnaryOperatorKind[] s_plus = new UnaryOperatorKind[32] { UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Long, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.UInt, UnaryOperatorKind.ULong, UnaryOperatorKind.NInt, UnaryOperatorKind.NUInt, UnaryOperatorKind.Float, UnaryOperatorKind.Double, UnaryOperatorKind.Decimal, UnaryOperatorKind.Error, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Long | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.UInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.ULong | UnaryOperatorKind.Lifted, UnaryOperatorKind.NInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.NUInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.Float | UnaryOperatorKind.Lifted, UnaryOperatorKind.Double | UnaryOperatorKind.Lifted, UnaryOperatorKind.Decimal | UnaryOperatorKind.Lifted }; private static readonly UnaryOperatorKind[] s_minus = new UnaryOperatorKind[32] { UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Long, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Long, UnaryOperatorKind.Error, UnaryOperatorKind.NInt, UnaryOperatorKind.Error, UnaryOperatorKind.Float, UnaryOperatorKind.Double, UnaryOperatorKind.Decimal, UnaryOperatorKind.Error, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Long | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Long | UnaryOperatorKind.Lifted, UnaryOperatorKind.Error, UnaryOperatorKind.NInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.Error, UnaryOperatorKind.Float | UnaryOperatorKind.Lifted, UnaryOperatorKind.Double | UnaryOperatorKind.Lifted, UnaryOperatorKind.Decimal | UnaryOperatorKind.Lifted }; private static readonly UnaryOperatorKind[] s_logicalNegation; private static readonly UnaryOperatorKind[] s_bitwiseComplement; private static readonly UnaryOperatorKind[][] s_opkind; public static UnaryOperatorKind OpKind(UnaryOperatorKind kind, TypeSymbol operand) { int num = operand.TypeToIndex(); if (num < 0) { return UnaryOperatorKind.Error; } int num2 = kind.OperatorIndex(); UnaryOperatorKind unaryOperatorKind = ((num2 < s_opkind.Length) ? s_opkind[num2][num] : UnaryOperatorKind.Error); if (unaryOperatorKind != UnaryOperatorKind.Error) { return unaryOperatorKind | kind; } return unaryOperatorKind; } static UnopEasyOut() { UnaryOperatorKind[] array = new UnaryOperatorKind[32]; array[2] = UnaryOperatorKind.Bool; array[17] = UnaryOperatorKind.Bool | UnaryOperatorKind.Lifted; s_logicalNegation = array; s_bitwiseComplement = new UnaryOperatorKind[32] { UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.Long, UnaryOperatorKind.Int, UnaryOperatorKind.Int, UnaryOperatorKind.UInt, UnaryOperatorKind.ULong, UnaryOperatorKind.NInt, UnaryOperatorKind.NUInt, UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Long | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.Int | UnaryOperatorKind.Lifted, UnaryOperatorKind.UInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.ULong | UnaryOperatorKind.Lifted, UnaryOperatorKind.NInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.NUInt | UnaryOperatorKind.Lifted, UnaryOperatorKind.Error, UnaryOperatorKind.Error, UnaryOperatorKind.Error }; s_opkind = new UnaryOperatorKind[8][] { s_increment, s_increment, s_increment, s_increment, s_plus, s_minus, s_logicalNegation, s_bitwiseComplement }; } } private class ReturnStatements : BoundTreeWalker { private readonly ArrayBuilder _returns; public ReturnStatements(ArrayBuilder returns) { _returns = returns; } public override BoundNode Visit(BoundNode node) { if (!(node is BoundExpression)) { return base.Visit(node); } return null; } protected override BoundExpression VisitExpressionWithoutStackGuard(BoundExpression node) { throw ExceptionUtilities.Unreachable("/_/src/Compilers/CSharp/Portable/Binder/Semantics/OverloadResolution/OverloadResolution.cs", 2786); } public override BoundNode VisitLocalFunctionStatement(BoundLocalFunctionStatement node) { return null; } public override BoundNode VisitReturnStatement(BoundReturnStatement node) { _returns.Add(node); return null; } } private readonly struct EffectiveParameters { internal readonly ImmutableArray ParameterTypes; internal readonly ImmutableArray ParameterRefKinds; internal EffectiveParameters(ImmutableArray types, ImmutableArray refKinds) { ParameterTypes = types; ParameterRefKinds = refKinds; } } private readonly struct ParameterMap(int[] parameters, int length) { private readonly int[] _parameters = parameters; private readonly int _length = length; public bool IsTrivial => _parameters == null; public int Length => _length; public int this[int argument] { get { if (_parameters != null) { return _parameters[argument]; } return argument; } } public ImmutableArray ToImmutableArray() { return ImmutableArrayExtensions.AsImmutableOrNull(_parameters); } } private readonly Binder _binder; private bool? _strict; private const int BetterConversionTargetRecursionLimit = 100; private CSharpCompilation Compilation => _binder.Compilation; private Conversions Conversions => _binder.Conversions; private bool Strict { get { if (_strict.HasValue) { return _strict.Value; } bool featureStrictEnabled = _binder.Compilation.FeatureStrictEnabled; _strict = featureStrictEnabled; return featureStrictEnabled; } } private void BinaryOperatorEasyOut(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result) { TypeSymbol type = left.Type; if ((object)type == null) { return; } TypeSymbol type2 = right.Type; if ((object)type2 != null && !PossiblyUnusualConstantOperation(left, right)) { BinaryOperatorKind binaryOperatorKind = BinopEasyOut.OpKind(kind, type, type2); if (binaryOperatorKind != BinaryOperatorKind.Error) { BinaryOperatorSignature signature = Compilation.builtInOperators.GetSignature(binaryOperatorKind); Conversion leftConversion = ConversionsBase.FastClassifyConversion(type, signature.LeftType); Conversion rightConversion = ConversionsBase.FastClassifyConversion(type2, signature.RightType); result.Results.Add(BinaryOperatorAnalysisResult.Applicable(signature, leftConversion, rightConversion)); } } } private static bool PossiblyUnusualConstantOperation(BoundExpression left, BoundExpression right) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Invalid comparison between Unknown and I4 //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Invalid comparison between Unknown and I4 //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Invalid comparison between Unknown and I4 if (left.ConstantValueOpt == (ConstantValue)null && right.ConstantValueOpt == (ConstantValue)null) { return false; } if (left.Type.SpecialType != right.Type.SpecialType) { return true; } if ((int)left.Type.SpecialType == 13 || (int)left.Type.SpecialType == 7 || (int)left.Type.SpecialType == 20) { return false; } return true; } public void BinaryOperatorOverloadResolution(BinaryOperatorKind kind, bool isChecked, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result, ref CompoundUseSiteInfo useSiteInfo) { BinaryOperatorOverloadResolution_EasyOut(kind, left, right, result); if (result.Results.Count <= 0) { BinaryOperatorOverloadResolution_NoEasyOut(kind, isChecked, left, right, result, ref useSiteInfo); } } internal void BinaryOperatorOverloadResolution_EasyOut(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result) { BinaryOperatorKind kind2 = kind & ~BinaryOperatorKind.Logical; BinaryOperatorEasyOut(kind2, left, right, result); } internal void BinaryOperatorOverloadResolution_NoEasyOut(BinaryOperatorKind kind, bool isChecked, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result, ref CompoundUseSiteInfo useSiteInfo) { TypeSymbol typeSymbol = left.Type?.StrippedType(); TypeSymbol typeSymbol2 = right.Type?.StrippedType(); bool flag = typeSymbol?.IsInterfaceType() ?? false; bool flag2 = typeSymbol2?.IsInterfaceType() ?? false; bool flag3 = false; if ((object)typeSymbol != null && !flag) { flag3 = GetUserDefinedOperators(kind, isChecked, typeSymbol, left, right, result.Results, ref useSiteInfo); if (!flag3) { result.Results.Clear(); } } bool flag4 = kind.IsShift(); if (!flag4 && (object)typeSymbol2 != null && !flag2 && !typeSymbol2.Equals(typeSymbol)) { ArrayBuilder instance = ArrayBuilder.GetInstance(); if (GetUserDefinedOperators(kind, isChecked, typeSymbol2, left, right, instance, ref useSiteInfo)) { flag3 = true; AddDistinctOperators(result.Results, instance); } instance.Free(); } if (!flag3) { result.Results.Clear(); PooledDictionary instance2 = PooledDictionary.GetInstance(); TypeSymbol typeSymbol3; TypeSymbol typeSymbol4; bool sourceIsInterface; bool sourceIsInterface2; if (!flag4 && ((object)typeSymbol == null || (!(typeSymbol is TypeParameterSymbol) && typeSymbol2 is TypeParameterSymbol))) { typeSymbol3 = typeSymbol2; typeSymbol4 = typeSymbol; sourceIsInterface = flag2; sourceIsInterface2 = flag; } else { typeSymbol3 = typeSymbol; typeSymbol4 = typeSymbol2; sourceIsInterface = flag; sourceIsInterface2 = flag2; } flag3 = GetUserDefinedBinaryOperatorsFromInterfaces(kind, isChecked, typeSymbol3, sourceIsInterface, left, right, ref useSiteInfo, (Dictionary)(object)instance2, result.Results); if (!flag3) { result.Results.Clear(); } if (!flag4 && (object)typeSymbol4 != null && !typeSymbol4.Equals(typeSymbol3)) { ArrayBuilder instance3 = ArrayBuilder.GetInstance(); if (GetUserDefinedBinaryOperatorsFromInterfaces(kind, isChecked, typeSymbol4, sourceIsInterface2, left, right, ref useSiteInfo, (Dictionary)(object)instance2, instance3)) { flag3 = true; AddDistinctOperators(result.Results, instance3); } instance3.Free(); } instance2.Free(); } if (!flag3) { result.Results.Clear(); GetAllBuiltInOperators(kind, isChecked, left, right, result.Results, ref useSiteInfo); } BinaryOperatorOverloadResolution(left, right, result, ref useSiteInfo); } private bool GetUserDefinedBinaryOperatorsFromInterfaces(BinaryOperatorKind kind, bool isChecked, TypeSymbol operatorSourceOpt, bool sourceIsInterface, BoundExpression left, BoundExpression right, ref CompoundUseSiteInfo useSiteInfo, Dictionary lookedInInterfaces, ArrayBuilder candidates) { if ((object)operatorSourceOpt == null) { return false; } bool flag = false; ImmutableArray immutableArray = default(ImmutableArray); TypeSymbol constrainedToTypeOpt = null; if (sourceIsInterface) { if (!lookedInInterfaces.TryGetValue(operatorSourceOpt, out var _)) { ArrayBuilder instance = ArrayBuilder.GetInstance(); GetUserDefinedBinaryOperatorsFromType(constrainedToTypeOpt, (NamedTypeSymbol)operatorSourceOpt, kind, isChecked, instance); flag = CandidateOperators(isChecked, instance, left, right, candidates, ref useSiteInfo); instance.Free(); lookedInInterfaces.Add(operatorSourceOpt, flag); if (!flag) { candidates.Clear(); immutableArray = operatorSourceOpt.AllInterfacesWithDefinitionUseSiteDiagnostics(ref useSiteInfo); } } } else if (operatorSourceOpt.IsTypeParameter()) { immutableArray = ((TypeParameterSymbol)operatorSourceOpt).AllEffectiveInterfacesWithDefinitionUseSiteDiagnostics(ref useSiteInfo); constrainedToTypeOpt = operatorSourceOpt; } if (!immutableArray.IsDefaultOrEmpty) { ArrayBuilder instance2 = ArrayBuilder.GetInstance(); ArrayBuilder instance3 = ArrayBuilder.GetInstance(); PooledHashSet instance4 = PooledHashSet.GetInstance(); ImmutableArray.Enumerator enumerator = immutableArray.GetEnumerator(); while (enumerator.MoveNext()) { NamedTypeSymbol current = enumerator.Current; if (!current.IsInterface || ((HashSet)(object)instance4).Contains(current)) { continue; } if (lookedInInterfaces.TryGetValue(current, out var value2)) { if (value2) { ISetExtensions.AddAll((ISet)instance4, current.AllInterfacesWithDefinitionUseSiteDiagnostics(ref useSiteInfo)); } continue; } instance2.Clear(); instance3.Clear(); GetUserDefinedBinaryOperatorsFromType(constrainedToTypeOpt, current, kind, isChecked, instance2); value2 = CandidateOperators(isChecked, instance2, left, right, instance3, ref useSiteInfo); lookedInInterfaces.Add(current, value2); if (value2) { flag = true; candidates.AddRange(instance3); ISetExtensions.AddAll((ISet)instance4, current.AllInterfacesWithDefinitionUseSiteDiagnostics(ref useSiteInfo)); } } instance2.Free(); instance3.Free(); instance4.Free(); } return flag; } private void AddDelegateOperation(BinaryOperatorKind kind, TypeSymbol delegateType, ArrayBuilder operators) { switch (kind) { case BinaryOperatorKind.Equal: case BinaryOperatorKind.NotEqual: operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Delegate, delegateType, delegateType, Compilation.GetSpecialType((SpecialType)7))); break; default: operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Delegate, delegateType, delegateType, delegateType)); break; } } private void GetDelegateOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, ArrayBuilder operators, ref CompoundUseSiteInfo useSiteInfo) { switch (kind) { case BinaryOperatorKind.Multiplication: case BinaryOperatorKind.Division: case BinaryOperatorKind.Remainder: case BinaryOperatorKind.LeftShift: case BinaryOperatorKind.RightShift: case BinaryOperatorKind.GreaterThan: case BinaryOperatorKind.LessThan: case BinaryOperatorKind.GreaterThanOrEqual: case BinaryOperatorKind.LessThanOrEqual: case BinaryOperatorKind.And: case BinaryOperatorKind.Xor: case BinaryOperatorKind.Or: case BinaryOperatorKind.UnsignedRightShift: case BinaryOperatorKind.LogicalAnd: case BinaryOperatorKind.LogicalOr: break; default: throw ExceptionUtilities.UnexpectedValue((object)kind); case BinaryOperatorKind.Addition: case BinaryOperatorKind.Subtraction: case BinaryOperatorKind.Equal: case BinaryOperatorKind.NotEqual: { TypeSymbol type = left.Type; bool flag = type?.IsDelegateType() ?? false; TypeSymbol type2 = right.Type; bool flag2 = type2?.IsDelegateType() ?? false; if (!flag && !flag2) { BinaryOperatorKind binaryOperatorKind = kind.Operator(); if (binaryOperatorKind == BinaryOperatorKind.Equal || binaryOperatorKind == BinaryOperatorKind.NotEqual) { TypeSymbol specialType = _binder.Compilation.GetSpecialType((SpecialType)4); specialType.AddUseSiteInfo(ref useSiteInfo); if (Conversions.ClassifyImplicitConversionFromExpression(left, specialType, ref useSiteInfo).IsValid && Conversions.ClassifyImplicitConversionFromExpression(right, specialType, ref useSiteInfo).IsValid) { AddDelegateOperation(kind, specialType, operators); } } } else if (flag && flag2) { AddDelegateOperation(kind, type, operators); if (!((kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual) ? ConversionsBase.HasIdentityConversion(type, type2) : type.Equals(type2))) { AddDelegateOperation(kind, type2, operators); } } else { TypeSymbol delegateType = (flag ? type : type2); BoundExpression boundExpression = (flag ? right : left); if ((kind != BinaryOperatorKind.Equal && kind != BinaryOperatorKind.NotEqual) || boundExpression.Kind != BoundKind.UnboundLambda) { AddDelegateOperation(kind, delegateType, operators); } } break; } } } private void GetEnumOperation(BinaryOperatorKind kind, TypeSymbol enumType, BoundExpression right, ArrayBuilder operators) { if (!enumType.IsValidEnumType()) { return; } NamedTypeSymbol enumUnderlyingType = enumType.GetEnumUnderlyingType(); NamedTypeSymbol orCreateNullableType = Compilation.GetOrCreateNullableType(enumType); NamedTypeSymbol orCreateNullableType2 = Compilation.GetOrCreateNullableType(enumUnderlyingType); switch (kind) { case BinaryOperatorKind.Addition: operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumAndUnderlyingAddition, enumType, enumUnderlyingType, enumType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UnderlyingAndEnumAddition, enumUnderlyingType, enumType, enumType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumAndUnderlyingAddition, orCreateNullableType, orCreateNullableType2, orCreateNullableType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedUnderlyingAndEnumAddition, orCreateNullableType2, orCreateNullableType, orCreateNullableType)); break; case BinaryOperatorKind.Subtraction: { if (Strict) { operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumSubtraction, enumType, enumType, enumUnderlyingType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumAndUnderlyingSubtraction, enumType, enumUnderlyingType, enumType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumSubtraction, orCreateNullableType, orCreateNullableType, orCreateNullableType2)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumAndUnderlyingSubtraction, orCreateNullableType, orCreateNullableType2, orCreateNullableType)); break; } bool flag = TypeSymbol.Equals(right.Type?.StrippedType(), enumUnderlyingType, (TypeCompareKind)0); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumSubtraction, enumType, enumType, enumUnderlyingType) { Priority = 2 }); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumAndUnderlyingSubtraction, enumType, enumUnderlyingType, enumType) { Priority = (flag ? 1 : 3) }); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumSubtraction, orCreateNullableType, orCreateNullableType, orCreateNullableType2) { Priority = 12 }); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumAndUnderlyingSubtraction, orCreateNullableType, orCreateNullableType2, orCreateNullableType) { Priority = (flag ? 11 : 13) }); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UnderlyingAndEnumSubtraction, enumUnderlyingType, enumType, enumType) { Priority = 4 }); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedUnderlyingAndEnumSubtraction, orCreateNullableType2, orCreateNullableType, orCreateNullableType) { Priority = 14 }); break; } case BinaryOperatorKind.Equal: case BinaryOperatorKind.NotEqual: case BinaryOperatorKind.GreaterThan: case BinaryOperatorKind.LessThan: case BinaryOperatorKind.GreaterThanOrEqual: case BinaryOperatorKind.LessThanOrEqual: { NamedTypeSymbol specialType = Compilation.GetSpecialType((SpecialType)7); operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Enum, enumType, enumType, specialType)); operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Lifted | BinaryOperatorKind.Enum, orCreateNullableType, orCreateNullableType, specialType)); break; } case BinaryOperatorKind.And: case BinaryOperatorKind.Xor: case BinaryOperatorKind.Or: operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Enum, enumType, enumType, enumType)); operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Lifted | BinaryOperatorKind.Enum, orCreateNullableType, orCreateNullableType, orCreateNullableType)); break; } } private void GetPointerArithmeticOperators(BinaryOperatorKind kind, PointerTypeSymbol pointerType, ArrayBuilder operators) { switch (kind) { case BinaryOperatorKind.Addition: operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndIntAddition, pointerType, Compilation.GetSpecialType((SpecialType)13), pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndUIntAddition, pointerType, Compilation.GetSpecialType((SpecialType)14), pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndLongAddition, pointerType, Compilation.GetSpecialType((SpecialType)15), pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndULongAddition, pointerType, Compilation.GetSpecialType((SpecialType)16), pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.IntAndPointerAddition, Compilation.GetSpecialType((SpecialType)13), pointerType, pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UIntAndPointerAddition, Compilation.GetSpecialType((SpecialType)14), pointerType, pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LongAndPointerAddition, Compilation.GetSpecialType((SpecialType)15), pointerType, pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.ULongAndPointerAddition, Compilation.GetSpecialType((SpecialType)16), pointerType, pointerType)); break; case BinaryOperatorKind.Subtraction: operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndIntSubtraction, pointerType, Compilation.GetSpecialType((SpecialType)13), pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndUIntSubtraction, pointerType, Compilation.GetSpecialType((SpecialType)14), pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndLongSubtraction, pointerType, Compilation.GetSpecialType((SpecialType)15), pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndULongSubtraction, pointerType, Compilation.GetSpecialType((SpecialType)16), pointerType)); operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerSubtraction, pointerType, pointerType, Compilation.GetSpecialType((SpecialType)15))); break; } } private void GetPointerComparisonOperators(BinaryOperatorKind kind, ArrayBuilder operators) { switch (kind) { case BinaryOperatorKind.Equal: case BinaryOperatorKind.NotEqual: case BinaryOperatorKind.GreaterThan: case BinaryOperatorKind.LessThan: case BinaryOperatorKind.GreaterThanOrEqual: case BinaryOperatorKind.LessThanOrEqual: { PointerTypeSymbol pointerTypeSymbol = new PointerTypeSymbol(TypeWithAnnotations.Create(Compilation.GetSpecialType((SpecialType)6))); operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Pointer, pointerTypeSymbol, pointerTypeSymbol, Compilation.GetSpecialType((SpecialType)7))); break; } } } private void GetEnumOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, ArrayBuilder results) { switch (kind) { case BinaryOperatorKind.Multiplication: case BinaryOperatorKind.Division: case BinaryOperatorKind.Remainder: case BinaryOperatorKind.LeftShift: case BinaryOperatorKind.RightShift: case BinaryOperatorKind.UnsignedRightShift: case BinaryOperatorKind.LogicalAnd: case BinaryOperatorKind.LogicalOr: return; } TypeSymbol typeSymbol = left.Type; if ((object)typeSymbol != null) { typeSymbol = typeSymbol.StrippedType(); } TypeSymbol typeSymbol2 = right.Type; if ((object)typeSymbol2 != null) { typeSymbol2 = typeSymbol2.StrippedType(); } bool flag; switch (kind) { case BinaryOperatorKind.And: case BinaryOperatorKind.Xor: case BinaryOperatorKind.Or: flag = false; break; case BinaryOperatorKind.Addition: flag = true; break; case BinaryOperatorKind.Subtraction: flag = true; break; case BinaryOperatorKind.Equal: case BinaryOperatorKind.NotEqual: case BinaryOperatorKind.GreaterThan: case BinaryOperatorKind.LessThan: case BinaryOperatorKind.GreaterThanOrEqual: case BinaryOperatorKind.LessThanOrEqual: flag = true; break; default: throw ExceptionUtilities.UnexpectedValue((object)kind); } if ((object)typeSymbol != null) { GetEnumOperation(kind, typeSymbol, right, results); } if ((object)typeSymbol2 != null && ((object)typeSymbol == null || !(flag ? ConversionsBase.HasIdentityConversion(typeSymbol2, typeSymbol) : typeSymbol2.Equals(typeSymbol)))) { GetEnumOperation(kind, typeSymbol2, right, results); } } private void GetPointerOperators(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, ArrayBuilder results) { PointerTypeSymbol pointerTypeSymbol = left.Type as PointerTypeSymbol; PointerTypeSymbol pointerTypeSymbol2 = right.Type as PointerTypeSymbol; if ((object)pointerTypeSymbol != null) { GetPointerArithmeticOperators(kind, pointerTypeSymbol, results); } if ((object)pointerTypeSymbol2 != null && ((object)pointerTypeSymbol == null || !ConversionsBase.HasIdentityConversion(pointerTypeSymbol2, pointerTypeSymbol))) { GetPointerArithmeticOperators(kind, pointerTypeSymbol2, results); } if ((object)pointerTypeSymbol != null || (object)pointerTypeSymbol2 != null || left.Type is FunctionPointerTypeSymbol || right.Type is FunctionPointerTypeSymbol) { GetPointerComparisonOperators(kind, results); } } private void GetAllBuiltInOperators(BinaryOperatorKind kind, bool isChecked, BoundExpression left, BoundExpression right, ArrayBuilder results, ref CompoundUseSiteInfo useSiteInfo) { kind = kind.OperatorWithLogical(); ArrayBuilder instance = ArrayBuilder.GetInstance(); if ((kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual) && useOnlyReferenceEquality(Conversions, left, right, ref useSiteInfo)) { GetReferenceEquality(kind, instance); } else { Compilation.builtInOperators.GetSimpleBuiltInOperators(kind, instance, !left.Type.IsNativeIntegerOrNullableThereof() && !right.Type.IsNativeIntegerOrNullableThereof()); GetDelegateOperations(kind, left, right, instance, ref useSiteInfo); GetEnumOperations(kind, left, right, instance); GetPointerOperators(kind, left, right, instance); if (kind.Operator() == BinaryOperatorKind.Addition && isUtf8ByteRepresentation(left) && isUtf8ByteRepresentation(right)) { Compilation.builtInOperators.GetUtf8ConcatenationBuiltInOperator(left.Type, instance); } } CandidateOperators(isChecked, instance, left, right, results, ref useSiteInfo); instance.Free(); static bool isUtf8ByteRepresentation(BoundExpression value) { if (value is BoundUtf8String || value is BoundBinaryOperator { OperatorKind: BinaryOperatorKind.Utf8Addition }) { return true; } return false; } static bool useOnlyReferenceEquality(Conversions conversions, BoundExpression boundExpression, BoundExpression boundExpression2, ref CompoundUseSiteInfo useSiteInfo2) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Invalid comparison between Unknown and I4 //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Invalid comparison between Unknown and I4 //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Invalid comparison between Unknown and I4 //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Invalid comparison between Unknown and I4 if (BuiltInOperators.IsValidObjectEquality(conversions, boundExpression.Type, boundExpression.IsLiteralNull(), leftIsDefault: false, boundExpression2.Type, boundExpression2.IsLiteralNull(), rightIsDefault: false, ref useSiteInfo2) && ((object)boundExpression.Type == null || (!boundExpression.Type.IsDelegateType() && (int)boundExpression.Type.SpecialType != 20 && (int)boundExpression.Type.SpecialType != 4))) { if ((object)boundExpression2.Type != null) { if (!boundExpression2.Type.IsDelegateType() && (int)boundExpression2.Type.SpecialType != 20) { return (int)boundExpression2.Type.SpecialType != 4; } return false; } return true; } return false; } } private void GetReferenceEquality(BinaryOperatorKind kind, ArrayBuilder operators) { NamedTypeSymbol specialType = Compilation.GetSpecialType((SpecialType)1); operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Object, specialType, specialType, Compilation.GetSpecialType((SpecialType)7))); } private bool CandidateOperators(bool isChecked, ArrayBuilder operators, BoundExpression left, BoundExpression right, ArrayBuilder results, ref CompoundUseSiteInfo useSiteInfo) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) bool result = false; Enumerator enumerator = operators.GetEnumerator(); while (enumerator.MoveNext()) { BinaryOperatorSignature current = enumerator.Current; Conversion leftConversion = Conversions.ClassifyConversionFromExpression(left, current.LeftType, isChecked, ref useSiteInfo); Conversion rightConversion = Conversions.ClassifyConversionFromExpression(right, current.RightType, isChecked, ref useSiteInfo); if (leftConversion.IsImplicit && rightConversion.IsImplicit) { results.Add(BinaryOperatorAnalysisResult.Applicable(current, leftConversion, rightConversion)); result = true; } else { results.Add(BinaryOperatorAnalysisResult.Inapplicable(current, leftConversion, rightConversion)); } } return result; } private static void AddDistinctOperators(ArrayBuilder result, ArrayBuilder additionalOperators) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) int count = result.Count; Enumerator enumerator = additionalOperators.GetEnumerator(); while (enumerator.MoveNext()) { BinaryOperatorAnalysisResult current = enumerator.Current; bool flag = false; for (int i = 0; i < count; i++) { BinaryOperatorSignature signature = result[i].Signature; if (current.Signature.Kind == signature.Kind && equalsIgnoringNullable(current.Signature.ReturnType, signature.ReturnType) && equalsIgnoringNullableAndDynamic(current.Signature.LeftType, signature.LeftType) && equalsIgnoringNullableAndDynamic(current.Signature.RightType, signature.RightType) && equalsIgnoringNullableAndDynamic(current.Signature.Method.ContainingType, signature.Method.ContainingType)) { flag = true; break; } } if (!flag) { result.Add(current); } } static bool equalsIgnoringNullable(TypeSymbol a, TypeSymbol b) { return a.Equals(b, (TypeCompareKind)24); } static bool equalsIgnoringNullableAndDynamic(TypeSymbol a, TypeSymbol b) { return a.Equals(b, (TypeCompareKind)26); } } private bool GetUserDefinedOperators(BinaryOperatorKind kind, bool isChecked, TypeSymbol type0, BoundExpression left, BoundExpression right, ArrayBuilder results, ref CompoundUseSiteInfo useSiteInfo) { if ((object)type0 == null || OperatorFacts.DefinitelyHasNoUserDefinedOperators(type0)) { return false; } ArrayBuilder instance = ArrayBuilder.GetInstance(); bool result = false; NamedTypeSymbol namedTypeSymbol = type0 as NamedTypeSymbol; if ((object)namedTypeSymbol == null) { namedTypeSymbol = type0.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteInfo); } if ((object)namedTypeSymbol == null && type0.IsTypeParameter()) { namedTypeSymbol = ((TypeParameterSymbol)type0).EffectiveBaseClass(ref useSiteInfo); } while ((object)namedTypeSymbol != null) { instance.Clear(); GetUserDefinedBinaryOperatorsFromType(null, namedTypeSymbol, kind, isChecked, instance); results.Clear(); if (CandidateOperators(isChecked, instance, left, right, results, ref useSiteInfo)) { result = true; break; } namedTypeSymbol = namedTypeSymbol.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteInfo); } instance.Free(); return result; } private void GetUserDefinedBinaryOperatorsFromType(TypeSymbol constrainedToTypeOpt, NamedTypeSymbol type, BinaryOperatorKind kind, bool isChecked, ArrayBuilder operators) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) string text = OperatorFacts.BinaryOperatorNameFromOperatorKind(kind, isChecked); getDeclaredOperators(constrainedToTypeOpt, type, kind, text, operators); if (isChecked && SyntaxFacts.IsCheckedOperator(text)) { string name = OperatorFacts.BinaryOperatorNameFromOperatorKind(kind, isChecked: false); ArrayBuilder instance = ArrayBuilder.GetInstance(); getDeclaredOperators(constrainedToTypeOpt, type, kind, name, instance); if (operators.Count != 0) { for (int num = instance.Count - 1; num >= 0; num--) { Enumerator enumerator = operators.GetEnumerator(); while (enumerator.MoveNext()) { if (SourceMemberContainerTypeSymbol.DoOperatorsPair(enumerator.Current.Method, instance[num].Method)) { instance.RemoveAt(num); break; } } } } operators.AddRange(instance); instance.Free(); } addLiftedOperators(constrainedToTypeOpt, kind, operators); void addLiftedOperators(TypeSymbol constrainedToTypeOpt2, BinaryOperatorKind binaryOperatorKind, ArrayBuilder val) { for (int num2 = val.Count - 1; num2 >= 0; num2--) { MethodSymbol method = val[num2].Method; TypeSymbol parameterType = method.GetParameterType(0); TypeSymbol parameterType2 = method.GetParameterType(1); TypeSymbol returnType = method.ReturnType; switch (UserDefinedBinaryOperatorCanBeLifted(parameterType, parameterType2, returnType, binaryOperatorKind)) { case LiftingResult.LiftOperandsAndResult: val.Add(new BinaryOperatorSignature(BinaryOperatorKind.UserDefined | BinaryOperatorKind.Lifted | binaryOperatorKind, MakeNullable(parameterType), MakeNullable(parameterType2), MakeNullable(returnType), method, constrainedToTypeOpt2)); break; case LiftingResult.LiftOperandsButNotResult: val.Add(new BinaryOperatorSignature(BinaryOperatorKind.UserDefined | BinaryOperatorKind.Lifted | binaryOperatorKind, MakeNullable(parameterType), MakeNullable(parameterType2), returnType, method, constrainedToTypeOpt2)); break; } } } static void getDeclaredOperators(TypeSymbol constrainedToTypeOpt2, NamedTypeSymbol namedTypeSymbol, BinaryOperatorKind binaryOperatorKind, string name2, ArrayBuilder val) { ImmutableArray.Enumerator enumerator2 = namedTypeSymbol.GetOperators(name2).GetEnumerator(); while (enumerator2.MoveNext()) { MethodSymbol current = enumerator2.Current; if (current.ParameterCount == 2 && !current.ReturnsVoid) { TypeSymbol parameterType = current.GetParameterType(0); TypeSymbol parameterType2 = current.GetParameterType(1); TypeSymbol returnType = current.ReturnType; val.Add(new BinaryOperatorSignature(BinaryOperatorKind.UserDefined | binaryOperatorKind, parameterType, parameterType2, returnType, current, constrainedToTypeOpt2)); } } } } private static LiftingResult UserDefinedBinaryOperatorCanBeLifted(TypeSymbol left, TypeSymbol right, TypeSymbol result, BinaryOperatorKind kind) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Invalid comparison between Unknown and I4 if (!left.IsValidNullableTypeArgument() || !right.IsValidNullableTypeArgument()) { return LiftingResult.NotLifted; } if (kind <= BinaryOperatorKind.GreaterThan) { if (kind != BinaryOperatorKind.Equal && kind != BinaryOperatorKind.NotEqual) { if (kind != BinaryOperatorKind.GreaterThan) { goto IL_0067; } } else if (!TypeSymbol.Equals(left, right, (TypeCompareKind)0)) { return LiftingResult.NotLifted; } } else if (kind != BinaryOperatorKind.LessThan && kind != BinaryOperatorKind.GreaterThanOrEqual && kind != BinaryOperatorKind.LessThanOrEqual) { goto IL_0067; } if ((int)result.SpecialType != 7) { return LiftingResult.NotLifted; } return LiftingResult.LiftOperandsButNotResult; IL_0067: if (!result.IsValidNullableTypeArgument()) { return LiftingResult.NotLifted; } return LiftingResult.LiftOperandsAndResult; } private void BinaryOperatorOverloadResolution(BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result, ref CompoundUseSiteInfo useSiteInfo) { if (result.SingleValid()) { return; } ArrayBuilder results = result.Results; int theBestCandidateIndex = GetTheBestCandidateIndex(left, right, results, ref useSiteInfo); if (theBestCandidateIndex != -1) { for (int i = 0; i < results.Count; i++) { if (results[i].Kind != OperatorAnalysisResultKind.Inapplicable && i != theBestCandidateIndex) { results[i] = results[i].Worse(); } } return; } for (int j = 1; j < results.Count; j++) { if (results[j].Kind != OperatorAnalysisResultKind.Applicable) { continue; } for (int k = 0; k < j; k++) { if (results[k].Kind != OperatorAnalysisResultKind.Inapplicable) { switch (BetterOperator(results[j].Signature, results[k].Signature, left, right, ref useSiteInfo)) { case BetterResult.Left: results[k] = results[k].Worse(); break; case BetterResult.Right: results[j] = results[j].Worse(); break; } } } } } private int GetTheBestCandidateIndex(BoundExpression left, BoundExpression right, ArrayBuilder candidates, ref CompoundUseSiteInfo useSiteInfo) { int num = -1; for (int i = 0; i < candidates.Count; i++) { if (candidates[i].Kind != OperatorAnalysisResultKind.Applicable) { continue; } if (num == -1) { num = i; continue; } switch (BetterOperator(candidates[num].Signature, candidates[i].Signature, left, right, ref useSiteInfo)) { case BetterResult.Right: num = i; break; default: num = -1; break; case BetterResult.Left: break; } } for (int j = 0; j < num; j++) { if (candidates[j].Kind != OperatorAnalysisResultKind.Inapplicable && BetterOperator(candidates[num].Signature, candidates[j].Signature, left, right, ref useSiteInfo) != BetterResult.Left) { return -1; } } return num; } private BetterResult BetterOperator(BinaryOperatorSignature op1, BinaryOperatorSignature op2, BoundExpression left, BoundExpression right, ref CompoundUseSiteInfo useSiteInfo) { //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Invalid comparison between Unknown and I4 //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Invalid comparison between Unknown and I4 //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Invalid comparison between Unknown and I4 //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Invalid comparison between Unknown and I4 if (op1.Priority.HasValue && op1.Priority.GetValueOrDefault() != op2.Priority.GetValueOrDefault()) { if (op1.Priority.GetValueOrDefault() >= op2.Priority.GetValueOrDefault()) { return BetterResult.Right; } return BetterResult.Left; } BetterResult betterResult = BetterConversionFromExpression(left, op1.LeftType, op2.LeftType, ref useSiteInfo); BetterResult betterResult2 = BetterConversionFromExpression(right, op1.RightType, op2.RightType, ref useSiteInfo); if ((betterResult == BetterResult.Left && betterResult2 != BetterResult.Right) || (betterResult != BetterResult.Right && betterResult2 == BetterResult.Left)) { return BetterResult.Left; } if ((betterResult == BetterResult.Right && betterResult2 != BetterResult.Left) || (betterResult != BetterResult.Left && betterResult2 == BetterResult.Right)) { return BetterResult.Right; } if (ConversionsBase.HasIdentityConversion(op1.LeftType, op2.LeftType) && ConversionsBase.HasIdentityConversion(op1.RightType, op2.RightType)) { BetterResult betterResult3 = MoreSpecificOperator(op1, op2, ref useSiteInfo); if (betterResult3 == BetterResult.Left || betterResult3 == BetterResult.Right) { return betterResult3; } bool flag = op1.Kind.IsLifted(); bool flag2 = op2.Kind.IsLifted(); if (flag && !flag2) { return BetterResult.Right; } if (!flag && flag2) { return BetterResult.Left; } } BetterResult betterResult4 = (((int)op1.LeftRefKind != 0 || (int)op2.LeftRefKind != 3) ? (((int)op2.LeftRefKind == 0 && (int)op1.LeftRefKind == 3) ? BetterResult.Right : BetterResult.Neither) : BetterResult.Left); if ((int)op1.RightRefKind == 0 && (int)op2.RightRefKind == 3) { if (betterResult4 == BetterResult.Right) { return BetterResult.Neither; } betterResult4 = BetterResult.Left; } else if ((int)op2.RightRefKind == 0 && (int)op1.RightRefKind == 3) { if (betterResult4 == BetterResult.Left) { return BetterResult.Neither; } betterResult4 = BetterResult.Right; } return betterResult4; } private BetterResult MoreSpecificOperator(BinaryOperatorSignature op1, BinaryOperatorSignature op2, ref CompoundUseSiteInfo useSiteInfo) { //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) TypeSymbol typeSymbol; TypeSymbol typeSymbol2; if ((object)op1.Method != null) { ImmutableArray parameters = op1.Method.OriginalDefinition.GetParameters(); typeSymbol = parameters[0].Type; typeSymbol2 = parameters[1].Type; if (op1.Kind.IsLifted()) { typeSymbol = MakeNullable(typeSymbol); typeSymbol2 = MakeNullable(typeSymbol2); } } else { typeSymbol = op1.LeftType; typeSymbol2 = op1.RightType; } TypeSymbol typeSymbol3; TypeSymbol typeSymbol4; if ((object)op2.Method != null) { ImmutableArray parameters2 = op2.Method.OriginalDefinition.GetParameters(); typeSymbol3 = parameters2[0].Type; typeSymbol4 = parameters2[1].Type; if (op2.Kind.IsLifted()) { typeSymbol3 = MakeNullable(typeSymbol3); typeSymbol4 = MakeNullable(typeSymbol4); } } else { typeSymbol3 = op2.LeftType; typeSymbol4 = op2.RightType; } TemporaryArray empty = TemporaryArray.Empty; try { TemporaryArray empty2 = TemporaryArray.Empty; try { empty.Add(typeSymbol); empty.Add(typeSymbol2); empty2.Add(typeSymbol3); empty2.Add(typeSymbol4); return MoreSpecificType(ref TemporaryArrayExtensions.AsRef(ref empty), ref TemporaryArrayExtensions.AsRef(ref empty2), ref useSiteInfo); } finally { ((IDisposable)empty2/*cast due to constrained. prefix*/).Dispose(); } } finally { ((IDisposable)empty/*cast due to constrained. prefix*/).Dispose(); } } [Conditional("DEBUG")] private static void AssertNotChecked(BinaryOperatorKind kind) { } private void UnaryOperatorEasyOut(UnaryOperatorKind kind, BoundExpression operand, UnaryOperatorOverloadResolutionResult result) { TypeSymbol type = operand.Type; if ((object)type != null) { UnaryOperatorKind unaryOperatorKind = UnopEasyOut.OpKind(kind, type); if (unaryOperatorKind != UnaryOperatorKind.Error) { UnaryOperatorSignature signature = Compilation.builtInOperators.GetSignature(unaryOperatorKind); Conversion? conversion = ConversionsBase.FastClassifyConversion(type, signature.OperandType); result.Results.Add(UnaryOperatorAnalysisResult.Applicable(signature, conversion.Value)); } } } private NamedTypeSymbol MakeNullable(TypeSymbol type) { return Compilation.GetSpecialType((SpecialType)32).Construct(type); } public void UnaryOperatorOverloadResolution(UnaryOperatorKind kind, bool isChecked, BoundExpression operand, UnaryOperatorOverloadResolutionResult result, ref CompoundUseSiteInfo useSiteInfo) { UnaryOperatorEasyOut(kind, operand, result); if (result.Results.Count <= 0) { if (!GetUserDefinedOperators(kind, isChecked, operand, result.Results, ref useSiteInfo)) { result.Results.Clear(); GetAllBuiltInOperators(kind, isChecked, operand, result.Results, ref useSiteInfo); } UnaryOperatorOverloadResolution(operand, result, ref useSiteInfo); } } private void UnaryOperatorOverloadResolution(BoundExpression operand, UnaryOperatorOverloadResolutionResult result, ref CompoundUseSiteInfo useSiteInfo) { if (result.SingleValid()) { return; } ArrayBuilder results = result.Results; int theBestCandidateIndex = GetTheBestCandidateIndex(operand, results, ref useSiteInfo); if (theBestCandidateIndex != -1) { for (int i = 0; i < results.Count; i++) { if (results[i].Kind != OperatorAnalysisResultKind.Inapplicable && i != theBestCandidateIndex) { results[i] = results[i].Worse(); } } return; } for (int j = 1; j < results.Count; j++) { if (results[j].Kind != OperatorAnalysisResultKind.Applicable) { continue; } for (int k = 0; k < j; k++) { if (results[k].Kind != OperatorAnalysisResultKind.Inapplicable) { switch (BetterOperator(results[j].Signature, results[k].Signature, operand, ref useSiteInfo)) { case BetterResult.Left: results[k] = results[k].Worse(); break; case BetterResult.Right: results[j] = results[j].Worse(); break; } } } } } private int GetTheBestCandidateIndex(BoundExpression operand, ArrayBuilder candidates, ref CompoundUseSiteInfo useSiteInfo) { int num = -1; for (int i = 0; i < candidates.Count; i++) { if (candidates[i].Kind != OperatorAnalysisResultKind.Applicable) { continue; } if (num == -1) { num = i; continue; } switch (BetterOperator(candidates[num].Signature, candidates[i].Signature, operand, ref useSiteInfo)) { case BetterResult.Right: num = i; break; default: num = -1; break; case BetterResult.Left: break; } } for (int j = 0; j < num; j++) { if (candidates[j].Kind != OperatorAnalysisResultKind.Inapplicable && BetterOperator(candidates[num].Signature, candidates[j].Signature, operand, ref useSiteInfo) != BetterResult.Left) { return -1; } } return num; } private BetterResult BetterOperator(UnaryOperatorSignature op1, UnaryOperatorSignature op2, BoundExpression operand, ref CompoundUseSiteInfo useSiteInfo) { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Invalid comparison between Unknown and I4 //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Invalid comparison between Unknown and I4 BetterResult betterResult = BetterConversionFromExpression(operand, op1.OperandType, op2.OperandType, ref useSiteInfo); if (betterResult == BetterResult.Left || betterResult == BetterResult.Right) { return betterResult; } if (ConversionsBase.HasIdentityConversion(op1.OperandType, op2.OperandType)) { bool flag = op1.Kind.IsLifted(); bool flag2 = op2.Kind.IsLifted(); if (flag && !flag2) { return BetterResult.Right; } if (!flag && flag2) { return BetterResult.Left; } } if ((int)op1.RefKind == 0 && (int)op2.RefKind == 3) { return BetterResult.Left; } if ((int)op2.RefKind == 0 && (int)op1.RefKind == 3) { return BetterResult.Right; } return BetterResult.Neither; } private void GetAllBuiltInOperators(UnaryOperatorKind kind, bool isChecked, BoundExpression operand, ArrayBuilder results, ref CompoundUseSiteInfo useSiteInfo) { ArrayBuilder instance = ArrayBuilder.GetInstance(); Compilation.builtInOperators.GetSimpleBuiltInOperators(kind, instance, !operand.Type.IsNativeIntegerOrNullableThereof()); GetEnumOperations(kind, operand, instance); UnaryOperatorSignature? pointerOperation = GetPointerOperation(kind, operand); if (pointerOperation.HasValue) { instance.Add(pointerOperation.Value); } CandidateOperators(isChecked, instance, operand, results, ref useSiteInfo); instance.Free(); } private bool CandidateOperators(bool isChecked, ArrayBuilder operators, BoundExpression operand, ArrayBuilder results, ref CompoundUseSiteInfo useSiteInfo) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) bool result = false; Enumerator enumerator = operators.GetEnumerator(); while (enumerator.MoveNext()) { UnaryOperatorSignature current = enumerator.Current; Conversion conversion = Conversions.ClassifyConversionFromExpression(operand, current.OperandType, isChecked, ref useSiteInfo); if (conversion.IsImplicit) { result = true; results.Add(UnaryOperatorAnalysisResult.Applicable(current, conversion)); } else { results.Add(UnaryOperatorAnalysisResult.Inapplicable(current, conversion)); } } return result; } private void GetEnumOperations(UnaryOperatorKind kind, BoundExpression operand, ArrayBuilder operators) { TypeSymbol type = operand.Type; if ((object)type == null) { return; } type = type.StrippedType(); if (type.IsValidEnumType()) { NamedTypeSymbol orCreateNullableType = Compilation.GetOrCreateNullableType(type); switch (kind) { case UnaryOperatorKind.PostfixIncrement: case UnaryOperatorKind.PostfixDecrement: case UnaryOperatorKind.PrefixIncrement: case UnaryOperatorKind.PrefixDecrement: case UnaryOperatorKind.BitwiseComplement: operators.Add(new UnaryOperatorSignature(kind | UnaryOperatorKind.Enum, type, type)); operators.Add(new UnaryOperatorSignature(kind | UnaryOperatorKind.Lifted | UnaryOperatorKind.Enum, orCreateNullableType, orCreateNullableType)); break; } } } private static UnaryOperatorSignature? GetPointerOperation(UnaryOperatorKind kind, BoundExpression operand) { if (!(operand.Type is PointerTypeSymbol pointerTypeSymbol)) { return null; } UnaryOperatorSignature? result = null; switch (kind) { case UnaryOperatorKind.PostfixIncrement: case UnaryOperatorKind.PostfixDecrement: case UnaryOperatorKind.PrefixIncrement: case UnaryOperatorKind.PrefixDecrement: result = new UnaryOperatorSignature(kind | UnaryOperatorKind.Pointer, pointerTypeSymbol, pointerTypeSymbol); break; } return result; } private bool GetUserDefinedOperators(UnaryOperatorKind kind, bool isChecked, BoundExpression operand, ArrayBuilder results, ref CompoundUseSiteInfo useSiteInfo) { if ((object)operand.Type == null) { return false; } TypeSymbol typeSymbol = operand.Type.StrippedType(); TypeSymbol constrainedToTypeOpt = typeSymbol as TypeParameterSymbol; if (OperatorFacts.DefinitelyHasNoUserDefinedOperators(typeSymbol)) { return false; } ArrayBuilder instance = ArrayBuilder.GetInstance(); bool flag = false; NamedTypeSymbol namedTypeSymbol = typeSymbol as NamedTypeSymbol; if ((object)namedTypeSymbol == null) { namedTypeSymbol = typeSymbol.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteInfo); } if ((object)namedTypeSymbol == null && typeSymbol.IsTypeParameter()) { namedTypeSymbol = ((TypeParameterSymbol)typeSymbol).EffectiveBaseClass(ref useSiteInfo); } while ((object)namedTypeSymbol != null) { instance.Clear(); GetUserDefinedUnaryOperatorsFromType(constrainedToTypeOpt, namedTypeSymbol, kind, isChecked, instance); results.Clear(); if (CandidateOperators(isChecked, instance, operand, results, ref useSiteInfo)) { flag = true; break; } namedTypeSymbol = namedTypeSymbol.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteInfo); } if (!flag) { ImmutableArray immutableArray = default(ImmutableArray); if (typeSymbol.IsInterfaceType()) { immutableArray = typeSymbol.AllInterfacesWithDefinitionUseSiteDiagnostics(ref useSiteInfo); } else if (typeSymbol.IsTypeParameter()) { immutableArray = ((TypeParameterSymbol)typeSymbol).AllEffectiveInterfacesWithDefinitionUseSiteDiagnostics(ref useSiteInfo); } if (!immutableArray.IsDefaultOrEmpty) { PooledHashSet instance2 = PooledHashSet.GetInstance(); ArrayBuilder instance3 = ArrayBuilder.GetInstance(); results.Clear(); ImmutableArray.Enumerator enumerator = immutableArray.GetEnumerator(); while (enumerator.MoveNext()) { NamedTypeSymbol current = enumerator.Current; if (current.IsInterface && !((HashSet)(object)instance2).Contains(current)) { instance.Clear(); instance3.Clear(); GetUserDefinedUnaryOperatorsFromType(constrainedToTypeOpt, current, kind, isChecked, instance); if (CandidateOperators(isChecked, instance, operand, instance3, ref useSiteInfo)) { flag = true; results.AddRange(instance3); ISetExtensions.AddAll((ISet)instance2, current.AllInterfacesWithDefinitionUseSiteDiagnostics(ref useSiteInfo)); } } } instance2.Free(); instance3.Free(); } } instance.Free(); return flag; } private void GetUserDefinedUnaryOperatorsFromType(TypeSymbol constrainedToTypeOpt, NamedTypeSymbol type, UnaryOperatorKind kind, bool isChecked, ArrayBuilder operators) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) string text = OperatorFacts.UnaryOperatorNameFromOperatorKind(kind, isChecked); getDeclaredOperators(constrainedToTypeOpt, type, kind, text, operators); if (isChecked && SyntaxFacts.IsCheckedOperator(text)) { string name = OperatorFacts.UnaryOperatorNameFromOperatorKind(kind, isChecked: false); ArrayBuilder instance = ArrayBuilder.GetInstance(); getDeclaredOperators(constrainedToTypeOpt, type, kind, name, instance); if (operators.Count != 0) { for (int num = instance.Count - 1; num >= 0; num--) { Enumerator enumerator = operators.GetEnumerator(); while (enumerator.MoveNext()) { if (SourceMemberContainerTypeSymbol.DoOperatorsPair(enumerator.Current.Method, instance[num].Method)) { instance.RemoveAt(num); break; } } } } operators.AddRange(instance); instance.Free(); } addLiftedOperators(constrainedToTypeOpt, kind, operators); void addLiftedOperators(TypeSymbol constrainedToTypeOpt2, UnaryOperatorKind unaryOperatorKind, ArrayBuilder val) { switch (unaryOperatorKind) { case UnaryOperatorKind.PostfixIncrement: case UnaryOperatorKind.PostfixDecrement: case UnaryOperatorKind.PrefixIncrement: case UnaryOperatorKind.PrefixDecrement: case UnaryOperatorKind.UnaryPlus: case UnaryOperatorKind.UnaryMinus: case UnaryOperatorKind.LogicalNegation: case UnaryOperatorKind.BitwiseComplement: { for (int num2 = val.Count - 1; num2 >= 0; num2--) { MethodSymbol method = val[num2].Method; TypeSymbol parameterType = method.GetParameterType(0); TypeSymbol returnType = method.ReturnType; if (parameterType.IsValidNullableTypeArgument() && returnType.IsValidNullableTypeArgument()) { val.Add(new UnaryOperatorSignature(UnaryOperatorKind.UserDefined | UnaryOperatorKind.Lifted | unaryOperatorKind, MakeNullable(parameterType), MakeNullable(returnType), method, constrainedToTypeOpt2)); } } break; } } } static void getDeclaredOperators(TypeSymbol constrainedToTypeOpt2, NamedTypeSymbol namedTypeSymbol, UnaryOperatorKind unaryOperatorKind, string name2, ArrayBuilder val) { ImmutableArray.Enumerator enumerator2 = namedTypeSymbol.GetOperators(name2).GetEnumerator(); while (enumerator2.MoveNext()) { MethodSymbol current = enumerator2.Current; if (current.ParameterCount == 1 && !current.ReturnsVoid) { TypeSymbol parameterType = current.GetParameterType(0); TypeSymbol returnType = current.ReturnType; val.Add(new UnaryOperatorSignature(UnaryOperatorKind.UserDefined | unaryOperatorKind, parameterType, returnType, current, constrainedToTypeOpt2)); } } } } public OverloadResolution(Binder binder) { _binder = binder; } private static bool AnyValidResult(ArrayBuilder> results) where TMember : Symbol { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Enumerator> enumerator = results.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current.IsValid) { return true; } } return false; } private static bool SingleValidResult(ArrayBuilder> results) where TMember : Symbol { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) bool flag = false; Enumerator> enumerator = results.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current.IsValid) { if (flag) { return false; } flag = true; } } return flag; } public void ObjectCreationOverloadResolution(ImmutableArray constructors, AnalyzedArguments arguments, OverloadResolutionResult result, ref CompoundUseSiteInfo useSiteInfo) { ArrayBuilder> resultsBuilder = result.ResultsBuilder; PerformObjectCreationOverloadResolution(resultsBuilder, constructors, arguments, completeResults: false, ref useSiteInfo); if (!OverloadResolutionResultIsValid(resultsBuilder, arguments.HasDynamicArgument)) { result.Clear(); PerformObjectCreationOverloadResolution(resultsBuilder, constructors, arguments, completeResults: true, ref useSiteInfo); } } public void MethodInvocationOverloadResolution(ArrayBuilder methods, ArrayBuilder typeArguments, BoundExpression receiver, AnalyzedArguments arguments, OverloadResolutionResult result, ref CompoundUseSiteInfo useSiteInfo, bool isMethodGroupConversion = false, bool allowRefOmittedArguments = false, bool inferWithDynamic = false, bool allowUnexpandedForm = true, RefKind returnRefKind = (RefKind)0, TypeSymbol returnType = null, bool isFunctionPointerResolution = false, bool isExtensionMethodResolution = false, in CallingConventionInfo callingConventionInfo = default(CallingConventionInfo)) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) MethodOrPropertyOverloadResolution(methods, typeArguments, receiver, arguments, result, isMethodGroupConversion, allowRefOmittedArguments, ref useSiteInfo, inferWithDynamic, allowUnexpandedForm, returnRefKind, returnType, isFunctionPointerResolution, isExtensionMethodResolution, in callingConventionInfo); } public void PropertyOverloadResolution(ArrayBuilder indexers, BoundExpression receiverOpt, AnalyzedArguments arguments, OverloadResolutionResult result, bool allowRefOmittedArguments, ref CompoundUseSiteInfo useSiteInfo) { ArrayBuilder instance = ArrayBuilder.GetInstance(); MethodOrPropertyOverloadResolution(indexers, instance, receiverOpt, arguments, result, isMethodGroupConversion: false, allowRefOmittedArguments, ref useSiteInfo, inferWithDynamic: false, allowUnexpandedForm: true, (RefKind)0, null, isFunctionPointerResolution: false, isExtensionMethodResolution: false, default(CallingConventionInfo)); instance.Free(); } internal void MethodOrPropertyOverloadResolution(ArrayBuilder members, ArrayBuilder typeArguments, BoundExpression receiver, AnalyzedArguments arguments, OverloadResolutionResult result, bool isMethodGroupConversion, bool allowRefOmittedArguments, ref CompoundUseSiteInfo useSiteInfo, bool inferWithDynamic = false, bool allowUnexpandedForm = true, RefKind returnRefKind = (RefKind)0, TypeSymbol returnType = null, bool isFunctionPointerResolution = false, bool isExtensionMethodResolution = false, in CallingConventionInfo callingConventionInfo = default(CallingConventionInfo)) where TMember : Symbol { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) ArrayBuilder> resultsBuilder = result.ResultsBuilder; bool checkOverriddenOrHidden = !isExtensionMethodResolution || !ArrayBuilderExtensions.All(members, (Func)((TMember m) => m.ContainingSymbol is NamedTypeSymbol { BaseTypeNoUseSiteDiagnostics: { } baseTypeNoUseSiteDiagnostics } && (int)baseTypeNoUseSiteDiagnostics.SpecialType == 1)); PerformMemberOverloadResolution(resultsBuilder, members, typeArguments, receiver, arguments, completeResults: false, isMethodGroupConversion, returnRefKind, returnType, allowRefOmittedArguments, isFunctionPointerResolution, in callingConventionInfo, ref useSiteInfo, inferWithDynamic, allowUnexpandedForm, checkOverriddenOrHidden); if (!OverloadResolutionResultIsValid(resultsBuilder, arguments.HasDynamicArgument)) { result.Clear(); PerformMemberOverloadResolution(resultsBuilder, members, typeArguments, receiver, arguments, completeResults: true, isMethodGroupConversion, returnRefKind, returnType, allowRefOmittedArguments, isFunctionPointerResolution, in callingConventionInfo, ref useSiteInfo, inferWithDynamic: false, allowUnexpandedForm, checkOverriddenOrHidden); } } private static bool OverloadResolutionResultIsValid(ArrayBuilder> results, bool hasDynamicArgument) where TMember : Symbol { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (hasDynamicArgument) { Enumerator> enumerator = results.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current.Result.IsApplicable) { return true; } } return false; } return SingleValidResult(results); } private void PerformMemberOverloadResolution(ArrayBuilder> results, ArrayBuilder members, ArrayBuilder typeArguments, BoundExpression receiver, AnalyzedArguments arguments, bool completeResults, bool isMethodGroupConversion, RefKind returnRefKind, TypeSymbol returnType, bool allowRefOmittedArguments, bool isFunctionPointerResolution, in CallingConventionInfo callingConventionInfo, ref CompoundUseSiteInfo useSiteInfo, bool inferWithDynamic, bool allowUnexpandedForm, bool checkOverriddenOrHidden) where TMember : Symbol { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) Dictionary> containingTypeMapOpt = null; if (checkOverriddenOrHidden && members.Count > 50) { containingTypeMapOpt = PartitionMembersByContainingType(members); } for (int i = 0; i < members.Count; i++) { AddMemberToCandidateSet(members[i], results, members, typeArguments, arguments, completeResults, isMethodGroupConversion, allowRefOmittedArguments, containingTypeMapOpt, inferWithDynamic, ref useSiteInfo, allowUnexpandedForm, checkOverriddenOrHidden); } ClearContainingTypeMap(ref containingTypeMapOpt); RemoveInaccessibleTypeArguments(results, ref useSiteInfo); if (checkOverriddenOrHidden) { RemoveLessDerivedMembers(results, ref useSiteInfo); } if (Compilation.LanguageVersion.AllowImprovedOverloadCandidates()) { RemoveStaticInstanceMismatches(results, arguments, receiver); RemoveConstraintViolations(results, new CompoundUseSiteInfo(useSiteInfo)); if (isMethodGroupConversion) { RemoveDelegateConversionsWithWrongReturnType(results, ref useSiteInfo, returnRefKind, returnType, isFunctionPointerResolution); } } if (isFunctionPointerResolution) { RemoveCallingConventionMismatches(results, in callingConventionInfo); RemoveMethodsNotDeclaredStatic(results); } ReportUseSiteInfo(results, ref useSiteInfo); if (AnyValidResult(results)) { RemoveWorseMembers(results, arguments, ref useSiteInfo); } } internal void FunctionPointerOverloadResolution(ArrayBuilder funcPtrBuilder, AnalyzedArguments analyzedArguments, OverloadResolutionResult overloadResolutionResult, ref CompoundUseSiteInfo useSiteInfo) { ArrayBuilder instance = ArrayBuilder.GetInstance(); AddMemberToCandidateSet(funcPtrBuilder[0], overloadResolutionResult.ResultsBuilder, funcPtrBuilder, instance, analyzedArguments, completeResults: true, isMethodGroupConversion: false, allowRefOmittedArguments: false, null, inferWithDynamic: false, ref useSiteInfo, allowUnexpandedForm: true); ReportUseSiteInfo(overloadResolutionResult.ResultsBuilder, ref useSiteInfo); } private void RemoveStaticInstanceMismatches(ArrayBuilder> results, AnalyzedArguments arguments, BoundExpression receiverOpt) where TMember : Symbol { if (!arguments.IsExtensionMethodInvocation && !Binder.IsTypeOrValueExpression(receiverOpt)) { bool flag = Binder.WasImplicitReceiver(receiverOpt); bool inStaticContext; bool flag2 = !_binder.HasThis(!flag, out inStaticContext) || inStaticContext; if (!flag || flag2) { bool requireStatic = (flag && flag2) || Binder.IsMemberAccessedThroughType(receiverOpt); RemoveStaticInstanceMismatches(results, requireStatic); } } } private static void RemoveStaticInstanceMismatches(ArrayBuilder> results, bool requireStatic) where TMember : Symbol { for (int i = 0; i < results.Count; i++) { MemberResolutionResult memberResolutionResult = results[i]; TMember member = memberResolutionResult.Member; if (memberResolutionResult.Result.IsValid && member.RequiresInstanceReceiver() == requireStatic) { results[i] = memberResolutionResult.WithResult(MemberAnalysisResult.StaticInstanceMismatch()); } } } private static void RemoveMethodsNotDeclaredStatic(ArrayBuilder> results) where TMember : Symbol { for (int i = 0; i < results.Count; i++) { MemberResolutionResult memberResolutionResult = results[i]; TMember member = memberResolutionResult.Member; if (memberResolutionResult.Result.IsValid && !member.IsStatic) { results[i] = memberResolutionResult.WithResult(MemberAnalysisResult.StaticInstanceMismatch()); } } } private void RemoveConstraintViolations(ArrayBuilder> results, CompoundUseSiteInfo template) where TMember : Symbol { //IL_0060: Unknown result type (might be due to invalid IL or missing references) if (typeof(TMember) != typeof(MethodSymbol)) { return; } for (int i = 0; i < results.Count; i++) { MemberResolutionResult memberResolutionResult = results[i]; MethodSymbol method = (MethodSymbol)(object)memberResolutionResult.Member; if ((memberResolutionResult.Result.IsValid || memberResolutionResult.Result.Kind == MemberResolutionKind.ConstructedParameterFailedConstraintCheck) && FailsConstraintChecks(method, out var constraintFailureDiagnosticsOpt, template)) { results[i] = memberResolutionResult.WithResult(MemberAnalysisResult.ConstraintFailure(constraintFailureDiagnosticsOpt.ToImmutableAndFree())); } } } private void RemoveCallingConventionMismatches(ArrayBuilder> results, in CallingConventionInfo expectedConvention) where TMember : Symbol { //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) if (typeof(TMember) != typeof(MethodSymbol) || _binder.InAttributeArgument || (_binder.Flags & BinderFlags.InContextualAttributeBinder) != BinderFlags.None) { return; } for (int i = 0; i < results.Count; i++) { MemberResolutionResult result = results[i]; MethodSymbol methodSymbol = (MethodSymbol)(object)result.Member; if (!result.Result.IsValid) { continue; } UnmanagedCallersOnlyAttributeData unmanagedCallersOnlyAttributeData = methodSymbol.GetUnmanagedCallersOnlyAttributeData(forceComplete: true); CallingConvention val; ImmutableHashSet immutableHashSet; ImmutableHashSet callingConventionTypes; if (unmanagedCallersOnlyAttributeData == null) { val = methodSymbol.CallingConvention; immutableHashSet = ImmutableHashSet.Empty; } else { callingConventionTypes = unmanagedCallersOnlyAttributeData.CallingConventionTypes; int count = callingConventionTypes.Count; if (count != 0) { if (count != 1) { goto IL_013b; } switch (((ISymbolInternal)callingConventionTypes.Single()).Name) { case "CallConvCdecl": break; case "CallConvStdcall": goto IL_0117; case "CallConvThiscall": goto IL_0123; case "CallConvFastcall": goto IL_012f; default: goto IL_013b; } val = (CallingConvention)1; immutableHashSet = ImmutableHashSet.Empty; } else { val = (CallingConvention)9; immutableHashSet = ImmutableHashSet.Empty; } } goto IL_0143; IL_013b: val = (CallingConvention)9; immutableHashSet = callingConventionTypes; goto IL_0143; IL_012f: val = (CallingConvention)4; immutableHashSet = ImmutableHashSet.Empty; goto IL_0143; IL_0123: val = (CallingConvention)3; immutableHashSet = ImmutableHashSet.Empty; goto IL_0143; IL_0117: val = (CallingConvention)2; immutableHashSet = ImmutableHashSet.Empty; goto IL_0143; IL_0143: if (CallingConventionUtils.HasUnknownCallingConventionAttributeBits(val) || !CallingConventionUtils.IsCallingConvention(val, expectedConvention.CallKind)) { results[i] = makeWrongCallingConvention(result); } else { if (!CallingConventionUtils.IsCallingConvention(expectedConvention.CallKind, (CallingConvention)9)) { continue; } if (expectedConvention.UnmanagedCallingConventionTypes.Count != immutableHashSet.Count) { results[i] = makeWrongCallingConvention(result); continue; } foreach (CustomModifier unmanagedCallingConventionType in expectedConvention.UnmanagedCallingConventionTypes) { if (!immutableHashSet.Contains((INamedTypeSymbolInternal)(object)((CSharpCustomModifier)(object)unmanagedCallingConventionType).ModifierSymbol)) { results[i] = makeWrongCallingConvention(result); break; } } } } static MemberResolutionResult makeWrongCallingConvention(MemberResolutionResult memberResolutionResult) { return memberResolutionResult.WithResult(MemberAnalysisResult.WrongCallingConvention()); } } private bool FailsConstraintChecks(MethodSymbol method, out ArrayBuilder constraintFailureDiagnosticsOpt, CompoundUseSiteInfo template) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) if (method.Arity == 0 || (object)method.OriginalDefinition == method) { constraintFailureDiagnosticsOpt = null; return false; } ArrayBuilder instance = ArrayBuilder.GetInstance(); ArrayBuilder useSiteDiagnosticsBuilder = null; if (!ConstraintsHelper.CheckMethodConstraints(method, new ConstraintsHelper.CheckConstraintsArgs(Compilation, Conversions, includeNullability: false, NoLocation.Singleton, null, template), instance, null, ref useSiteDiagnosticsBuilder)) { if (useSiteDiagnosticsBuilder != null) { instance.AddRange(useSiteDiagnosticsBuilder); useSiteDiagnosticsBuilder.Free(); } constraintFailureDiagnosticsOpt = instance; return true; } instance.Free(); useSiteDiagnosticsBuilder?.Free(); constraintFailureDiagnosticsOpt = null; return false; } private void RemoveDelegateConversionsWithWrongReturnType(ArrayBuilder> results, ref CompoundUseSiteInfo useSiteInfo, RefKind? returnRefKind, TypeSymbol returnType, bool isFunctionPointerConversion) where TMember : Symbol { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < results.Count; i++) { MemberResolutionResult memberResolutionResult = results[i]; if (!memberResolutionResult.Result.IsValid) { continue; } MethodSymbol methodSymbol = (MethodSymbol)(object)memberResolutionResult.Member; bool flag; if ((object)returnType == null || methodSymbol.ReturnType.Equals(returnType, (TypeCompareKind)63)) { flag = true; } else if (returnRefKind == (RefKind?)0) { flag = Conversions.HasIdentityOrImplicitReferenceConversion(methodSymbol.ReturnType, returnType, ref useSiteInfo); if (!flag && isFunctionPointerConversion) { flag = ConversionsBase.HasImplicitPointerToVoidConversion(methodSymbol.ReturnType, returnType) || Conversions.HasImplicitPointerConversion(methodSymbol.ReturnType, returnType, ref useSiteInfo); } } else { flag = false; } if (!flag) { results[i] = memberResolutionResult.WithResult(MemberAnalysisResult.WrongReturnType()); } else if ((RefKind?)methodSymbol.RefKind != returnRefKind) { results[i] = memberResolutionResult.WithResult(MemberAnalysisResult.WrongRefKind()); } } } private static Dictionary> PartitionMembersByContainingType(ArrayBuilder members) where TMember : Symbol { Dictionary> dictionary = new Dictionary>(); for (int i = 0; i < members.Count; i++) { TMember val = members[i]; NamedTypeSymbol containingType = val.ContainingType; if (!dictionary.TryGetValue(containingType, out var value)) { value = (dictionary[containingType] = ArrayBuilder.GetInstance()); } value.Add(val); } return dictionary; } private static void ClearContainingTypeMap(ref Dictionary> containingTypeMapOpt) where TMember : Symbol { if (containingTypeMapOpt == null) { return; } foreach (ArrayBuilder value in containingTypeMapOpt.Values) { value.Free(); } containingTypeMapOpt = null; } private void AddConstructorToCandidateSet(MethodSymbol constructor, ArrayBuilder> results, AnalyzedArguments arguments, bool completeResults, ref CompoundUseSiteInfo useSiteInfo) { if (constructor.HasUnsupportedMetadata) { if (completeResults) { results.Add(new MemberResolutionResult(constructor, constructor, MemberAnalysisResult.UnsupportedMetadata(), hasTypeArgumentInferredFromFunctionType: false)); } return; } MemberAnalysisResult memberAnalysisResult = IsConstructorApplicableInNormalForm(constructor, arguments, completeResults, ref useSiteInfo); MemberAnalysisResult result = memberAnalysisResult; if (!memberAnalysisResult.IsValid && IsValidParams(constructor)) { MemberAnalysisResult memberAnalysisResult2 = IsConstructorApplicableInExpandedForm(constructor, arguments, completeResults, ref useSiteInfo); if (memberAnalysisResult2.IsValid || completeResults) { result = memberAnalysisResult2; } } if (result.IsValid || completeResults || result.HasUseSiteDiagnosticToReportFor(constructor)) { results.Add(new MemberResolutionResult(constructor, constructor, result, hasTypeArgumentInferredFromFunctionType: false)); } } private MemberAnalysisResult IsConstructorApplicableInNormalForm(MethodSymbol constructor, AnalyzedArguments arguments, bool completeResults, ref CompoundUseSiteInfo useSiteInfo) { ArgumentAnalysisResult argAnalysis = AnalyzeArguments(constructor, arguments, isMethodGroupConversion: false, expanded: false); if (!argAnalysis.IsValid) { return MemberAnalysisResult.ArgumentParameterMismatch(argAnalysis); } if (constructor.HasUseSiteError) { return MemberAnalysisResult.UseSiteError(); } EffectiveParameters effectiveParametersInNormalForm = GetEffectiveParametersInNormalForm(constructor, arguments.Arguments.Count, argAnalysis.ArgsToParamsOpt, arguments.RefKinds, isMethodGroupConversion: false, allowRefOmittedArguments: false); return IsApplicable(constructor, effectiveParametersInNormalForm, arguments, argAnalysis.ArgsToParamsOpt, constructor.IsVararg, hasAnyRefOmittedArgument: false, ignoreOpenTypes: false, completeResults, ref useSiteInfo); } private MemberAnalysisResult IsConstructorApplicableInExpandedForm(MethodSymbol constructor, AnalyzedArguments arguments, bool completeResults, ref CompoundUseSiteInfo useSiteInfo) { ArgumentAnalysisResult argAnalysis = AnalyzeArguments(constructor, arguments, isMethodGroupConversion: false, expanded: true); if (!argAnalysis.IsValid) { return MemberAnalysisResult.ArgumentParameterMismatch(argAnalysis); } if (constructor.HasUseSiteError) { return MemberAnalysisResult.UseSiteError(); } EffectiveParameters effectiveParametersInExpandedForm = GetEffectiveParametersInExpandedForm(constructor, arguments.Arguments.Count, argAnalysis.ArgsToParamsOpt, arguments.RefKinds, isMethodGroupConversion: false, allowRefOmittedArguments: false); MemberAnalysisResult result = IsApplicable(constructor, effectiveParametersInExpandedForm, arguments, argAnalysis.ArgsToParamsOpt, isVararg: false, hasAnyRefOmittedArgument: false, ignoreOpenTypes: false, completeResults, ref useSiteInfo); if (!result.IsValid) { return result; } return MemberAnalysisResult.ExpandedForm(result.ArgsToParamsOpt, result.ConversionsOpt, hasAnyRefOmittedArgument: false); } private void AddMemberToCandidateSet(TMember member, ArrayBuilder> results, ArrayBuilder members, ArrayBuilder typeArguments, AnalyzedArguments arguments, bool completeResults, bool isMethodGroupConversion, bool allowRefOmittedArguments, Dictionary> containingTypeMapOpt, bool inferWithDynamic, ref CompoundUseSiteInfo useSiteInfo, bool allowUnexpandedForm, bool checkOverriddenOrHidden = true) where TMember : Symbol { if (checkOverriddenOrHidden && members.Count >= 2) { if (containingTypeMapOpt == null) { if (MemberGroupContainsMoreDerivedOverride(members, member, checkOverrideContainingType: true, ref useSiteInfo) || MemberGroupHidesByName(members, member, ref useSiteInfo)) { return; } } else if (containingTypeMapOpt.Count != 1) { NamedTypeSymbol containingType = member.ContainingType; foreach (KeyValuePair> item in containingTypeMapOpt) { if (item.Key.IsDerivedFrom(containingType, (TypeCompareKind)0, ref useSiteInfo)) { ArrayBuilder value = item.Value; if (MemberGroupContainsMoreDerivedOverride(value, member, checkOverrideContainingType: false, ref useSiteInfo) || MemberGroupHidesByName(value, member, ref useSiteInfo)) { return; } } } } } TMember val = (TMember)member.GetLeastOverriddenMember(_binder.ContainingType); if (member.HasUnsupportedMetadata) { if (completeResults) { results.Add(new MemberResolutionResult(member, val, MemberAnalysisResult.UnsupportedMetadata(), hasTypeArgumentInferredFromFunctionType: false)); } return; } MemberResolutionResult memberResolutionResult = ((allowUnexpandedForm || !IsValidParams(val)) ? IsMemberApplicableInNormalForm(member, val, typeArguments, arguments, isMethodGroupConversion, allowRefOmittedArguments, inferWithDynamic, completeResults, ref useSiteInfo) : default(MemberResolutionResult)); MemberResolutionResult memberResolutionResult2 = memberResolutionResult; if (!memberResolutionResult.Result.IsValid && !isMethodGroupConversion && IsValidParams(val)) { MemberResolutionResult memberResolutionResult3 = IsMemberApplicableInExpandedForm(member, val, typeArguments, arguments, allowRefOmittedArguments, completeResults, ref useSiteInfo); if (PreferExpandedFormOverNormalForm(memberResolutionResult.Result, memberResolutionResult3.Result)) { memberResolutionResult2 = memberResolutionResult3; } } if (memberResolutionResult2.Result.IsValid || completeResults || memberResolutionResult2.HasUseSiteDiagnosticToReport) { results.Add(memberResolutionResult2); } else { memberResolutionResult2.Member.AddUseSiteInfo(ref useSiteInfo, addDiagnostics: false); } } private static bool PreferExpandedFormOverNormalForm(MemberAnalysisResult normalResult, MemberAnalysisResult expandedResult) { if (expandedResult.IsValid) { return true; } MemberResolutionKind kind = normalResult.Kind; if (kind == MemberResolutionKind.NoCorrespondingParameter || kind == MemberResolutionKind.RequiredParameterMissing) { switch (expandedResult.Kind) { case MemberResolutionKind.NoCorrespondingNamedParameter: case MemberResolutionKind.DuplicateNamedArgument: case MemberResolutionKind.NameUsedForPositional: case MemberResolutionKind.BadNonTrailingNamedArgument: case MemberResolutionKind.UseSiteError: case MemberResolutionKind.BadArgumentConversion: case MemberResolutionKind.TypeInferenceFailed: case MemberResolutionKind.TypeInferenceExtensionInstanceArgument: case MemberResolutionKind.ConstructedParameterFailedConstraintCheck: return true; } } return false; } public static bool IsValidParams(Symbol member) { if (member.GetIsVararg()) { return false; } if (member.GetParameterCount() == 0) { return false; } return IsValidParamsParameter(member.GetParameters().Last()); } public static bool IsValidParamsParameter(ParameterSymbol final) { if (final.IsParams) { return final.OriginalDefinition.Type.IsSZArray(); } return false; } private static bool IsMoreDerivedOverride(Symbol member, Symbol moreDerivedOverride, bool checkOverrideContainingType, ref CompoundUseSiteInfo useSiteInfo) { if (!moreDerivedOverride.IsOverride || (checkOverrideContainingType && !moreDerivedOverride.ContainingType.IsDerivedFrom(member.ContainingType, (TypeCompareKind)0, ref useSiteInfo)) || !MemberSignatureComparer.SloppyOverrideComparer.Equals(member, moreDerivedOverride)) { return false; } return moreDerivedOverride.GetLeastOverriddenMember(null).OriginalDefinition == member.GetLeastOverriddenMember(null).OriginalDefinition; } private static bool MemberGroupContainsMoreDerivedOverride(ArrayBuilder members, TMember member, bool checkOverrideContainingType, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { if (!member.IsVirtual && !member.IsAbstract && !member.IsOverride) { return false; } if (!member.ContainingType.IsClassType()) { return false; } for (int i = 0; i < members.Count; i++) { if (IsMoreDerivedOverride(member, members[i], checkOverrideContainingType, ref useSiteInfo)) { return true; } } return false; } private static bool MemberGroupHidesByName(ArrayBuilder members, TMember member, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) NamedTypeSymbol containingType = member.ContainingType; Enumerator enumerator = members.GetEnumerator(); while (enumerator.MoveNext()) { TMember current = enumerator.Current; NamedTypeSymbol containingType2 = current.ContainingType; if (HidesByName(current) && containingType2.IsDerivedFrom(containingType, (TypeCompareKind)0, ref useSiteInfo)) { return true; } } return false; } private static bool HidesByName(Symbol member) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Invalid comparison between Unknown and I4 //IL_002c: Unknown result type (might be due to invalid IL or missing references) SymbolKind kind = member.Kind; if ((int)kind != 9) { if ((int)kind == 15) { return ((PropertySymbol)member).HidesBasePropertiesByName; } throw ExceptionUtilities.UnexpectedValue((object)member.Kind); } return ((MethodSymbol)member).HidesBaseMethodsByName; } private void RemoveInaccessibleTypeArguments(ArrayBuilder> results, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { for (int i = 0; i < results.Count; i++) { MemberResolutionResult memberResolutionResult = results[i]; if (memberResolutionResult.Result.IsValid && !TypeArgumentsAccessible(memberResolutionResult.Member.GetMemberTypeArgumentsNoUseSiteDiagnostics(), ref useSiteInfo)) { results[i] = memberResolutionResult.WithResult(MemberAnalysisResult.InaccessibleTypeArgument()); } } } private bool TypeArgumentsAccessible(ImmutableArray typeArguments, ref CompoundUseSiteInfo useSiteInfo) { ImmutableArray.Enumerator enumerator = typeArguments.GetEnumerator(); while (enumerator.MoveNext()) { TypeSymbol current = enumerator.Current; if (!_binder.IsAccessible(current, ref useSiteInfo)) { return false; } } return true; } private static void RemoveLessDerivedMembers(ArrayBuilder> results, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { RemoveAllInterfaceMembers(results); for (int i = 0; i < results.Count; i++) { MemberResolutionResult memberResolutionResult = results[i]; if ((memberResolutionResult.Result.IsValid || memberResolutionResult.HasUseSiteDiagnosticToReport) && IsLessDerivedThanAny(i, memberResolutionResult.LeastOverriddenMember.ContainingType, results, ref useSiteInfo)) { results[i] = memberResolutionResult.WithResult(MemberAnalysisResult.LessDerived()); } } } private static bool IsLessDerivedThanAny(int index, TypeSymbol type, ArrayBuilder> results, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Invalid comparison between Unknown and I4 //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Invalid comparison between Unknown and I4 for (int i = 0; i < results.Count; i++) { if (i == index) { continue; } MemberResolutionResult memberResolutionResult = results[i]; if (memberResolutionResult.Result.IsValid) { NamedTypeSymbol containingType = memberResolutionResult.LeastOverriddenMember.ContainingType; if ((int)type.SpecialType == 1 && (int)containingType.SpecialType != 1) { return true; } if (containingType.IsInterfaceType() && type.IsInterfaceType() && containingType.AllInterfacesWithDefinitionUseSiteDiagnostics(ref useSiteInfo).Contains((NamedTypeSymbol)type)) { return true; } if (containingType.IsClassType() && type.IsClassType() && containingType.IsDerivedFrom(type, (TypeCompareKind)0, ref useSiteInfo)) { return true; } } } return false; } private static void RemoveAllInterfaceMembers(ArrayBuilder> results) where TMember : Symbol { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Invalid comparison between Unknown and I4 bool flag = false; for (int i = 0; i < results.Count; i++) { MemberResolutionResult memberResolutionResult = results[i]; if (memberResolutionResult.Result.IsValid) { NamedTypeSymbol containingType = memberResolutionResult.LeastOverriddenMember.ContainingType; if (containingType.IsClassType() && (int)containingType.GetSpecialTypeSafe() != 1) { flag = true; break; } } } if (!flag) { return; } for (int j = 0; j < results.Count; j++) { MemberResolutionResult memberResolutionResult2 = results[j]; if (memberResolutionResult2.Result.IsValid && memberResolutionResult2.Member.ContainingType.IsInterfaceType()) { results[j] = memberResolutionResult2.WithResult(MemberAnalysisResult.LessDerived()); } } } private void PerformObjectCreationOverloadResolution(ArrayBuilder> results, ImmutableArray constructors, AnalyzedArguments arguments, bool completeResults, ref CompoundUseSiteInfo useSiteInfo) { ImmutableArray.Enumerator enumerator = constructors.GetEnumerator(); while (enumerator.MoveNext()) { MethodSymbol current = enumerator.Current; AddConstructorToCandidateSet(current, results, arguments, completeResults, ref useSiteInfo); } ReportUseSiteInfo(results, ref useSiteInfo); RemoveWorseMembers(results, arguments, ref useSiteInfo); } private static void ReportUseSiteInfo(ArrayBuilder> results, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Enumerator> enumerator = results.GetEnumerator(); while (enumerator.MoveNext()) { MemberResolutionResult current = enumerator.Current; current.Member.AddUseSiteInfo(ref useSiteInfo, current.HasUseSiteDiagnosticToReport); } } private int GetTheBestCandidateIndex(ArrayBuilder> results, AnalyzedArguments arguments, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { int num = -1; for (int i = 0; i < results.Count; i++) { if (!results[i].IsValid) { continue; } if (num == -1) { num = i; continue; } if (results[num].Member == results[i].Member) { num = -1; continue; } switch (BetterFunctionMember(results[num], results[i], arguments.Arguments, ref useSiteInfo)) { case BetterResult.Right: num = i; break; default: num = -1; break; case BetterResult.Left: break; } } for (int j = 0; j < num; j++) { if (results[j].IsValid) { if (results[num].Member == results[j].Member) { return -1; } if (BetterFunctionMember(results[num], results[j], arguments.Arguments, ref useSiteInfo) != BetterResult.Left) { return -1; } } } return num; } private void RemoveWorseMembers(ArrayBuilder> results, AnalyzedArguments arguments, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { if (SingleValidResult(results)) { return; } int theBestCandidateIndex = GetTheBestCandidateIndex(results, arguments, ref useSiteInfo); if (theBestCandidateIndex != -1) { for (int i = 0; i < results.Count; i++) { if (results[i].IsValid && i != theBestCandidateIndex) { results[i] = results[i].Worse(); } } return; } ArrayBuilder instance = ArrayBuilder.GetInstance(results.Count, 0); int num = 0; int num2 = -1; for (int j = 0; j < results.Count; j++) { MemberResolutionResult m = results[j]; if (!m.IsValid || instance[j] == 1) { continue; } for (int k = 0; k < results.Count; k++) { MemberResolutionResult m2 = results[k]; if (m2.IsValid && j != k && !(m.Member == m2.Member)) { switch (BetterFunctionMember(m, m2, arguments.Arguments, ref useSiteInfo)) { case BetterResult.Left: instance[k] = 1; continue; case BetterResult.Right: break; default: continue; } instance[j] = 1; break; } } if (instance[j] == 0) { instance[j] = 2; num++; num2 = j; } } switch (num) { case 0: { for (int n = 0; n < instance.Count; n++) { if (instance[n] == 1) { results[n] = results[n].Worse(); } } break; } case 1: { for (int num3 = 0; num3 < instance.Count; num3++) { if (instance[num3] == 1) { results[num3] = ((BetterFunctionMember(results[num2], results[num3], arguments.Arguments, ref useSiteInfo) == BetterResult.Left) ? results[num3].Worst() : results[num3].Worse()); } } results[num2] = results[num2].Worse(); break; } default: { for (int l = 0; l < instance.Count; l++) { if (instance[l] == 1) { results[l] = results[l].Worst(); } else if (instance[l] == 2) { results[l] = results[l].Worse(); } } break; } } instance.Free(); } private static TypeSymbol GetParameterType(ParameterSymbol parameter, MemberAnalysisResult result) { TypeSymbol type = parameter.Type; if (result.Kind == MemberResolutionKind.ApplicableInExpandedForm && parameter.IsParams && type.IsSZArray()) { return ((ArrayTypeSymbol)type).ElementType; } return type; } private static ParameterSymbol GetParameter(int argIndex, MemberAnalysisResult result, ImmutableArray parameters) { int index = result.ParameterFromArgument(argIndex); return parameters[index]; } private BetterResult BetterFunctionMember(MemberResolutionResult m1, MemberResolutionResult m2, ArrayBuilder arguments, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { bool num = RequiredFunctionType(m1); bool flag = RequiredFunctionType(m2); if (!num) { if (flag) { return BetterResult.Left; } } else if (!flag) { return BetterResult.Right; } bool hasAnyRefOmittedArgument = m1.Result.HasAnyRefOmittedArgument; bool hasAnyRefOmittedArgument2 = m2.Result.HasAnyRefOmittedArgument; if (hasAnyRefOmittedArgument != hasAnyRefOmittedArgument2) { if (!hasAnyRefOmittedArgument) { return BetterResult.Left; } return BetterResult.Right; } return BetterFunctionMember(m1, m2, arguments, hasAnyRefOmittedArgument, ref useSiteInfo); } private BetterResult BetterFunctionMember(MemberResolutionResult m1, MemberResolutionResult m2, ArrayBuilder arguments, bool considerRefKinds, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_03f5: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_03fc: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Unknown result type (might be due to invalid IL or missing references) //IL_04f8: Unknown result type (might be due to invalid IL or missing references) //IL_04ff: Invalid comparison between Unknown and I4 //IL_0512: Unknown result type (might be due to invalid IL or missing references) //IL_0519: Invalid comparison between Unknown and I4 BetterResult betterResult = BetterResult.Neither; bool flag = false; bool flag2 = false; ImmutableArray parameters = m1.LeastOverriddenMember.GetParameters(); ImmutableArray parameters2 = m2.LeastOverriddenMember.GetParameters(); bool flag3 = true; int i; for (i = 0; i < arguments.Count; i++) { if (arguments[i].Kind == BoundKind.ArgListOperator) { continue; } ParameterSymbol parameter = GetParameter(i, m1.Result, parameters); TypeSymbol parameterType = GetParameterType(parameter, m1.Result); ParameterSymbol parameter2 = GetParameter(i, m2.Result, parameters2); TypeSymbol parameterType2 = GetParameterType(parameter2, m2.Result); bool okToDowngradeToNeither; BetterResult betterResult2 = BetterConversionFromExpression(arguments[i], parameterType, m1.Result.ConversionForArg(i), parameter.RefKind, parameterType2, m2.Result.ConversionForArg(i), parameter2.RefKind, considerRefKinds, ref useSiteInfo, out okToDowngradeToNeither); TypeSymbol source = parameterType; TypeSymbol destination = parameterType2; if (!_binder.InAttributeArgument) { source = parameterType.NormalizeTaskTypes(Compilation); destination = parameterType2.NormalizeTaskTypes(Compilation); } if (betterResult2 == BetterResult.Neither) { if (flag3 && Conversions.ClassifyImplicitConversionFromType(source, destination, ref useSiteInfo).Kind != ConversionKind.Identity) { flag3 = false; } continue; } if (Conversions.ClassifyImplicitConversionFromType(source, destination, ref useSiteInfo).Kind != ConversionKind.Identity) { flag3 = false; } if (betterResult == BetterResult.Neither) { if (!(flag2 && okToDowngradeToNeither)) { betterResult = betterResult2; flag = okToDowngradeToNeither; } } else if (betterResult != betterResult2) { if (flag) { if (okToDowngradeToNeither) { betterResult = BetterResult.Neither; flag = false; flag2 = true; } else { betterResult = betterResult2; flag = false; } } else if (!okToDowngradeToNeither) { betterResult = BetterResult.Neither; break; } } else { flag = flag && okToDowngradeToNeither; } } if (betterResult != BetterResult.Neither) { return betterResult; } GetParameterCounts(m1, arguments, out var declaredParameterCount, out var parametersUsedIncludingExpansionAndOptional); GetParameterCounts(m2, arguments, out var declaredParameterCount2, out var parametersUsedIncludingExpansionAndOptional2); if (flag3 && parametersUsedIncludingExpansionAndOptional == parametersUsedIncludingExpansionAndOptional2) { for (i++; i < arguments.Count; i++) { if (arguments[i].Kind != BoundKind.ArgListOperator) { TypeSymbol parameterType3 = GetParameterType(GetParameter(i, m1.Result, parameters), m1.Result); TypeSymbol parameterType4 = GetParameterType(GetParameter(i, m2.Result, parameters2), m2.Result); TypeSymbol source2 = parameterType3; TypeSymbol destination2 = parameterType4; if (!_binder.InAttributeArgument) { source2 = parameterType3.NormalizeTaskTypes(Compilation); destination2 = parameterType4.NormalizeTaskTypes(Compilation); } if (Conversions.ClassifyImplicitConversionFromType(source2, destination2, ref useSiteInfo).Kind != ConversionKind.Identity) { flag3 = false; break; } } } } if (!flag3 || parametersUsedIncludingExpansionAndOptional != parametersUsedIncludingExpansionAndOptional2) { if (parametersUsedIncludingExpansionAndOptional != parametersUsedIncludingExpansionAndOptional2) { if (m1.Result.Kind == MemberResolutionKind.ApplicableInExpandedForm) { if (m2.Result.Kind != MemberResolutionKind.ApplicableInExpandedForm) { return BetterResult.Right; } } else if (m2.Result.Kind == MemberResolutionKind.ApplicableInExpandedForm) { return BetterResult.Left; } if (parametersUsedIncludingExpansionAndOptional == arguments.Count) { return BetterResult.Left; } if (parametersUsedIncludingExpansionAndOptional2 == arguments.Count) { return BetterResult.Right; } } return PreferValOverInOrRefInterpolatedHandlerParameters(arguments, m1, parameters, m2, parameters2); } if (m1.Member.GetMemberArity() == 0) { if (m2.Member.GetMemberArity() > 0) { return BetterResult.Left; } } else if (m2.Member.GetMemberArity() == 0) { return BetterResult.Right; } if (m1.Result.Kind == MemberResolutionKind.ApplicableInNormalForm && m2.Result.Kind == MemberResolutionKind.ApplicableInExpandedForm) { return BetterResult.Left; } if (m1.Result.Kind == MemberResolutionKind.ApplicableInExpandedForm && m2.Result.Kind == MemberResolutionKind.ApplicableInNormalForm) { return BetterResult.Right; } if (m1.Result.Kind == MemberResolutionKind.ApplicableInExpandedForm && m2.Result.Kind == MemberResolutionKind.ApplicableInExpandedForm) { if (declaredParameterCount > declaredParameterCount2) { return BetterResult.Left; } if (declaredParameterCount < declaredParameterCount2) { return BetterResult.Right; } } bool flag4 = m1.Result.Kind == MemberResolutionKind.ApplicableInExpandedForm || declaredParameterCount == arguments.Count; bool flag5 = m2.Result.Kind == MemberResolutionKind.ApplicableInExpandedForm || declaredParameterCount2 == arguments.Count; if (flag4 && !flag5) { return BetterResult.Left; } if (!flag4 && flag5) { return BetterResult.Right; } TemporaryArray empty = TemporaryArray.Empty; try { TemporaryArray empty2 = TemporaryArray.Empty; try { ImmutableArray parameters3 = m1.LeastOverriddenMember.OriginalDefinition.GetParameters(); ImmutableArray parameters4 = m2.LeastOverriddenMember.OriginalDefinition.GetParameters(); for (i = 0; i < arguments.Count; i++) { if (arguments[i].Kind != BoundKind.ArgListOperator) { ParameterSymbol parameter3 = GetParameter(i, m1.Result, parameters3); empty.Add(GetParameterType(parameter3, m1.Result)); ParameterSymbol parameter4 = GetParameter(i, m2.Result, parameters4); empty2.Add(GetParameterType(parameter4, m2.Result)); } } betterResult = MoreSpecificType(ref TemporaryArrayExtensions.AsRef(ref empty), ref TemporaryArrayExtensions.AsRef(ref empty2), ref useSiteInfo); if (betterResult != BetterResult.Neither) { return betterResult; } } finally { ((IDisposable)empty2/*cast due to constrained. prefix*/).Dispose(); } } finally { ((IDisposable)empty/*cast due to constrained. prefix*/).Dispose(); } if ((int)m1.Member.ContainingType.TypeKind == 12 && (int)m2.Member.ContainingType.TypeKind == 12) { CSharpCompilation declaringCompilation = m1.Member.DeclaringCompilation; CSharpCompilation declaringCompilation2 = m2.Member.DeclaringCompilation; int submissionSlotIndex = ((Compilation)declaringCompilation).GetSubmissionSlotIndex(); int submissionSlotIndex2 = ((Compilation)declaringCompilation2).GetSubmissionSlotIndex(); if (submissionSlotIndex > submissionSlotIndex2) { return BetterResult.Left; } if (submissionSlotIndex < submissionSlotIndex2) { return BetterResult.Right; } } int num = m1.LeastOverriddenMember.CustomModifierCount(); int num2 = m2.LeastOverriddenMember.CustomModifierCount(); if (num != num2) { if (num >= num2) { return BetterResult.Right; } return BetterResult.Left; } return PreferValOverInOrRefInterpolatedHandlerParameters(arguments, m1, parameters, m2, parameters2); } private static bool RequiredFunctionType(MemberResolutionResult m) where TMember : Symbol { if (m.HasTypeArgumentInferredFromFunctionType) { return true; } ImmutableArray conversionsOpt = m.Result.ConversionsOpt; if (conversionsOpt.IsDefault) { return false; } return conversionsOpt.Any((Conversion c) => c.Kind == ConversionKind.FunctionType); } private static BetterResult PreferValOverInOrRefInterpolatedHandlerParameters(ArrayBuilder arguments, MemberResolutionResult m1, ImmutableArray parameters1, MemberResolutionResult m2, ImmutableArray parameters2) where TMember : Symbol { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) BetterResult betterResult = BetterResult.Neither; for (int i = 0; i < arguments.Count; i++) { if (arguments[i].Kind == BoundKind.ArgListOperator) { continue; } ParameterSymbol parameter = GetParameter(i, m1.Result, parameters1); ParameterSymbol parameter2 = GetParameter(i, m2.Result, parameters2); bool isInterpolatedStringHandlerConversion = false; if (m1.IsValid && m2.IsValid) { Conversion conversion = m1.Result.ConversionForArg(i); Conversion conversion2 = m2.Result.ConversionForArg(i); isInterpolatedStringHandlerConversion = conversion.IsInterpolatedStringHandler && conversion2.IsInterpolatedStringHandler; } if ((int)parameter.RefKind == 0 && isAcceptableRefMismatch(parameter2.RefKind, isInterpolatedStringHandlerConversion)) { if (betterResult == BetterResult.Right) { return BetterResult.Neither; } betterResult = BetterResult.Left; } else if ((int)parameter2.RefKind == 0 && isAcceptableRefMismatch(parameter.RefKind, isInterpolatedStringHandlerConversion)) { if (betterResult == BetterResult.Left) { return BetterResult.Neither; } betterResult = BetterResult.Right; } } return betterResult; static bool isAcceptableRefMismatch(RefKind refKind, bool flag) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Invalid comparison between Unknown and I4 //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 if ((int)refKind != 1) { if (refKind - 3 <= 1) { return true; } } else if (flag) { return true; } return false; } } private static void GetParameterCounts(MemberResolutionResult m, ArrayBuilder arguments, out int declaredParameterCount, out int parametersUsedIncludingExpansionAndOptional) where TMember : Symbol { declaredParameterCount = m.Member.GetParameterCount(); if (m.Result.Kind == MemberResolutionKind.ApplicableInExpandedForm) { if (arguments.Count < declaredParameterCount) { ImmutableArray argsToParamsOpt = m.Result.ArgsToParamsOpt; if (argsToParamsOpt.IsDefaultOrEmpty || !argsToParamsOpt.Contains(declaredParameterCount - 1)) { parametersUsedIncludingExpansionAndOptional = declaredParameterCount - 1; } else { parametersUsedIncludingExpansionAndOptional = declaredParameterCount; } } else { parametersUsedIncludingExpansionAndOptional = arguments.Count; } } else { parametersUsedIncludingExpansionAndOptional = declaredParameterCount; } } private static BetterResult MoreSpecificType(ref TemporaryArray t1, ref TemporaryArray t2, ref CompoundUseSiteInfo useSiteInfo) { BetterResult betterResult = BetterResult.Neither; for (int i = 0; i < t1.Count; i++) { BetterResult betterResult2 = MoreSpecificType(t1[i], t2[i], ref useSiteInfo); if (betterResult2 != BetterResult.Neither) { if (betterResult == BetterResult.Neither) { betterResult = betterResult2; } else if (betterResult != betterResult2) { return BetterResult.Neither; } } } return betterResult; } private static BetterResult MoreSpecificType(TypeSymbol t1, TypeSymbol t2, ref CompoundUseSiteInfo useSiteInfo) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Invalid comparison between Unknown and I4 //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) bool flag = t1.IsTypeParameter(); bool flag2 = t2.IsTypeParameter(); if (flag && !flag2) { return BetterResult.Right; } if (!flag && flag2) { return BetterResult.Left; } if (flag && flag2) { return BetterResult.Neither; } if (t1.IsArray()) { ArrayTypeSymbol obj = (ArrayTypeSymbol)t1; return MoreSpecificType(t2: ((ArrayTypeSymbol)t2).ElementType, t1: obj.ElementType, useSiteInfo: ref useSiteInfo); } if ((int)t1.TypeKind == 9) { PointerTypeSymbol obj2 = (PointerTypeSymbol)t1; return MoreSpecificType(t2: ((PointerTypeSymbol)t2).PointedAtType, t1: obj2.PointedAtType, useSiteInfo: ref useSiteInfo); } if (t1.IsDynamic() || t2.IsDynamic()) { return BetterResult.Neither; } NamedTypeSymbol namedTypeSymbol = t1 as NamedTypeSymbol; NamedTypeSymbol namedTypeSymbol2 = t2 as NamedTypeSymbol; if ((object)namedTypeSymbol == null) { return BetterResult.Neither; } TemporaryArray empty = TemporaryArray.Empty; try { TemporaryArray empty2 = TemporaryArray.Empty; try { namedTypeSymbol.GetAllTypeArguments(ref TemporaryArrayExtensions.AsRef(ref empty), ref useSiteInfo); namedTypeSymbol2.GetAllTypeArguments(ref TemporaryArrayExtensions.AsRef(ref empty2), ref useSiteInfo); return MoreSpecificType(ref TemporaryArrayExtensions.AsRef(ref empty), ref TemporaryArrayExtensions.AsRef(ref empty2), ref useSiteInfo); } finally { ((IDisposable)empty2/*cast due to constrained. prefix*/).Dispose(); } } finally { ((IDisposable)empty/*cast due to constrained. prefix*/).Dispose(); } } private BetterResult BetterConversionFromExpression(BoundExpression node, TypeSymbol t1, TypeSymbol t2, ref CompoundUseSiteInfo useSiteInfo) { bool okToDowngradeToNeither; return BetterConversionFromExpression(node, t1, Conversions.ClassifyImplicitConversionFromExpression(node, t1, ref useSiteInfo), t2, Conversions.ClassifyImplicitConversionFromExpression(node, t2, ref useSiteInfo), ref useSiteInfo, out okToDowngradeToNeither); } private BetterResult BetterConversionFromExpression(BoundExpression node, TypeSymbol t1, Conversion conv1, RefKind refKind1, TypeSymbol t2, Conversion conv2, RefKind refKind2, bool considerRefKinds, ref CompoundUseSiteInfo useSiteInfo, out bool okToDowngradeToNeither) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Invalid comparison between Unknown and I4 //IL_000e: Unknown result type (might be due to invalid IL or missing references) okToDowngradeToNeither = false; if (considerRefKinds) { if (refKind1 != refKind2) { if ((int)refKind1 == 0) { if (conv1.Kind != ConversionKind.Identity) { return BetterResult.Neither; } return BetterResult.Left; } if (conv2.Kind != ConversionKind.Identity) { return BetterResult.Neither; } return BetterResult.Right; } if ((int)refKind1 == 1) { return BetterResult.Neither; } } return BetterConversionFromExpression(node, t1, conv1, t2, conv2, ref useSiteInfo, out okToDowngradeToNeither); } private BetterResult BetterConversionFromExpression(BoundExpression node, TypeSymbol t1, Conversion conv1, TypeSymbol t2, Conversion conv2, ref CompoundUseSiteInfo useSiteInfo, out bool okToDowngradeToNeither) { okToDowngradeToNeither = false; if (ConversionsBase.HasIdentityConversion(t1, t2)) { return BetterResult.Neither; } UnboundLambda unboundLambda = node as UnboundLambda; BoundKind kind = node.Kind; if (kind == BoundKind.OutVariablePendingInference || kind == BoundKind.OutDeconstructVarPendingInference || (kind == BoundKind.DiscardExpression && !node.HasExpressionType())) { okToDowngradeToNeither = false; return BetterResult.Neither; } bool flag = _binder.Compilation.IsFeatureEnabled(MessageID.IDS_FeatureImprovedInterpolatedStrings); bool flag2; if (flag) { if (node is BoundUnconvertedInterpolatedString boundUnconvertedInterpolatedString) { if (boundUnconvertedInterpolatedString.ConstantValueOpt == null) { goto IL_0092; } } else if (node is BoundBinaryOperator { IsUnconvertedInterpolatedStringAddition: not false, ConstantValueOpt: null }) { goto IL_0092; } flag2 = false; goto IL_009a; } goto IL_009d; IL_0092: flag2 = true; goto IL_009a; IL_009a: flag = flag2; goto IL_009d; IL_009d: ConversionKind kind3; if (flag) { ConversionKind kind2 = conv1.Kind; kind3 = conv2.Kind; if (kind2 == ConversionKind.InterpolatedStringHandler) { if (kind3 == ConversionKind.InterpolatedStringHandler) { return BetterResult.Neither; } return BetterResult.Left; } if (kind3 == ConversionKind.InterpolatedStringHandler) { return BetterResult.Right; } } ConversionKind kind4 = conv1.Kind; kind3 = conv2.Kind; if (kind4 == ConversionKind.FunctionType) { if (kind3 != ConversionKind.FunctionType) { return BetterResult.Right; } } else if (kind3 == ConversionKind.FunctionType) { return BetterResult.Left; } bool num = ExpressionMatchExactly(node, t1, ref useSiteInfo); bool flag3 = ExpressionMatchExactly(node, t2, ref useSiteInfo); if (num) { if (!flag3) { okToDowngradeToNeither = unboundLambda != null && CanDowngradeConversionFromLambdaToNeither(BetterResult.Left, unboundLambda, t1, t2, ref useSiteInfo, fromTypeAnalysis: false); return BetterResult.Left; } } else if (flag3) { okToDowngradeToNeither = unboundLambda != null && CanDowngradeConversionFromLambdaToNeither(BetterResult.Right, unboundLambda, t1, t2, ref useSiteInfo, fromTypeAnalysis: false); return BetterResult.Right; } if (!conv1.IsConditionalExpression && conv2.IsConditionalExpression) { return BetterResult.Left; } if (!conv2.IsConditionalExpression && conv1.IsConditionalExpression) { return BetterResult.Right; } if (conv1.Kind == ConversionKind.CollectionExpression && conv2.Kind == ConversionKind.CollectionExpression) { if (IsBetterCollectionExpressionConversion(t1, conv1, t2, conv2, ref useSiteInfo)) { return BetterResult.Left; } if (IsBetterCollectionExpressionConversion(t2, conv2, t1, conv1, ref useSiteInfo)) { return BetterResult.Right; } return BetterResult.Neither; } return BetterConversionTarget(node, t1, conv1, t2, conv2, ref useSiteInfo, out okToDowngradeToNeither); } private bool IsBetterCollectionExpressionConversion(TypeSymbol t1, Conversion conv1, TypeSymbol t2, Conversion conv2, ref CompoundUseSiteInfo useSiteInfo) { TypeSymbol elementType; CollectionExpressionTypeKind collectionExpressionTypeKind = conv1.GetCollectionExpressionTypeKind(out elementType); TypeSymbol elementType2; CollectionExpressionTypeKind collectionExpressionTypeKind2 = conv2.GetCollectionExpressionTypeKind(out elementType2); if (collectionExpressionTypeKind == CollectionExpressionTypeKind.ReadOnlySpan && collectionExpressionTypeKind2 == CollectionExpressionTypeKind.Span && hasImplicitConversion(elementType, elementType2, ref useSiteInfo)) { return true; } bool flag = (uint)(collectionExpressionTypeKind - 3) <= 1u; if (flag && IsSZArrayOrArrayInterfaceOrString(t2, out elementType2) && hasImplicitConversion(elementType, elementType2, ref useSiteInfo)) { return true; } flag = (uint)(collectionExpressionTypeKind - 3) <= 1u; bool flag2 = !flag; if (flag2) { bool flag3 = (uint)(collectionExpressionTypeKind2 - 3) <= 1u; flag2 = !flag3; } if (flag2 && hasImplicitConversion(t1, t2, ref useSiteInfo)) { return true; } return false; bool hasImplicitConversion(TypeSymbol source, TypeSymbol destination, ref CompoundUseSiteInfo useSiteInfo2) { return Conversions.ClassifyImplicitConversionFromType(source, destination, ref useSiteInfo2).IsImplicit; } } private bool IsSZArrayOrArrayInterfaceOrString(TypeSymbol type, out TypeSymbol elementType) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 if ((int)type.SpecialType == 20) { elementType = Compilation.GetSpecialType((SpecialType)8); return true; } if (type is ArrayTypeSymbol { IsSZArray: not false } arrayTypeSymbol) { elementType = arrayTypeSymbol.ElementType; return true; } if (type.IsArrayInterface(out var typeArgument)) { elementType = typeArgument.Type; return true; } elementType = null; return false; } private bool ExpressionMatchExactly(BoundExpression node, TypeSymbol t, ref CompoundUseSiteInfo useSiteInfo) { //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) if ((object)node.Type != null && ConversionsBase.HasIdentityConversion(node.Type, t)) { return true; } if (node.Kind == BoundKind.TupleLiteral) { return ExpressionMatchExactly((BoundTupleLiteral)node, t, ref useSiteInfo); } NamedTypeSymbol delegateType; MethodSymbol delegateInvokeMethod; TypeSymbol typeSymbol; if (node.Kind == BoundKind.UnboundLambda && (object)(delegateType = t.GetDelegateType()) != null && (object)(delegateInvokeMethod = delegateType.DelegateInvokeMethod) != null && !(typeSymbol = delegateInvokeMethod.ReturnType).IsVoidType()) { BoundLambda boundLambda = ((UnboundLambda)node).BindForReturnTypeInference(delegateType); bool inferredFromFunctionType; TypeWithAnnotations inferredReturnType = boundLambda.GetInferredReturnType(ref useSiteInfo, out inferredFromFunctionType); if (inferredReturnType.HasType && ConversionsBase.HasIdentityConversion(inferredReturnType.Type, typeSymbol)) { return true; } if (boundLambda.Symbol.IsAsync) { typeSymbol = ((!typeSymbol.OriginalDefinition.IsGenericTaskType(Compilation)) ? null : ((NamedTypeSymbol)typeSymbol).TypeArgumentsWithAnnotationsNoUseSiteDiagnostics[0].Type); } if ((object)typeSymbol != null) { int length = boundLambda.Body.Statements.Length; if (length != 0) { if (length == 1 && boundLambda.Body.Statements[0].Kind == BoundKind.ReturnStatement) { BoundReturnStatement boundReturnStatement = (BoundReturnStatement)boundLambda.Body.Statements[0]; if (boundReturnStatement.ExpressionOpt != null && ExpressionMatchExactly(boundReturnStatement.ExpressionOpt, typeSymbol, ref useSiteInfo)) { return true; } } else { ArrayBuilder instance = ArrayBuilder.GetInstance(); new ReturnStatements(instance).Visit(boundLambda.Body); bool flag = false; Enumerator enumerator = instance.GetEnumerator(); while (enumerator.MoveNext()) { BoundReturnStatement current = enumerator.Current; if (current.ExpressionOpt == null || !ExpressionMatchExactly(current.ExpressionOpt, typeSymbol, ref useSiteInfo)) { flag = false; break; } flag = true; } instance.Free(); if (flag) { return true; } } } } } return false; } private bool ExpressionMatchExactly(BoundTupleLiteral tupleSource, TypeSymbol targetType, ref CompoundUseSiteInfo useSiteInfo) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 if ((int)targetType.Kind != 11) { return false; } NamedTypeSymbol namedTypeSymbol = (NamedTypeSymbol)targetType; ImmutableArray arguments = tupleSource.Arguments; if (!namedTypeSymbol.IsTupleTypeOfCardinality(arguments.Length)) { return false; } ImmutableArray tupleElementTypesWithAnnotations = namedTypeSymbol.TupleElementTypesWithAnnotations; for (int i = 0; i < arguments.Length; i++) { if (!ExpressionMatchExactly(arguments[i], tupleElementTypesWithAnnotations[i].Type, ref useSiteInfo)) { return false; } } return true; } private BetterResult BetterConversionTargetCore(TypeSymbol type1, TypeSymbol type2, ref CompoundUseSiteInfo useSiteInfo, int betterConversionTargetRecursionLimit) { if (betterConversionTargetRecursionLimit < 0) { return BetterResult.Neither; } bool okToDowngradeToNeither; return BetterConversionTargetCore(null, type1, default(Conversion), type2, default(Conversion), ref useSiteInfo, out okToDowngradeToNeither, betterConversionTargetRecursionLimit - 1); } private BetterResult BetterConversionTarget(BoundExpression node, TypeSymbol type1, Conversion conv1, TypeSymbol type2, Conversion conv2, ref CompoundUseSiteInfo useSiteInfo, out bool okToDowngradeToNeither) { return BetterConversionTargetCore(node, type1, conv1, type2, conv2, ref useSiteInfo, out okToDowngradeToNeither, 100); } private BetterResult BetterConversionTargetCore(BoundExpression node, TypeSymbol type1, Conversion conv1, TypeSymbol type2, Conversion conv2, ref CompoundUseSiteInfo useSiteInfo, out bool okToDowngradeToNeither, int betterConversionTargetRecursionLimit) { okToDowngradeToNeither = false; if (ConversionsBase.HasIdentityConversion(type1, type2)) { return BetterResult.Neither; } bool isImplicit = Conversions.ClassifyImplicitConversionFromType(type1, type2, ref useSiteInfo).IsImplicit; bool isImplicit2 = Conversions.ClassifyImplicitConversionFromType(type2, type1, ref useSiteInfo).IsImplicit; UnboundLambda unboundLambda = node as UnboundLambda; if (isImplicit) { if (isImplicit2) { return BetterResult.Neither; } okToDowngradeToNeither = unboundLambda != null && CanDowngradeConversionFromLambdaToNeither(BetterResult.Left, unboundLambda, type1, type2, ref useSiteInfo, fromTypeAnalysis: true); return BetterResult.Left; } if (isImplicit2) { okToDowngradeToNeither = unboundLambda != null && CanDowngradeConversionFromLambdaToNeither(BetterResult.Right, unboundLambda, type1, type2, ref useSiteInfo, fromTypeAnalysis: true); return BetterResult.Right; } bool num = type1.OriginalDefinition.IsGenericTaskType(Compilation); bool flag = type2.OriginalDefinition.IsGenericTaskType(Compilation); if (num) { if (flag) { return BetterConversionTargetCore(((NamedTypeSymbol)type1).TypeArgumentsWithAnnotationsNoUseSiteDiagnostics[0].Type, ((NamedTypeSymbol)type2).TypeArgumentsWithAnnotationsNoUseSiteDiagnostics[0].Type, ref useSiteInfo, betterConversionTargetRecursionLimit); } return BetterResult.Neither; } if (flag) { return BetterResult.Neither; } NamedTypeSymbol delegateType; if ((object)(delegateType = type1.GetDelegateType()) != null) { NamedTypeSymbol delegateType2; if ((object)(delegateType2 = type2.GetDelegateType()) != null) { MethodSymbol delegateInvokeMethod = delegateType.DelegateInvokeMethod; MethodSymbol delegateInvokeMethod2 = delegateType2.DelegateInvokeMethod; if ((object)delegateInvokeMethod != null && (object)delegateInvokeMethod2 != null) { TypeSymbol returnType = delegateInvokeMethod.ReturnType; TypeSymbol returnType2 = delegateInvokeMethod2.ReturnType; BetterResult betterResult = BetterResult.Neither; if (!returnType.IsVoidType()) { if (returnType2.IsVoidType()) { betterResult = BetterResult.Left; } } else if (!returnType2.IsVoidType()) { betterResult = BetterResult.Right; } if (betterResult == BetterResult.Neither) { betterResult = BetterConversionTargetCore(returnType, returnType2, ref useSiteInfo, betterConversionTargetRecursionLimit); } if (node != null && node.Kind == BoundKind.MethodGroup) { BoundMethodGroup node2 = (BoundMethodGroup)node; switch (betterResult) { case BetterResult.Left: if (IsMethodGroupConversionIncompatibleWithDelegate(node2, delegateType, conv1)) { return BetterResult.Neither; } break; case BetterResult.Right: if (IsMethodGroupConversionIncompatibleWithDelegate(node2, delegateType2, conv2)) { return BetterResult.Neither; } break; } } return betterResult; } } return BetterResult.Neither; } if ((object)type2.GetDelegateType() != null) { return BetterResult.Neither; } if (IsSignedIntegralType(type1)) { if (IsUnsignedIntegralType(type2)) { return BetterResult.Left; } } else if (IsUnsignedIntegralType(type1) && IsSignedIntegralType(type2)) { return BetterResult.Right; } return BetterResult.Neither; } private bool IsMethodGroupConversionIncompatibleWithDelegate(BoundMethodGroup node, NamedTypeSymbol delegateType, Conversion conv) { if (conv.IsMethodGroup) { return !_binder.MethodIsCompatibleWithDelegateOrFunctionPointer(node.ReceiverOpt, conv.IsExtensionMethod, conv.Method, delegateType, Location.None, BindingDiagnosticBag.Discarded); } return false; } private bool CanDowngradeConversionFromLambdaToNeither(BetterResult currentResult, UnboundLambda lambda, TypeSymbol type1, TypeSymbol type2, ref CompoundUseSiteInfo useSiteInfo, bool fromTypeAnalysis) { NamedTypeSymbol delegateType; NamedTypeSymbol delegateType2; if ((object)(delegateType = type1.GetDelegateType()) != null && (object)(delegateType2 = type2.GetDelegateType()) != null) { MethodSymbol delegateInvokeMethod = delegateType.DelegateInvokeMethod; MethodSymbol delegateInvokeMethod2 = delegateType2.DelegateInvokeMethod; if ((object)delegateInvokeMethod != null && (object)delegateInvokeMethod2 != null) { if (!IdenticalParameters(delegateInvokeMethod.Parameters, delegateInvokeMethod2.Parameters)) { return true; } TypeSymbol returnType = delegateInvokeMethod.ReturnType; TypeSymbol returnType2 = delegateInvokeMethod2.ReturnType; if (returnType.IsVoidType()) { if (returnType2.IsVoidType()) { return true; } return false; } if (returnType2.IsVoidType()) { return false; } if (ConversionsBase.HasIdentityConversion(returnType, returnType2)) { return true; } if (!lambda.InferReturnType(Conversions, delegateType, ref useSiteInfo, out var _).HasType) { return true; } } } return false; } private static bool IdenticalParameters(ImmutableArray p1, ImmutableArray p2) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) if (p1.IsDefault || p2.IsDefault) { return false; } if (p1.Length != p2.Length) { return false; } for (int i = 0; i < p1.Length; i++) { ParameterSymbol parameterSymbol = p1[i]; ParameterSymbol parameterSymbol2 = p2[i]; if (parameterSymbol.RefKind != parameterSymbol2.RefKind) { return false; } if (!ConversionsBase.HasIdentityConversion(parameterSymbol.Type, parameterSymbol2.Type)) { return false; } } return true; } private static bool IsSignedIntegralType(TypeSymbol type) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected I4, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Invalid comparison between Unknown and I4 if ((object)type != null && type.IsNullableType()) { type = type.GetNullableUnderlyingType(); } SpecialType specialTypeSafe = type.GetSpecialTypeSafe(); switch (specialTypeSafe - 9) { default: if ((int)specialTypeSafe != 21 || !type.IsNativeIntegerType) { break; } goto case 0; case 0: case 2: case 4: case 6: return true; case 1: case 3: case 5: break; } return false; } private static bool IsUnsignedIntegralType(TypeSymbol type) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected I4, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Invalid comparison between Unknown and I4 if ((object)type != null && type.IsNullableType()) { type = type.GetNullableUnderlyingType(); } SpecialType specialTypeSafe = type.GetSpecialTypeSafe(); switch (specialTypeSafe - 10) { default: if ((int)specialTypeSafe != 22 || !type.IsNativeIntegerType) { break; } goto case 0; case 0: case 2: case 4: case 6: return true; case 1: case 3: case 5: break; } return false; } internal static void GetEffectiveParameterTypes(MethodSymbol method, int argumentCount, ImmutableArray argToParamMap, ArrayBuilder argumentRefKinds, bool isMethodGroupConversion, bool allowRefOmittedArguments, Binder binder, bool expanded, out ImmutableArray parameterTypes, out ImmutableArray parameterRefKinds) { bool hasAnyRefOmittedArgument; EffectiveParameters effectiveParameters = (expanded ? GetEffectiveParametersInExpandedForm(method, argumentCount, argToParamMap, argumentRefKinds, isMethodGroupConversion, allowRefOmittedArguments, binder, out hasAnyRefOmittedArgument) : GetEffectiveParametersInNormalForm(method, argumentCount, argToParamMap, argumentRefKinds, isMethodGroupConversion, allowRefOmittedArguments, binder, out hasAnyRefOmittedArgument)); parameterTypes = effectiveParameters.ParameterTypes; parameterRefKinds = effectiveParameters.ParameterRefKinds; } private EffectiveParameters GetEffectiveParametersInNormalForm(TMember member, int argumentCount, ImmutableArray argToParamMap, ArrayBuilder argumentRefKinds, bool isMethodGroupConversion, bool allowRefOmittedArguments) where TMember : Symbol { bool hasAnyRefOmittedArgument; return GetEffectiveParametersInNormalForm(member, argumentCount, argToParamMap, argumentRefKinds, isMethodGroupConversion, allowRefOmittedArguments, _binder, out hasAnyRefOmittedArgument); } private static EffectiveParameters GetEffectiveParametersInNormalForm(TMember member, int argumentCount, ImmutableArray argToParamMap, ArrayBuilder argumentRefKinds, bool isMethodGroupConversion, bool allowRefOmittedArguments, Binder binder, out bool hasAnyRefOmittedArgument) where TMember : Symbol { //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) hasAnyRefOmittedArgument = false; ImmutableArray parameters = member.GetParameters(); int num = member.GetParameterCount() + (member.GetIsVararg() ? 1 : 0); if (argumentCount == num && argToParamMap.IsDefaultOrEmpty) { ImmutableArray parameterRefKinds = member.GetParameterRefKinds(); if (parameterRefKinds.IsDefaultOrEmpty) { return new EffectiveParameters(member.GetParameterTypes(), parameterRefKinds); } } ArrayBuilder instance = ArrayBuilder.GetInstance(); ArrayBuilder val = null; bool flag = argumentRefKinds.Any(); for (int i = 0; i < argumentCount; i++) { int num2 = (argToParamMap.IsDefault ? i : argToParamMap[i]); if (num2 >= parameters.Length) { continue; } ParameterSymbol parameterSymbol = parameters[num2]; instance.Add(parameterSymbol.TypeWithAnnotations); RefKind argRefKind = (RefKind)(flag ? ((int)argumentRefKinds[i]) : 0); RefKind effectiveParameterRefKind = GetEffectiveParameterRefKind(parameterSymbol, argRefKind, isMethodGroupConversion, allowRefOmittedArguments, binder, ref hasAnyRefOmittedArgument); if (val == null) { if ((int)effectiveParameterRefKind != 0) { val = ArrayBuilder.GetInstance(i, (RefKind)0); val.Add(effectiveParameterRefKind); } } else { val.Add(effectiveParameterRefKind); } } ImmutableArray refKinds = val?.ToImmutableAndFree() ?? default(ImmutableArray); return new EffectiveParameters(instance.ToImmutableAndFree(), refKinds); } private static RefKind GetEffectiveParameterRefKind(ParameterSymbol parameter, RefKind argRefKind, bool isMethodGroupConversion, bool allowRefOmittedArguments, Binder binder, ref bool hasAnyRefOmittedArgument) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Invalid comparison between Unknown and I4 //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Invalid comparison between Unknown and I4 //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Invalid comparison between Unknown and I4 RefKind refKind = parameter.RefKind; if (!isMethodGroupConversion) { if ((int)refKind == 3) { if ((int)argRefKind == 0) { return (RefKind)0; } if ((int)argRefKind == 1 && binder.Compilation.IsFeatureEnabled(MessageID.IDS_FeatureRefReadonlyParameters)) { return (RefKind)1; } } else { bool flag = (int)refKind == 4; if (flag) { bool flag2 = (((int)argRefKind <= 1 || (int)argRefKind == 3) ? true : false); flag = flag2; } if (flag) { return argRefKind; } } } else if (AreRefsCompatibleForMethodConversion(refKind, argRefKind, binder.Compilation)) { return argRefKind; } if (allowRefOmittedArguments && (int)refKind == 1 && (int)argRefKind == 0 && !binder.InAttributeArgument) { hasAnyRefOmittedArgument = true; return (RefKind)0; } return refKind; } internal static bool AreRefsCompatibleForMethodConversion(RefKind x, RefKind y, CSharpCompilation compilation) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Invalid comparison between Unknown and I4 //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Invalid comparison between Unknown and I4 //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Invalid comparison between Unknown and I4 //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Invalid comparison between Unknown and I4 //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Invalid comparison between Unknown and I4 //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Invalid comparison between Unknown and I4 if (x == y) { return true; } if ((int)x == 4) { if ((int)y == 1 || (int)y == 3) { return true; } return false; } if ((int)y == 4) { if ((int)x == 1 || (int)x == 3) { return true; } return false; } if ((int)x != 1) { if ((int)x == 3 && (int)y == 1) { goto IL_0040; } } else if ((int)y == 3) { goto IL_0040; } bool flag = false; goto IL_0046; IL_0040: flag = true; goto IL_0046; IL_0046: if (flag) { return compilation.IsFeatureEnabled(MessageID.IDS_FeatureRefReadonlyParameters); } return false; } private EffectiveParameters GetEffectiveParametersInExpandedForm(TMember member, int argumentCount, ImmutableArray argToParamMap, ArrayBuilder argumentRefKinds, bool isMethodGroupConversion, bool allowRefOmittedArguments) where TMember : Symbol { bool hasAnyRefOmittedArgument; return GetEffectiveParametersInExpandedForm(member, argumentCount, argToParamMap, argumentRefKinds, isMethodGroupConversion, allowRefOmittedArguments, _binder, out hasAnyRefOmittedArgument); } private static EffectiveParameters GetEffectiveParametersInExpandedForm(TMember member, int argumentCount, ImmutableArray argToParamMap, ArrayBuilder argumentRefKinds, bool isMethodGroupConversion, bool allowRefOmittedArguments, Binder binder, out bool hasAnyRefOmittedArgument) where TMember : Symbol { //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) ArrayBuilder instance = ArrayBuilder.GetInstance(); ArrayBuilder instance2 = ArrayBuilder.GetInstance(); bool flag = false; ImmutableArray parameters = member.GetParameters(); bool flag2 = argumentRefKinds.Any(); hasAnyRefOmittedArgument = false; for (int i = 0; i < argumentCount; i++) { int num = (argToParamMap.IsDefault ? i : argToParamMap[i]); ParameterSymbol parameterSymbol = parameters[num]; TypeWithAnnotations typeWithAnnotations = parameterSymbol.TypeWithAnnotations; instance.Add((num == parameters.Length - 1) ? ((ArrayTypeSymbol)typeWithAnnotations.Type).ElementTypeWithAnnotations : typeWithAnnotations); RefKind argRefKind = (RefKind)(flag2 ? ((int)argumentRefKinds[i]) : 0); RefKind effectiveParameterRefKind = GetEffectiveParameterRefKind(parameterSymbol, argRefKind, isMethodGroupConversion, allowRefOmittedArguments, binder, ref hasAnyRefOmittedArgument); instance2.Add(effectiveParameterRefKind); if ((int)effectiveParameterRefKind != 0) { flag = true; } } ImmutableArray refKinds = (flag ? instance2.ToImmutable() : default(ImmutableArray)); instance2.Free(); return new EffectiveParameters(instance.ToImmutableAndFree(), refKinds); } private MemberResolutionResult IsMemberApplicableInNormalForm(TMember member, TMember leastOverriddenMember, ArrayBuilder typeArguments, AnalyzedArguments arguments, bool isMethodGroupConversion, bool allowRefOmittedArguments, bool inferWithDynamic, bool completeResults, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { ArgumentAnalysisResult argAnalysis = AnalyzeArguments(member, arguments, isMethodGroupConversion, expanded: false); if (!argAnalysis.IsValid) { ArgumentAnalysisResultKind kind = argAnalysis.Kind; if ((kind != ArgumentAnalysisResultKind.NoCorrespondingParameter && kind - 4 > ArgumentAnalysisResultKind.Expanded) || !completeResults) { return new MemberResolutionResult(member, leastOverriddenMember, MemberAnalysisResult.ArgumentParameterMismatch(argAnalysis), hasTypeArgumentInferredFromFunctionType: false); } } if (member.HasUseSiteError) { return new MemberResolutionResult(member, leastOverriddenMember, MemberAnalysisResult.UseSiteError(), hasTypeArgumentInferredFromFunctionType: false); } bool hasAnyRefOmittedArgument; EffectiveParameters effectiveParametersInNormalForm = GetEffectiveParametersInNormalForm(GetConstructedFrom(leastOverriddenMember), arguments.Arguments.Count, argAnalysis.ArgsToParamsOpt, arguments.RefKinds, isMethodGroupConversion, allowRefOmittedArguments, _binder, out hasAnyRefOmittedArgument); EffectiveParameters effectiveParametersInNormalForm2 = GetEffectiveParametersInNormalForm(leastOverriddenMember, arguments.Arguments.Count, argAnalysis.ArgsToParamsOpt, arguments.RefKinds, isMethodGroupConversion, allowRefOmittedArguments); MemberResolutionResult result = IsApplicable(member, leastOverriddenMember, typeArguments, arguments, effectiveParametersInNormalForm, effectiveParametersInNormalForm2, argAnalysis.ArgsToParamsOpt, hasAnyRefOmittedArgument, inferWithDynamic, completeResults, ref useSiteInfo); if (completeResults && !argAnalysis.IsValid) { return new MemberResolutionResult(member, leastOverriddenMember, MemberAnalysisResult.ArgumentParameterMismatch(argAnalysis), hasTypeArgumentInferredFromFunctionType: false); } return result; } private MemberResolutionResult IsMemberApplicableInExpandedForm(TMember member, TMember leastOverriddenMember, ArrayBuilder typeArguments, AnalyzedArguments arguments, bool allowRefOmittedArguments, bool completeResults, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { ArgumentAnalysisResult argAnalysis = AnalyzeArguments(member, arguments, isMethodGroupConversion: false, expanded: true); if (!argAnalysis.IsValid) { return new MemberResolutionResult(member, leastOverriddenMember, MemberAnalysisResult.ArgumentParameterMismatch(argAnalysis), hasTypeArgumentInferredFromFunctionType: false); } if (member.HasUseSiteError) { return new MemberResolutionResult(member, leastOverriddenMember, MemberAnalysisResult.UseSiteError(), hasTypeArgumentInferredFromFunctionType: false); } bool hasAnyRefOmittedArgument; EffectiveParameters effectiveParametersInExpandedForm = GetEffectiveParametersInExpandedForm(GetConstructedFrom(leastOverriddenMember), arguments.Arguments.Count, argAnalysis.ArgsToParamsOpt, arguments.RefKinds, isMethodGroupConversion: false, allowRefOmittedArguments, _binder, out hasAnyRefOmittedArgument); EffectiveParameters effectiveParametersInExpandedForm2 = GetEffectiveParametersInExpandedForm(leastOverriddenMember, arguments.Arguments.Count, argAnalysis.ArgsToParamsOpt, arguments.RefKinds, isMethodGroupConversion: false, allowRefOmittedArguments); MemberResolutionResult result = IsApplicable(member, leastOverriddenMember, typeArguments, arguments, effectiveParametersInExpandedForm, effectiveParametersInExpandedForm2, argAnalysis.ArgsToParamsOpt, hasAnyRefOmittedArgument, inferWithDynamic: false, completeResults, ref useSiteInfo); if (!result.Result.IsValid) { return result; } return result.WithResult(MemberAnalysisResult.ExpandedForm(result.Result.ArgsToParamsOpt, result.Result.ConversionsOpt, hasAnyRefOmittedArgument)); } private MemberResolutionResult IsApplicable(TMember member, TMember leastOverriddenMember, ArrayBuilder typeArgumentsBuilder, AnalyzedArguments arguments, EffectiveParameters originalEffectiveParameters, EffectiveParameters constructedEffectiveParameters, ImmutableArray argsToParamsMap, bool hasAnyRefOmittedArgument, bool inferWithDynamic, bool completeResults, ref CompoundUseSiteInfo useSiteInfo) where TMember : Symbol { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Invalid comparison between Unknown and I4 bool hasTypeArgumentsInferredFromFunctionType = false; MethodSymbol methodSymbol; bool ignoreOpenTypes; EffectiveParameters parameters; if ((int)member.Kind == 9 && (methodSymbol = (MethodSymbol)(object)member).Arity > 0) { if (typeArgumentsBuilder.Count == 0 && arguments.HasDynamicArgument && !inferWithDynamic) { ignoreOpenTypes = true; parameters = constructedEffectiveParameters; } else { MethodSymbol methodSymbol2 = (MethodSymbol)(object)leastOverriddenMember; ImmutableArray immutableArray; if (typeArgumentsBuilder.Count > 0) { immutableArray = typeArgumentsBuilder.ToImmutable(); } else { immutableArray = InferMethodTypeArguments(methodSymbol, methodSymbol2.ConstructedFrom.TypeParameters, arguments, originalEffectiveParameters, out hasTypeArgumentsInferredFromFunctionType, out var error, ref useSiteInfo); if (immutableArray.IsDefault) { return new MemberResolutionResult(member, leastOverriddenMember, error, hasTypeArgumentInferredFromFunctionType: false); } } member = (TMember)(Symbol)methodSymbol.Construct(immutableArray); leastOverriddenMember = (TMember)(Symbol)methodSymbol2.ConstructedFrom.Construct(immutableArray); ImmutableArray parameterTypes = leastOverriddenMember.GetParameterTypes(); for (int i = 0; i < parameterTypes.Length; i++) { if (!parameterTypes[i].Type.CheckAllConstraints(Compilation, Conversions)) { return new MemberResolutionResult(member, leastOverriddenMember, MemberAnalysisResult.ConstructedParameterFailedConstraintsCheck(i), hasTypeArgumentsInferredFromFunctionType); } } TypeMap typeMap = new TypeMap(methodSymbol.TypeParameters, immutableArray, allowAlpha: true); parameters = new EffectiveParameters(typeMap.SubstituteTypes(constructedEffectiveParameters.ParameterTypes), constructedEffectiveParameters.ParameterRefKinds); ignoreOpenTypes = false; } } else { parameters = constructedEffectiveParameters; ignoreOpenTypes = false; } MemberAnalysisResult result = IsApplicable(member, parameters, arguments, argsToParamsMap, member.GetIsVararg(), hasAnyRefOmittedArgument, ignoreOpenTypes, completeResults, ref useSiteInfo); return new MemberResolutionResult(member, leastOverriddenMember, result, hasTypeArgumentsInferredFromFunctionType); } private ImmutableArray InferMethodTypeArguments(MethodSymbol method, ImmutableArray originalTypeParameters, AnalyzedArguments arguments, EffectiveParameters originalEffectiveParameters, out bool hasTypeArgumentsInferredFromFunctionType, out MemberAnalysisResult error, ref CompoundUseSiteInfo useSiteInfo) { ImmutableArray arguments2 = arguments.Arguments.ToImmutable(); MethodTypeInferenceResult methodTypeInferenceResult = MethodTypeInferrer.Infer(_binder, _binder.Conversions, originalTypeParameters, method.ContainingType, originalEffectiveParameters.ParameterTypes, originalEffectiveParameters.ParameterRefKinds, arguments2, ref useSiteInfo); if (methodTypeInferenceResult.Success) { hasTypeArgumentsInferredFromFunctionType = methodTypeInferenceResult.HasTypeArgumentInferredFromFunctionType; error = default(MemberAnalysisResult); return methodTypeInferenceResult.InferredTypeArguments; } if (arguments.IsExtensionMethodInvocation && !MethodTypeInferrer.CanInferTypeArgumentsFromFirstArgument(_binder.Compilation, _binder.Conversions, method, arguments2, ref useSiteInfo, out var _)) { hasTypeArgumentsInferredFromFunctionType = false; error = MemberAnalysisResult.TypeInferenceExtensionInstanceArgumentFailed(); return default(ImmutableArray); } hasTypeArgumentsInferredFromFunctionType = false; error = MemberAnalysisResult.TypeInferenceFailed(); return default(ImmutableArray); } private MemberAnalysisResult IsApplicable(Symbol candidate, EffectiveParameters parameters, AnalyzedArguments arguments, ImmutableArray argsToParameters, bool isVararg, bool hasAnyRefOmittedArgument, bool ignoreOpenTypes, bool completeResults, ref CompoundUseSiteInfo useSiteInfo) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Invalid comparison between Unknown and I4 //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Invalid comparison between Unknown and I4 //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) int num = parameters.ParameterTypes.Length + (isVararg ? 1 : 0); if (arguments.Arguments.Count < num) { num = arguments.Arguments.Count; } ArrayBuilder val = null; BitVector badArguments = default(BitVector); for (int i = 0; i < num; i++) { BoundExpression boundExpression = arguments.Argument(i); Conversion conversion; if (isVararg && i == num - 1) { if (boundExpression.Kind == BoundKind.ArgListOperator) { conversion = Conversion.Identity; } else { if (((BitVector)(ref badArguments)).IsNull) { badArguments = BitVector.Create(i + 1); } ((BitVector)(ref badArguments))[i] = true; conversion = Conversion.NoConversion; } } else { RefKind argRefKind = arguments.RefKind(i); RefKind val2 = (RefKind)((!parameters.ParameterRefKinds.IsDefault) ? ((int)parameters.ParameterRefKinds[i]) : 0); bool flag = arguments.IsExtensionMethodThisArgument(i); if (flag && (int)val2 == 1) { argRefKind = val2; } bool hasInterpolatedStringRefMismatch = false; bool flag2 = ((boundExpression is BoundUnconvertedInterpolatedString || boundExpression is BoundBinaryOperator { IsUnconvertedInterpolatedStringAddition: not false }) ? true : false); if (flag2 && (int)val2 == 1 && parameters.ParameterTypes[i].Type is NamedTypeSymbol { IsInterpolatedStringHandlerType: not false, IsValueType: not false }) { hasInterpolatedStringRefMismatch = true; argRefKind = val2; } conversion = CheckArgumentForApplicability(candidate, boundExpression, argRefKind, parameters.ParameterTypes[i].Type, val2, ignoreOpenTypes, ref useSiteInfo, flag, hasInterpolatedStringRefMismatch); if (flag && !ConversionsBase.IsValidExtensionMethodThisArgConversion(conversion)) { return MemberAnalysisResult.BadArgumentConversions(argsToParameters, MemberAnalysisResult.CreateBadArgumentsWithPosition(i), ImmutableArray.Create(conversion)); } if (!conversion.Exists) { if (((BitVector)(ref badArguments)).IsNull) { badArguments = BitVector.Create(i + 1); } ((BitVector)(ref badArguments))[i] = true; } } if (val != null) { val.Add(conversion); } else if (!conversion.IsIdentity) { val = ArrayBuilder.GetInstance(num); val.AddMany(Conversion.Identity, i); val.Add(conversion); } if (!((BitVector)(ref badArguments)).IsNull && !completeResults) { break; } } ImmutableArray conversions = val?.ToImmutableAndFree() ?? default(ImmutableArray); if (!((BitVector)(ref badArguments)).IsNull) { return MemberAnalysisResult.BadArgumentConversions(argsToParameters, badArguments, conversions); } return MemberAnalysisResult.NormalForm(argsToParameters, conversions, hasAnyRefOmittedArgument); } private Conversion CheckArgumentForApplicability(Symbol candidate, BoundExpression argument, RefKind argRefKind, TypeSymbol parameterType, RefKind parRefKind, bool ignoreOpenTypes, ref CompoundUseSiteInfo useSiteInfo, bool forExtensionMethodThisArg, bool hasInterpolatedStringRefMismatch) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Invalid comparison between Unknown and I4 if (argRefKind != parRefKind && ((int)argRefKind != 0 || !argument.HasDynamicType())) { return Conversion.NoConversion; } if (ignoreOpenTypes && parameterType.ContainsTypeParameter((MethodSymbol)candidate)) { return Conversion.ImplicitDynamic; } TypeSymbol type = argument.Type; if (argument.Kind == BoundKind.OutVariablePendingInference || argument.Kind == BoundKind.OutDeconstructVarPendingInference || (argument.Kind == BoundKind.DiscardExpression && (object)type == null)) { return Conversion.Identity; } if ((int)argRefKind == 0 || hasInterpolatedStringRefMismatch) { Conversion result = (forExtensionMethodThisArg ? Conversions.ClassifyImplicitExtensionMethodThisArgConversion(argument, argument.Type, parameterType, ref useSiteInfo) : Conversions.ClassifyImplicitConversionFromExpression(argument, parameterType, ref useSiteInfo)); if (hasInterpolatedStringRefMismatch && !result.IsInterpolatedStringHandler) { return Conversion.NoConversion; } return result; } if ((object)type != null && ConversionsBase.HasIdentityConversion(type, parameterType)) { return Conversion.Identity; } return Conversion.NoConversion; } private static TMember GetConstructedFrom(TMember member) where TMember : Symbol { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Invalid comparison between Unknown and I4 //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Invalid comparison between Unknown and I4 //IL_0034: Unknown result type (might be due to invalid IL or missing references) SymbolKind kind = member.Kind; if ((int)kind != 9) { if ((int)kind == 15) { return member; } throw ExceptionUtilities.UnexpectedValue((object)member.Kind); } return (TMember)(Symbol)(member as MethodSymbol).ConstructedFrom; } private static ArgumentAnalysisResult AnalyzeArguments(Symbol symbol, AnalyzedArguments arguments, bool isMethodGroupConversion, bool expanded) { ImmutableArray parameters = symbol.GetParameters(); bool isVararg = symbol.GetIsVararg(); if (!expanded && arguments.Names.Count == 0) { return AnalyzeArgumentsForNormalFormNoNamedArguments(parameters, arguments, isMethodGroupConversion, isVararg); } int count = arguments.Arguments.Count; int[] array = null; int? num = null; bool? flag = null; bool seenNamedParams = false; bool seenOutOfPositionNamedArgument = false; bool isValidParams = IsValidParams(symbol); for (int i = 0; i < count; i++) { bool isNamedArgument; int num2 = CorrespondsToAnyParameter(parameters, expanded, arguments, i, isValidParams, isVararg, out isNamedArgument, ref seenNamedParams, ref seenOutOfPositionNamedArgument) ?? (-1); if (num2 == -1 && !num.HasValue) { num = i; flag = isNamedArgument; } if (num2 != i && array == null) { array = new int[count]; for (int j = 0; j < i; j++) { array[j] = j; } } if (array != null) { array[i] = num2; } } ParameterMap argsToParameters = new ParameterMap(array, count); int? num3 = CheckForBadNonTrailingNamedArgument(arguments, argsToParameters); if (num3.HasValue) { return ArgumentAnalysisResult.BadNonTrailingNamedArgument(num3.Value); } if (num.HasValue) { if (flag.Value) { return ArgumentAnalysisResult.NoCorrespondingNamedParameter(num.Value); } return ArgumentAnalysisResult.NoCorrespondingParameter(num.Value); } int? num4 = NameUsedForPositional(arguments, argsToParameters); if (num4.HasValue) { return ArgumentAnalysisResult.NameUsedForPositional(num4.Value); } int? num5 = CheckForMissingRequiredParameter(argsToParameters, parameters, isMethodGroupConversion, expanded); if (num5.HasValue) { return ArgumentAnalysisResult.RequiredParameterMissing(num5.Value); } if (arguments.Names.Any() && arguments.Names.Last().HasValue && isVararg) { return ArgumentAnalysisResult.RequiredParameterMissing(parameters.Length); } int? num6 = CheckForDuplicateNamedArgument(arguments); if (num6.HasValue) { return ArgumentAnalysisResult.DuplicateNamedArgument(num6.Value); } if (!expanded) { return ArgumentAnalysisResult.NormalForm(argsToParameters.ToImmutableArray()); } return ArgumentAnalysisResult.ExpandedForm(argsToParameters.ToImmutableArray()); } private static int? CheckForBadNonTrailingNamedArgument(AnalyzedArguments arguments, ParameterMap argsToParameters) { if (argsToParameters.IsTrivial) { return null; } int num = -1; int count = arguments.Arguments.Count; for (int i = 0; i < count; i++) { int num2 = argsToParameters[i]; if (num2 != -1 && num2 != i && arguments.Name(i) != null) { num = i; break; } } if (num != -1) { for (int j = num + 1; j < count; j++) { if (arguments.Name(j) == null) { return num; } } } return null; } private static int? CorrespondsToAnyParameter(ImmutableArray memberParameters, bool expanded, AnalyzedArguments arguments, int argumentPosition, bool isValidParams, bool isVararg, out bool isNamedArgument, ref bool seenNamedParams, ref bool seenOutOfPositionNamedArgument) { isNamedArgument = arguments.Names.Count > argumentPosition && arguments.Names[argumentPosition].HasValue; if (!isNamedArgument) { if (seenNamedParams) { return null; } if (seenOutOfPositionNamedArgument) { return null; } int num = memberParameters.Length + (isVararg ? 1 : 0); if (argumentPosition >= num) { if (!expanded) { return null; } return num - 1; } return argumentPosition; } string item = arguments.Names[argumentPosition].GetValueOrDefault().Item1; for (int i = 0; i < memberParameters.Length; i++) { if (memberParameters[i].Name == item) { if (isValidParams && i == memberParameters.Length - 1) { seenNamedParams = true; } if (i != argumentPosition) { seenOutOfPositionNamedArgument = true; } return i; } } return null; } private static ArgumentAnalysisResult AnalyzeArgumentsForNormalFormNoNamedArguments(ImmutableArray parameters, AnalyzedArguments arguments, bool isMethodGroupConversion, bool isVararg) { int num = parameters.Length + (isVararg ? 1 : 0); int count = arguments.Arguments.Count; if (count < num) { for (int i = count; i < num; i++) { if (parameters.Length == i || !CanBeOptional(parameters[i], isMethodGroupConversion)) { return ArgumentAnalysisResult.RequiredParameterMissing(i); } } } else if (num < count) { return ArgumentAnalysisResult.NoCorrespondingParameter(num); } return ArgumentAnalysisResult.NormalForm(default(ImmutableArray)); } private static bool CanBeOptional(ParameterSymbol parameter, bool isMethodGroupConversion) { if (!isMethodGroupConversion) { return parameter.IsOptional; } return false; } private static int? NameUsedForPositional(AnalyzedArguments arguments, ParameterMap argsToParameters) { if (argsToParameters.IsTrivial) { return null; } for (int i = 0; i < argsToParameters.Length; i++) { if (arguments.Name(i) == null) { continue; } for (int j = 0; j < i; j++) { if (arguments.Name(j) == null && argsToParameters[i] == argsToParameters[j]) { return i; } } } return null; } private static int? CheckForMissingRequiredParameter(ParameterMap argsToParameters, ImmutableArray parameters, bool isMethodGroupConversion, bool expanded) { int num = (expanded ? (parameters.Length - 1) : parameters.Length); if (argsToParameters.IsTrivial && num <= argsToParameters.Length) { return null; } for (int i = 0; i < num; i++) { if (CanBeOptional(parameters[i], isMethodGroupConversion)) { continue; } bool flag = false; for (int j = 0; j < argsToParameters.Length; j++) { flag = argsToParameters[j] == i; if (flag) { break; } } if (!flag) { return i; } } return null; } private static int? CheckForDuplicateNamedArgument(AnalyzedArguments arguments) { if (EnumerableExtensions.IsEmpty<(string, Location)?>((IReadOnlyCollection<(string, Location)?>)arguments.Names)) { return null; } PooledHashSet instance = PooledHashSet.GetInstance(); for (int i = 0; i < arguments.Names.Count; i++) { string text = arguments.Name(i); if (text != null && !((HashSet)(object)instance).Add(text)) { instance.Free(); return i; } } instance.Free(); return null; } }