Binder\Binder_Operators.cs (311)
31BinaryOperatorKind kind = SyntaxKindToBinaryOperatorKind(node.Kind());
38BinaryOperatorKind kindOperator = kind.Operator();
41case BinaryOperatorKind.Addition:
42case BinaryOperatorKind.Subtraction:
62if (IsLegalDynamicOperand(right) && IsLegalDynamicOperand(left) && kind != BinaryOperatorKind.UnsignedRightShift)
79kind.WithType(BinaryOperatorKind.Dynamic).WithOverflowChecksIfApplicable(CheckOverflowAtRuntime),
245isUnsignedRightShift: bestSignature.Kind.Operator() == BinaryOperatorKind.UnsignedRightShift, bestSignature.ConstrainedToTypeOpt, diagnostics);
317BinaryOperatorKind kind,
367BinaryOperatorKind kind,
412BinaryOperatorKind kind,
557BinaryOperatorKind kind,
629BinaryOperatorKind kind,
664private BoundExpression BindEventAssignment(AssignmentExpressionSyntax node, BoundEventAccess left, BoundExpression right, BinaryOperatorKind opKind, BindingDiagnosticBag diagnostics)
666Debug.Assert(opKind == BinaryOperatorKind.Addition || opKind == BinaryOperatorKind.Subtraction);
689bool isAddition = opKind == BinaryOperatorKind.Addition;
774BinaryOperatorKind kind,
787if (!leftValidOperand || !rightValidOperand || kind == BinaryOperatorKind.UnsignedRightShift)
801if (!IsValidDynamicCondition(left, isNegative: kind == BinaryOperatorKind.LogicalAnd, diagnostics, userDefinedOperator: out userDefinedOperator))
805Error(diagnostics, ErrorCode.ERR_InvalidDynamicCondition, node.Left, left.Type, kind == BinaryOperatorKind.LogicalAnd ? "false" : "true");
818operatorKind: (hasError ? kind : kind.WithType(BinaryOperatorKind.Dynamic)).WithOverflowChecksIfApplicable(CheckOverflowAtRuntime),
914BinaryOperatorKind kind = SyntaxKindToBinaryOperatorKind(node.Kind());
945bool isEquality = kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual;
948return new BoundLiteral(node, ConstantValue.Create(kind == BinaryOperatorKind.Equal), GetSpecialType(SpecialType.System_Boolean, diagnostics, node));
952(kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual))
959&& kind == BinaryOperatorKind.Addition
964var stringConstant = FoldBinaryOperator(node, BinaryOperatorKind.StringConcatenation, left, right, right.Type, diagnostics);
965return new BoundBinaryOperator(node, BinaryOperatorKind.StringConcatenation, BoundBinaryOperator.UncommonData.UnconvertedInterpolatedStringAddition(stringConstant), LookupResultKind.Empty, left, right, right.Type);
990BinaryOperatorKind resultOperatorKind = signature.Kind;
995resultOperatorKind &= ~BinaryOperatorKind.TypeMask;
1011if ((resultOperatorKind & BinaryOperatorKind.Pointer) == BinaryOperatorKind.Pointer &&
1034isUnsignedRightShift: resultOperatorKind.Operator() == BinaryOperatorKind.UnsignedRightShift, signature.ConstrainedToTypeOpt, diagnostics);
1042if (foundOperator && (resultOperatorKind.OperandTypes() != BinaryOperatorKind.NullableNull))
1049resultOperatorKind is BinaryOperatorKind.ObjectEqual or BinaryOperatorKind.ObjectNotEqual &&
1105private bool BindSimpleBinaryOperatorParts(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics, BoundExpression left, BoundExpression right, BinaryOperatorKind kind,
1129BinaryOperatorKind kind,
1160bool isObjectEquality = signature.Kind == BinaryOperatorKind.ObjectEqual || signature.Kind == BinaryOperatorKind.ObjectNotEqual;
1169(signature.Kind.Operator() == BinaryOperatorKind.Equal || signature.Kind.Operator() == BinaryOperatorKind.NotEqual) &&
1175resultSignature = new BinaryOperatorSignature(kind | BinaryOperatorKind.NullableNull, leftType: null, rightType: null,
1272private void ReportAssignmentOperatorError(AssignmentExpressionSyntax node, BinaryOperatorKind kind, BindingDiagnosticBag diagnostics, BoundExpression left, BoundExpression right, LookupResultKind resultKind)
1388BinaryOperatorKind kind = SyntaxKindToBinaryOperatorKind(node.Kind());
1390Debug.Assert(kind == BinaryOperatorKind.LogicalAnd || kind == BinaryOperatorKind.LogicalOr);
1399var constantValue = FoldBinaryOperator(node, kind | BinaryOperatorKind.Bool, left, right, left.Type, diagnostics);
1402return new BoundBinaryOperator(node, kind | BinaryOperatorKind.Bool, constantValue, methodOpt: null, constrainedToTypeOpt: null,
1477var resultKind = kind | signature.Kind.OperandTypes();
1480resultKind |= BinaryOperatorKind.Lifted;
1488CheckConstraintLanguageVersionAndRuntimeSupportForOperator(node, kind == BinaryOperatorKind.LogicalAnd ? falseOperator : trueOperator,
1492var trueFalseParameterType = (resultKind.Operator() == BinaryOperatorKind.And ? falseOperator : trueOperator).Parameters[0].Type;
1629Debug.Assert(signature.Kind.OperandTypes() == BinaryOperatorKind.UserDefined);
1948private TypeSymbol GetBinaryOperatorErrorType(BinaryOperatorKind kind, BindingDiagnosticBag diagnostics, CSharpSyntaxNode node)
1952case BinaryOperatorKind.Equal:
1953case BinaryOperatorKind.NotEqual:
1954case BinaryOperatorKind.GreaterThan:
1955case BinaryOperatorKind.LessThan:
1956case BinaryOperatorKind.GreaterThanOrEqual:
1957case BinaryOperatorKind.LessThanOrEqual:
1965BinaryOperatorKind kind,
1980BinaryOperatorKind kind,
2020BinaryOperatorKind kind,
2068BinaryOperatorKind kind,
2147private bool IsTypelessExpressionAllowedInBinaryOperator(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
2158bool isEquality = kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual;
2357private static object FoldDecimalBinaryOperators(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
2373case BinaryOperatorKind.DecimalAddition:
2375case BinaryOperatorKind.DecimalSubtraction:
2377case BinaryOperatorKind.DecimalMultiplication:
2379case BinaryOperatorKind.DecimalDivision:
2381case BinaryOperatorKind.DecimalRemainder:
2388private static object FoldNativeIntegerOverflowingBinaryOperator(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
2397case BinaryOperatorKind.NIntAddition:
2399case BinaryOperatorKind.NUIntAddition:
2401case BinaryOperatorKind.NIntSubtraction:
2403case BinaryOperatorKind.NUIntSubtraction:
2405case BinaryOperatorKind.NIntMultiplication:
2407case BinaryOperatorKind.NUIntMultiplication:
2409case BinaryOperatorKind.NIntDivision:
2411case BinaryOperatorKind.NIntRemainder:
2413case BinaryOperatorKind.NIntLeftShift:
2419case BinaryOperatorKind.NUIntLeftShift:
2431private static object FoldUncheckedIntegralBinaryOperator(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
2440case BinaryOperatorKind.IntAddition:
2442case BinaryOperatorKind.LongAddition:
2444case BinaryOperatorKind.UIntAddition:
2446case BinaryOperatorKind.ULongAddition:
2448case BinaryOperatorKind.IntSubtraction:
2450case BinaryOperatorKind.LongSubtraction:
2452case BinaryOperatorKind.UIntSubtraction:
2454case BinaryOperatorKind.ULongSubtraction:
2456case BinaryOperatorKind.IntMultiplication:
2458case BinaryOperatorKind.LongMultiplication:
2460case BinaryOperatorKind.UIntMultiplication:
2462case BinaryOperatorKind.ULongMultiplication:
2466case BinaryOperatorKind.IntDivision:
2474case BinaryOperatorKind.LongDivision:
2487private static object FoldCheckedIntegralBinaryOperator(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
2496case BinaryOperatorKind.IntAddition:
2498case BinaryOperatorKind.LongAddition:
2500case BinaryOperatorKind.UIntAddition:
2502case BinaryOperatorKind.ULongAddition:
2504case BinaryOperatorKind.IntSubtraction:
2506case BinaryOperatorKind.LongSubtraction:
2508case BinaryOperatorKind.UIntSubtraction:
2510case BinaryOperatorKind.ULongSubtraction:
2512case BinaryOperatorKind.IntMultiplication:
2514case BinaryOperatorKind.LongMultiplication:
2516case BinaryOperatorKind.UIntMultiplication:
2518case BinaryOperatorKind.ULongMultiplication:
2520case BinaryOperatorKind.IntDivision:
2522case BinaryOperatorKind.LongDivision:
2530internal static TypeSymbol GetEnumType(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
2534case BinaryOperatorKind.EnumAndUnderlyingAddition:
2535case BinaryOperatorKind.EnumAndUnderlyingSubtraction:
2536case BinaryOperatorKind.EnumAnd:
2537case BinaryOperatorKind.EnumOr:
2538case BinaryOperatorKind.EnumXor:
2539case BinaryOperatorKind.EnumEqual:
2540case BinaryOperatorKind.EnumGreaterThan:
2541case BinaryOperatorKind.EnumGreaterThanOrEqual:
2542case BinaryOperatorKind.EnumLessThan:
2543case BinaryOperatorKind.EnumLessThanOrEqual:
2544case BinaryOperatorKind.EnumNotEqual:
2545case BinaryOperatorKind.EnumSubtraction:
2547case BinaryOperatorKind.UnderlyingAndEnumAddition:
2548case BinaryOperatorKind.UnderlyingAndEnumSubtraction:
2579BinaryOperatorKind kind,
2613BinaryOperatorKind newKind = kind.Operator().WithType(newLeftOperand.Type!.SpecialType);
2617case BinaryOperatorKind.Addition:
2618case BinaryOperatorKind.Subtraction:
2619case BinaryOperatorKind.And:
2620case BinaryOperatorKind.Or:
2621case BinaryOperatorKind.Xor:
2625case BinaryOperatorKind.LessThan:
2626case BinaryOperatorKind.LessThanOrEqual:
2627case BinaryOperatorKind.GreaterThan:
2628case BinaryOperatorKind.GreaterThanOrEqual:
2629case BinaryOperatorKind.Equal:
2630case BinaryOperatorKind.NotEqual:
2642TypeSymbol resultType = kind == BinaryOperatorKind.EnumSubtraction ? underlyingType : enumType;
2654BinaryOperatorKind kind,
2809private static ConstantValue? TryFoldingNullableEquality(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
2813BinaryOperatorKind op = kind.Operator();
2814if (op == BinaryOperatorKind.Equal || op == BinaryOperatorKind.NotEqual)
2831return (leftIsNull == rightIsNull) == (op == BinaryOperatorKind.Equal) ? ConstantValue.True : ConstantValue.False;
2842private static object? FoldNeverOverflowBinaryOperators(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
2851case BinaryOperatorKind.ObjectEqual:
2855case BinaryOperatorKind.ObjectNotEqual:
2859case BinaryOperatorKind.DoubleAddition:
2861case BinaryOperatorKind.FloatAddition:
2863case BinaryOperatorKind.DoubleSubtraction:
2865case BinaryOperatorKind.FloatSubtraction:
2867case BinaryOperatorKind.DoubleMultiplication:
2869case BinaryOperatorKind.FloatMultiplication:
2871case BinaryOperatorKind.DoubleDivision:
2873case BinaryOperatorKind.FloatDivision:
2875case BinaryOperatorKind.DoubleRemainder:
2877case BinaryOperatorKind.FloatRemainder:
2879case BinaryOperatorKind.IntLeftShift:
2881case BinaryOperatorKind.LongLeftShift:
2883case BinaryOperatorKind.UIntLeftShift:
2885case BinaryOperatorKind.ULongLeftShift:
2887case BinaryOperatorKind.IntRightShift:
2888case BinaryOperatorKind.NIntRightShift:
2890case BinaryOperatorKind.IntUnsignedRightShift:
2892case BinaryOperatorKind.NIntUnsignedRightShift:
2894case BinaryOperatorKind.LongRightShift:
2896case BinaryOperatorKind.LongUnsignedRightShift:
2898case BinaryOperatorKind.UIntRightShift:
2899case BinaryOperatorKind.NUIntRightShift:
2900case BinaryOperatorKind.UIntUnsignedRightShift:
2901case BinaryOperatorKind.NUIntUnsignedRightShift:
2903case BinaryOperatorKind.ULongRightShift:
2904case BinaryOperatorKind.ULongUnsignedRightShift:
2906case BinaryOperatorKind.BoolAnd:
2908case BinaryOperatorKind.IntAnd:
2909case BinaryOperatorKind.NIntAnd:
2911case BinaryOperatorKind.LongAnd:
2913case BinaryOperatorKind.UIntAnd:
2914case BinaryOperatorKind.NUIntAnd:
2916case BinaryOperatorKind.ULongAnd:
2918case BinaryOperatorKind.BoolOr:
2920case BinaryOperatorKind.IntOr:
2921case BinaryOperatorKind.NIntOr:
2923case BinaryOperatorKind.LongOr:
2925case BinaryOperatorKind.UIntOr:
2926case BinaryOperatorKind.NUIntOr:
2928case BinaryOperatorKind.ULongOr:
2930case BinaryOperatorKind.BoolXor:
2932case BinaryOperatorKind.IntXor:
2933case BinaryOperatorKind.NIntXor:
2935case BinaryOperatorKind.LongXor:
2937case BinaryOperatorKind.UIntXor:
2938case BinaryOperatorKind.NUIntXor:
2940case BinaryOperatorKind.ULongXor:
2942case BinaryOperatorKind.LogicalBoolAnd:
2944case BinaryOperatorKind.LogicalBoolOr:
2946case BinaryOperatorKind.BoolEqual:
2948case BinaryOperatorKind.StringEqual:
2950case BinaryOperatorKind.DecimalEqual:
2952case BinaryOperatorKind.FloatEqual:
2954case BinaryOperatorKind.DoubleEqual:
2956case BinaryOperatorKind.IntEqual:
2957case BinaryOperatorKind.NIntEqual:
2959case BinaryOperatorKind.LongEqual:
2961case BinaryOperatorKind.UIntEqual:
2962case BinaryOperatorKind.NUIntEqual:
2964case BinaryOperatorKind.ULongEqual:
2966case BinaryOperatorKind.BoolNotEqual:
2968case BinaryOperatorKind.StringNotEqual:
2970case BinaryOperatorKind.DecimalNotEqual:
2972case BinaryOperatorKind.FloatNotEqual:
2974case BinaryOperatorKind.DoubleNotEqual:
2976case BinaryOperatorKind.IntNotEqual:
2977case BinaryOperatorKind.NIntNotEqual:
2979case BinaryOperatorKind.LongNotEqual:
2981case BinaryOperatorKind.UIntNotEqual:
2982case BinaryOperatorKind.NUIntNotEqual:
2984case BinaryOperatorKind.ULongNotEqual:
2986case BinaryOperatorKind.DecimalLessThan:
2988case BinaryOperatorKind.FloatLessThan:
2990case BinaryOperatorKind.DoubleLessThan:
2992case BinaryOperatorKind.IntLessThan:
2993case BinaryOperatorKind.NIntLessThan:
2995case BinaryOperatorKind.LongLessThan:
2997case BinaryOperatorKind.UIntLessThan:
2998case BinaryOperatorKind.NUIntLessThan:
3000case BinaryOperatorKind.ULongLessThan:
3002case BinaryOperatorKind.DecimalGreaterThan:
3004case BinaryOperatorKind.FloatGreaterThan:
3006case BinaryOperatorKind.DoubleGreaterThan:
3008case BinaryOperatorKind.IntGreaterThan:
3009case BinaryOperatorKind.NIntGreaterThan:
3011case BinaryOperatorKind.LongGreaterThan:
3013case BinaryOperatorKind.UIntGreaterThan:
3014case BinaryOperatorKind.NUIntGreaterThan:
3016case BinaryOperatorKind.ULongGreaterThan:
3018case BinaryOperatorKind.DecimalLessThanOrEqual:
3020case BinaryOperatorKind.FloatLessThanOrEqual:
3022case BinaryOperatorKind.DoubleLessThanOrEqual:
3024case BinaryOperatorKind.IntLessThanOrEqual:
3025case BinaryOperatorKind.NIntLessThanOrEqual:
3027case BinaryOperatorKind.LongLessThanOrEqual:
3029case BinaryOperatorKind.UIntLessThanOrEqual:
3030case BinaryOperatorKind.NUIntLessThanOrEqual:
3032case BinaryOperatorKind.ULongLessThanOrEqual:
3034case BinaryOperatorKind.DecimalGreaterThanOrEqual:
3036case BinaryOperatorKind.FloatGreaterThanOrEqual:
3038case BinaryOperatorKind.DoubleGreaterThanOrEqual:
3040case BinaryOperatorKind.IntGreaterThanOrEqual:
3041case BinaryOperatorKind.NIntGreaterThanOrEqual:
3043case BinaryOperatorKind.LongGreaterThanOrEqual:
3045case BinaryOperatorKind.UIntGreaterThanOrEqual:
3046case BinaryOperatorKind.NUIntGreaterThanOrEqual:
3048case BinaryOperatorKind.ULongGreaterThanOrEqual:
3050case BinaryOperatorKind.UIntDivision:
3051case BinaryOperatorKind.NUIntDivision:
3053case BinaryOperatorKind.ULongDivision:
3057case BinaryOperatorKind.IntRemainder:
3059case BinaryOperatorKind.LongRemainder:
3061case BinaryOperatorKind.UIntRemainder:
3062case BinaryOperatorKind.NUIntRemainder:
3064case BinaryOperatorKind.ULongRemainder:
3074private static ConstantValue? FoldStringConcatenation(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
3079if (kind == BinaryOperatorKind.StringConcatenation)
3092public static BinaryOperatorKind SyntaxKindToBinaryOperatorKind(SyntaxKind kind)
3097case SyntaxKind.MultiplyExpression: return BinaryOperatorKind.Multiplication;
3099case SyntaxKind.DivideExpression: return BinaryOperatorKind.Division;
3101case SyntaxKind.ModuloExpression: return BinaryOperatorKind.Remainder;
3103case SyntaxKind.AddExpression: return BinaryOperatorKind.Addition;
3105case SyntaxKind.SubtractExpression: return BinaryOperatorKind.Subtraction;
3107case SyntaxKind.RightShiftExpression: return BinaryOperatorKind.RightShift;
3109case SyntaxKind.UnsignedRightShiftExpression: return BinaryOperatorKind.UnsignedRightShift;
3111case SyntaxKind.LeftShiftExpression: return BinaryOperatorKind.LeftShift;
3112case SyntaxKind.EqualsExpression: return BinaryOperatorKind.Equal;
3113case SyntaxKind.NotEqualsExpression: return BinaryOperatorKind.NotEqual;
3114case SyntaxKind.GreaterThanExpression: return BinaryOperatorKind.GreaterThan;
3115case SyntaxKind.LessThanExpression: return BinaryOperatorKind.LessThan;
3116case SyntaxKind.GreaterThanOrEqualExpression: return BinaryOperatorKind.GreaterThanOrEqual;
3117case SyntaxKind.LessThanOrEqualExpression: return BinaryOperatorKind.LessThanOrEqual;
3119case SyntaxKind.BitwiseAndExpression: return BinaryOperatorKind.And;
3121case SyntaxKind.BitwiseOrExpression: return BinaryOperatorKind.Or;
3123case SyntaxKind.ExclusiveOrExpression: return BinaryOperatorKind.Xor;
3124case SyntaxKind.LogicalAndExpression: return BinaryOperatorKind.LogicalAnd;
3125case SyntaxKind.LogicalOrExpression: return BinaryOperatorKind.LogicalOr;
4584private static bool IsDivisionByZero(BinaryOperatorKind kind, ConstantValue valueRight)
4590case BinaryOperatorKind.DecimalDivision:
4591case BinaryOperatorKind.DecimalRemainder:
4593case BinaryOperatorKind.IntDivision:
4594case BinaryOperatorKind.IntRemainder:
4595case BinaryOperatorKind.NIntDivision:
4596case BinaryOperatorKind.NIntRemainder:
4598case BinaryOperatorKind.LongDivision:
4599case BinaryOperatorKind.LongRemainder:
4601case BinaryOperatorKind.UIntDivision:
4602case BinaryOperatorKind.UIntRemainder:
4603case BinaryOperatorKind.NUIntDivision:
4604case BinaryOperatorKind.NUIntRemainder:
4606case BinaryOperatorKind.ULongDivision:
4607case BinaryOperatorKind.ULongRemainder:
5893private void CheckNativeIntegerFeatureAvailability(BinaryOperatorKind operatorKind, SyntaxNode syntax, BindingDiagnosticBag diagnostics)
5900switch (operatorKind & BinaryOperatorKind.TypeMask)
5902case BinaryOperatorKind.NInt:
5903case BinaryOperatorKind.NUInt:
Binder\Binder_Patterns.cs (32)
1636BinaryOperatorKind operation = tokenKindToBinaryOperatorKind(node.OperatorToken.Kind());
1637if (operation == BinaryOperatorKind.Equal)
1643BinaryOperatorKind opType = RelationalOperatorType(type.EnumUnderlyingTypeOrSelf());
1646case BinaryOperatorKind.Float:
1647case BinaryOperatorKind.Double:
1654case BinaryOperatorKind.String:
1655case BinaryOperatorKind.Bool:
1656case BinaryOperatorKind.Error:
1680static BinaryOperatorKind tokenKindToBinaryOperatorKind(SyntaxKind kind) => kind switch
1682SyntaxKind.LessThanEqualsToken => BinaryOperatorKind.LessThanOrEqual,
1683SyntaxKind.LessThanToken => BinaryOperatorKind.LessThan,
1684SyntaxKind.GreaterThanToken => BinaryOperatorKind.GreaterThan,
1685SyntaxKind.GreaterThanEqualsToken => BinaryOperatorKind.GreaterThanOrEqual,
1687_ => BinaryOperatorKind.Equal,
1696internal static BinaryOperatorKind RelationalOperatorType(TypeSymbol type) => type.SpecialType switch
1698SpecialType.System_Single => BinaryOperatorKind.Float,
1699SpecialType.System_Double => BinaryOperatorKind.Double,
1700SpecialType.System_Char => BinaryOperatorKind.Char,
1701SpecialType.System_SByte => BinaryOperatorKind.Int, // operands are converted to int
1702SpecialType.System_Byte => BinaryOperatorKind.Int, // operands are converted to int
1703SpecialType.System_UInt16 => BinaryOperatorKind.Int, // operands are converted to int
1704SpecialType.System_Int16 => BinaryOperatorKind.Int, // operands are converted to int
1705SpecialType.System_Int32 => BinaryOperatorKind.Int,
1706SpecialType.System_UInt32 => BinaryOperatorKind.UInt,
1707SpecialType.System_Int64 => BinaryOperatorKind.Long,
1708SpecialType.System_UInt64 => BinaryOperatorKind.ULong,
1709SpecialType.System_Decimal => BinaryOperatorKind.Decimal,
1710SpecialType.System_String => BinaryOperatorKind.String,
1711SpecialType.System_Boolean => BinaryOperatorKind.Bool,
1712SpecialType.System_IntPtr when type.IsNativeIntegerType => BinaryOperatorKind.NInt,
1713SpecialType.System_UIntPtr when type.IsNativeIntegerType => BinaryOperatorKind.NUInt,
1714_ => BinaryOperatorKind.Error,
Binder\Binder_TupleOperators.cs (9)
25private BoundTupleBinaryOperator BindTupleBinaryOperator(BinaryExpressionSyntax node, BinaryOperatorKind kind,
82private TupleBinaryOperatorInfo BindTupleBinaryOperatorInfo(BinaryExpressionSyntax node, BinaryOperatorKind kind,
125private void PrepareBoolConversionAndTruthOperator(TypeSymbol type, BinaryExpressionSyntax node, BinaryOperatorKind binaryOperator, BindingDiagnosticBag diagnostics,
148case BinaryOperatorKind.Equal:
151case BinaryOperatorKind.NotEqual:
179private TupleBinaryOperatorInfo BindTupleDynamicBinaryOperatorSingleInfo(BinaryExpressionSyntax node, BinaryOperatorKind kind,
193BinaryOperatorKind elementOperatorKind = hasError ? kind : kind.WithType(BinaryOperatorKind.Dynamic);
202private TupleBinaryOperatorInfo.Multiple BindTupleBinaryOperatorNestedInfo(BinaryExpressionSyntax node, BinaryOperatorKind kind,
Binder\DecisionDagBuilder.cs (15)
502if (ValueSetFactory.ForInput(input)?.Related(BinaryOperatorKind.Equal, constant.ConstantValue).IsEmpty == true)
1143return resultForRelation(BinaryOperatorKind.Equal, t.Value);
1155resultForRelation(BinaryOperatorKind relation, ConstantValue value)
1355handleRelationWithValue(BinaryOperatorKind.Equal, v2.Value,
1360BinaryOperatorKind relation,
1495if (lengthValues.All(BinaryOperatorKind.Equal, lengthValue))
1501if (!_forLowering && lengthValues.Any(BinaryOperatorKind.Equal, lengthValue))
1757BinaryOperatorKind.LessThan => "<",
1758BinaryOperatorKind.LessThanOrEqual => "<=",
1759BinaryOperatorKind.GreaterThan => ">",
1760BinaryOperatorKind.GreaterThanOrEqual => ">=",
2227Debug.Assert(t.Relation == BinaryOperatorKind.GreaterThanOrEqual);
2242return knownResult(BinaryOperatorKind.Equal, t.Value, offset) ??
2254static Tests? knownResult(BinaryOperatorKind relation, ConstantValue constant, int offset)
2257var possibleValues = fac.Related(BinaryOperatorKind.LessThanOrEqual, int.MaxValue - offset);
Binder\Semantics\Operators\BinaryOperatorEasyOut.cs (78)
14private const BinaryOperatorKind ERR = BinaryOperatorKind.Error;
15private const BinaryOperatorKind OBJ = BinaryOperatorKind.Object;
16private const BinaryOperatorKind STR = BinaryOperatorKind.String;
17private const BinaryOperatorKind OSC = BinaryOperatorKind.ObjectAndString;
18private const BinaryOperatorKind SOC = BinaryOperatorKind.StringAndObject;
19private const BinaryOperatorKind INT = BinaryOperatorKind.Int;
20private const BinaryOperatorKind UIN = BinaryOperatorKind.UInt;
21private const BinaryOperatorKind LNG = BinaryOperatorKind.Long;
22private const BinaryOperatorKind ULG = BinaryOperatorKind.ULong;
23private const BinaryOperatorKind NIN = BinaryOperatorKind.NInt;
24private const BinaryOperatorKind NUI = BinaryOperatorKind.NUInt;
25private const BinaryOperatorKind FLT = BinaryOperatorKind.Float;
26private const BinaryOperatorKind DBL = BinaryOperatorKind.Double;
27private const BinaryOperatorKind DEC = BinaryOperatorKind.Decimal;
28private const BinaryOperatorKind BOL = BinaryOperatorKind.Bool;
29private const BinaryOperatorKind LIN = BinaryOperatorKind.Lifted | BinaryOperatorKind.Int;
30private const BinaryOperatorKind LUN = BinaryOperatorKind.Lifted | BinaryOperatorKind.UInt;
31private const BinaryOperatorKind LLG = BinaryOperatorKind.Lifted | BinaryOperatorKind.Long;
32private const BinaryOperatorKind LUL = BinaryOperatorKind.Lifted | BinaryOperatorKind.ULong;
33private const BinaryOperatorKind LNI = BinaryOperatorKind.Lifted | BinaryOperatorKind.NInt;
34private const BinaryOperatorKind LNU = BinaryOperatorKind.Lifted | BinaryOperatorKind.NUInt;
35private const BinaryOperatorKind LFL = BinaryOperatorKind.Lifted | BinaryOperatorKind.Float;
36private const BinaryOperatorKind LDB = BinaryOperatorKind.Lifted | BinaryOperatorKind.Double;
37private const BinaryOperatorKind LDC = BinaryOperatorKind.Lifted | BinaryOperatorKind.Decimal;
38private const BinaryOperatorKind LBL = BinaryOperatorKind.Lifted | BinaryOperatorKind.Bool;
41private static readonly BinaryOperatorKind[,] s_arithmetic =
79private static readonly BinaryOperatorKind[,] s_addition =
117private static readonly BinaryOperatorKind[,] s_shift =
159private static readonly BinaryOperatorKind[,] s_equality =
197private static readonly BinaryOperatorKind[,] s_logical =
234private static readonly BinaryOperatorKind[][,] s_opkind =
255public static BinaryOperatorKind OpKind(BinaryOperatorKind kind, TypeSymbol left, TypeSymbol right)
260return BinaryOperatorKind.Error;
265return BinaryOperatorKind.Error;
268var result = BinaryOperatorKind.Error;
277if (!kind.IsLogical() || (leftIndex == (int)BinaryOperatorKind.Bool && rightIndex == (int)BinaryOperatorKind.Bool))
282return result == BinaryOperatorKind.Error ? result : result | kind;
286private void BinaryOperatorEasyOut(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result)
305var easyOut = BinopEasyOut.OpKind(kind, leftType, rightType);
307if (easyOut == BinaryOperatorKind.Error)
Binder\Semantics\Operators\BinaryOperatorOverloadResolution.cs (151)
22BinaryOperatorKind kind,
41internal void BinaryOperatorOverloadResolution_EasyOut(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result)
52BinaryOperatorKind underlyingKind = kind & ~BinaryOperatorKind.Logical;
58BinaryOperatorKind kind,
220private bool GetUserDefinedBinaryOperatorsFromInterfaces(BinaryOperatorKind kind, bool isChecked,
318private void AddDelegateOperation(BinaryOperatorKind kind, TypeSymbol delegateType,
323case BinaryOperatorKind.Equal:
324case BinaryOperatorKind.NotEqual:
325operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Delegate, delegateType, delegateType, Compilation.GetSpecialType(SpecialType.System_Boolean)));
328case BinaryOperatorKind.Addition:
329case BinaryOperatorKind.Subtraction:
331operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Delegate, delegateType, delegateType, delegateType));
336private void GetDelegateOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right,
345case BinaryOperatorKind.Multiplication:
346case BinaryOperatorKind.Division:
347case BinaryOperatorKind.Remainder:
348case BinaryOperatorKind.RightShift:
349case BinaryOperatorKind.UnsignedRightShift:
350case BinaryOperatorKind.LeftShift:
351case BinaryOperatorKind.And:
352case BinaryOperatorKind.Or:
353case BinaryOperatorKind.Xor:
354case BinaryOperatorKind.GreaterThan:
355case BinaryOperatorKind.LessThan:
356case BinaryOperatorKind.GreaterThanOrEqual:
357case BinaryOperatorKind.LessThanOrEqual:
358case BinaryOperatorKind.LogicalAnd:
359case BinaryOperatorKind.LogicalOr:
362case BinaryOperatorKind.Addition:
363case BinaryOperatorKind.Subtraction:
364case BinaryOperatorKind.Equal:
365case BinaryOperatorKind.NotEqual:
391case BinaryOperatorKind.Equal:
392case BinaryOperatorKind.NotEqual:
454bool useIdentityConversion = kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual;
468if ((kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual)
477private void GetEnumOperation(BinaryOperatorKind kind, TypeSymbol enumType, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> operators)
496case BinaryOperatorKind.Addition:
497operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumAndUnderlyingAddition, enumType, underlying, enumType));
498operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UnderlyingAndEnumAddition, underlying, enumType, enumType));
499operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumAndUnderlyingAddition, nullableEnum, nullableUnderlying, nullableEnum));
500operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedUnderlyingAndEnumAddition, nullableUnderlying, nullableEnum, nullableEnum));
502case BinaryOperatorKind.Subtraction:
505operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumSubtraction, enumType, enumType, underlying));
506operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumAndUnderlyingSubtraction, enumType, underlying, enumType));
507operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumSubtraction, nullableEnum, nullableEnum, nullableUnderlying));
508operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumAndUnderlyingSubtraction, nullableEnum, nullableUnderlying, nullableEnum));
518operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumSubtraction, enumType, enumType, underlying)
520operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumAndUnderlyingSubtraction, enumType, underlying, enumType)
522operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumSubtraction, nullableEnum, nullableEnum, nullableUnderlying)
524operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumAndUnderlyingSubtraction, nullableEnum, nullableUnderlying, nullableEnum)
528operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UnderlyingAndEnumSubtraction, underlying, enumType, enumType)
530operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedUnderlyingAndEnumSubtraction, nullableUnderlying, nullableEnum, nullableEnum)
534case BinaryOperatorKind.Equal:
535case BinaryOperatorKind.NotEqual:
536case BinaryOperatorKind.GreaterThan:
537case BinaryOperatorKind.LessThan:
538case BinaryOperatorKind.GreaterThanOrEqual:
539case BinaryOperatorKind.LessThanOrEqual:
541operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Enum, enumType, enumType, boolean));
542operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Lifted | BinaryOperatorKind.Enum, nullableEnum, nullableEnum, boolean));
544case BinaryOperatorKind.And:
545case BinaryOperatorKind.Or:
546case BinaryOperatorKind.Xor:
547operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Enum, enumType, enumType, enumType));
548operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Lifted | BinaryOperatorKind.Enum, nullableEnum, nullableEnum, nullableEnum));
554BinaryOperatorKind kind,
563case BinaryOperatorKind.Addition:
564operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndIntAddition, pointerType, Compilation.GetSpecialType(SpecialType.System_Int32), pointerType));
565operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndUIntAddition, pointerType, Compilation.GetSpecialType(SpecialType.System_UInt32), pointerType));
566operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndLongAddition, pointerType, Compilation.GetSpecialType(SpecialType.System_Int64), pointerType));
567operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndULongAddition, pointerType, Compilation.GetSpecialType(SpecialType.System_UInt64), pointerType));
568operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.IntAndPointerAddition, Compilation.GetSpecialType(SpecialType.System_Int32), pointerType, pointerType));
569operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UIntAndPointerAddition, Compilation.GetSpecialType(SpecialType.System_UInt32), pointerType, pointerType));
570operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LongAndPointerAddition, Compilation.GetSpecialType(SpecialType.System_Int64), pointerType, pointerType));
571operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.ULongAndPointerAddition, Compilation.GetSpecialType(SpecialType.System_UInt64), pointerType, pointerType));
573case BinaryOperatorKind.Subtraction:
574operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndIntSubtraction, pointerType, Compilation.GetSpecialType(SpecialType.System_Int32), pointerType));
575operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndUIntSubtraction, pointerType, Compilation.GetSpecialType(SpecialType.System_UInt32), pointerType));
576operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndLongSubtraction, pointerType, Compilation.GetSpecialType(SpecialType.System_Int64), pointerType));
577operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndULongSubtraction, pointerType, Compilation.GetSpecialType(SpecialType.System_UInt64), pointerType));
578operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerSubtraction, pointerType, pointerType, Compilation.GetSpecialType(SpecialType.System_Int64)));
584BinaryOperatorKind kind,
589case BinaryOperatorKind.Equal:
590case BinaryOperatorKind.NotEqual:
591case BinaryOperatorKind.GreaterThan:
592case BinaryOperatorKind.LessThan:
593case BinaryOperatorKind.GreaterThanOrEqual:
594case BinaryOperatorKind.LessThanOrEqual:
596operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Pointer, voidPointerType, voidPointerType, Compilation.GetSpecialType(SpecialType.System_Boolean)));
601private void GetEnumOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> results)
610case BinaryOperatorKind.Multiplication:
611case BinaryOperatorKind.Division:
612case BinaryOperatorKind.Remainder:
613case BinaryOperatorKind.RightShift:
614case BinaryOperatorKind.UnsignedRightShift:
615case BinaryOperatorKind.LeftShift:
616case BinaryOperatorKind.LogicalAnd:
617case BinaryOperatorKind.LogicalOr:
636case BinaryOperatorKind.And:
637case BinaryOperatorKind.Or:
638case BinaryOperatorKind.Xor:
645case BinaryOperatorKind.Addition:
652case BinaryOperatorKind.Subtraction:
659case BinaryOperatorKind.Equal:
660case BinaryOperatorKind.NotEqual:
661case BinaryOperatorKind.GreaterThan:
662case BinaryOperatorKind.LessThan:
663case BinaryOperatorKind.GreaterThanOrEqual:
664case BinaryOperatorKind.LessThanOrEqual:
687BinaryOperatorKind kind,
719private void GetAllBuiltInOperators(BinaryOperatorKind kind, bool isChecked, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorAnalysisResult> results, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
725bool isEquality = kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual;
765if (kind.Operator() is BinaryOperatorKind.Addition &&
787return value is BoundUtf8String or BoundBinaryOperator { OperatorKind: BinaryOperatorKind.Utf8Addition };
796private void GetReferenceEquality(BinaryOperatorKind kind, ArrayBuilder<BinaryOperatorSignature> operators)
799operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Object, @object, @object, Compilation.GetSpecialType(SpecialType.System_Boolean)));
865BinaryOperatorKind kind,
933internal static void GetStaticUserDefinedBinaryOperatorMethodNames(BinaryOperatorKind kind, bool isChecked, out string name1, out string? name2Opt)
950BinaryOperatorKind kind,
989private static void GetDeclaredUserDefinedBinaryOperators(TypeSymbol? constrainedToTypeOpt, NamedTypeSymbol type, BinaryOperatorKind kind, string name, ArrayBuilder<BinaryOperatorSignature> operators)
997private static void GetDeclaredUserDefinedBinaryOperators(TypeSymbol? constrainedToTypeOpt, ArrayBuilder<MethodSymbol> typeOperators, BinaryOperatorKind kind, string name, ArrayBuilder<BinaryOperatorSignature> operators)
1016operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UserDefined | kind, leftOperandType, rightOperandType, resultType, op, constrainedToTypeOpt));
1020void AddLiftedUserDefinedBinaryOperators(TypeSymbol? constrainedToTypeOpt, BinaryOperatorKind kind, ArrayBuilder<BinaryOperatorSignature> operators)
1034BinaryOperatorKind.Lifted | BinaryOperatorKind.UserDefined | kind,
1040BinaryOperatorKind.Lifted | BinaryOperatorKind.UserDefined | kind,
1055private static LiftingResult UserDefinedBinaryOperatorCanBeLifted(TypeSymbol left, TypeSymbol right, TypeSymbol result, BinaryOperatorKind kind)
1080case BinaryOperatorKind.Equal:
1081case BinaryOperatorKind.NotEqual:
1085goto case BinaryOperatorKind.GreaterThan;
1086case BinaryOperatorKind.GreaterThan:
1087case BinaryOperatorKind.GreaterThanOrEqual:
1088case BinaryOperatorKind.LessThan:
1089case BinaryOperatorKind.LessThanOrEqual:
1424private static void AssertNotChecked(BinaryOperatorKind kind)
1426Debug.Assert((kind & ~BinaryOperatorKind.Checked) == kind, "Did not expect operator to be checked. Consider using .Operator() to mask.");
1433BinaryOperatorKind kind,
1472static void getDeclaredUserDefinedBinaryOperatorsInScope(ArrayBuilder<Symbol> extensionCandidatesInSingleScope, BinaryOperatorKind kind, string name1, string? name2Opt, ArrayBuilder<BinaryOperatorSignature> operators)
1503static void getDeclaredUserDefinedBinaryOperators(ArrayBuilder<Symbol> extensionCandidatesInSingleScope, BinaryOperatorKind kind, string name, ArrayBuilder<BinaryOperatorSignature> operators)
1512void inferTypeArgumentsAndRemoveInapplicableToReceiverType(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> operators, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
1560BinaryOperatorKind.Lifted | BinaryOperatorKind.UserDefined | kind,
1568inferredCandidate = new BinaryOperatorSignature(BinaryOperatorKind.UserDefined | kind, leftOperandType, rightOperandType, resultType, method, constrainedToTypeOpt: null);
Compilation\BuiltInOperators.cs (368)
297builder.Add(GetSignature((BinaryOperatorKind)kind));
303internal void GetSimpleBuiltInOperators(BinaryOperatorKind kind, ArrayBuilder<BinaryOperatorSignature> operators, bool skipNativeIntegerOperators)
322ImmutableArray.Create<BinaryOperatorSignature>(GetSignature(BinaryOperatorKind.LogicalBoolAnd)), //and
324ImmutableArray.Create<BinaryOperatorSignature>(GetSignature(BinaryOperatorKind.LogicalBoolOr)), //or
332(int)BinaryOperatorKind.IntMultiplication,
333(int)BinaryOperatorKind.UIntMultiplication,
334(int)BinaryOperatorKind.LongMultiplication,
335(int)BinaryOperatorKind.ULongMultiplication,
336(int)BinaryOperatorKind.NIntMultiplication,
337(int)BinaryOperatorKind.NUIntMultiplication,
338(int)BinaryOperatorKind.FloatMultiplication,
339(int)BinaryOperatorKind.DoubleMultiplication,
340(int)BinaryOperatorKind.DecimalMultiplication,
341(int)BinaryOperatorKind.LiftedIntMultiplication,
342(int)BinaryOperatorKind.LiftedUIntMultiplication,
343(int)BinaryOperatorKind.LiftedLongMultiplication,
344(int)BinaryOperatorKind.LiftedULongMultiplication,
345(int)BinaryOperatorKind.LiftedNIntMultiplication,
346(int)BinaryOperatorKind.LiftedNUIntMultiplication,
347(int)BinaryOperatorKind.LiftedFloatMultiplication,
348(int)BinaryOperatorKind.LiftedDoubleMultiplication,
349(int)BinaryOperatorKind.LiftedDecimalMultiplication,
353(int)BinaryOperatorKind.IntAddition,
354(int)BinaryOperatorKind.UIntAddition,
355(int)BinaryOperatorKind.LongAddition,
356(int)BinaryOperatorKind.ULongAddition,
357(int)BinaryOperatorKind.NIntAddition,
358(int)BinaryOperatorKind.NUIntAddition,
359(int)BinaryOperatorKind.FloatAddition,
360(int)BinaryOperatorKind.DoubleAddition,
361(int)BinaryOperatorKind.DecimalAddition,
362(int)BinaryOperatorKind.LiftedIntAddition,
363(int)BinaryOperatorKind.LiftedUIntAddition,
364(int)BinaryOperatorKind.LiftedLongAddition,
365(int)BinaryOperatorKind.LiftedULongAddition,
366(int)BinaryOperatorKind.LiftedNIntAddition,
367(int)BinaryOperatorKind.LiftedNUIntAddition,
368(int)BinaryOperatorKind.LiftedFloatAddition,
369(int)BinaryOperatorKind.LiftedDoubleAddition,
370(int)BinaryOperatorKind.LiftedDecimalAddition,
371(int)BinaryOperatorKind.StringConcatenation,
372(int)BinaryOperatorKind.StringAndObjectConcatenation,
373(int)BinaryOperatorKind.ObjectAndStringConcatenation,
377(int)BinaryOperatorKind.IntSubtraction,
378(int)BinaryOperatorKind.UIntSubtraction,
379(int)BinaryOperatorKind.LongSubtraction,
380(int)BinaryOperatorKind.ULongSubtraction,
381(int)BinaryOperatorKind.NIntSubtraction,
382(int)BinaryOperatorKind.NUIntSubtraction,
383(int)BinaryOperatorKind.FloatSubtraction,
384(int)BinaryOperatorKind.DoubleSubtraction,
385(int)BinaryOperatorKind.DecimalSubtraction,
386(int)BinaryOperatorKind.LiftedIntSubtraction,
387(int)BinaryOperatorKind.LiftedUIntSubtraction,
388(int)BinaryOperatorKind.LiftedLongSubtraction,
389(int)BinaryOperatorKind.LiftedULongSubtraction,
390(int)BinaryOperatorKind.LiftedNIntSubtraction,
391(int)BinaryOperatorKind.LiftedNUIntSubtraction,
392(int)BinaryOperatorKind.LiftedFloatSubtraction,
393(int)BinaryOperatorKind.LiftedDoubleSubtraction,
394(int)BinaryOperatorKind.LiftedDecimalSubtraction,
398(int)BinaryOperatorKind.IntDivision,
399(int)BinaryOperatorKind.UIntDivision,
400(int)BinaryOperatorKind.LongDivision,
401(int)BinaryOperatorKind.ULongDivision,
402(int)BinaryOperatorKind.NIntDivision,
403(int)BinaryOperatorKind.NUIntDivision,
404(int)BinaryOperatorKind.FloatDivision,
405(int)BinaryOperatorKind.DoubleDivision,
406(int)BinaryOperatorKind.DecimalDivision,
407(int)BinaryOperatorKind.LiftedIntDivision,
408(int)BinaryOperatorKind.LiftedUIntDivision,
409(int)BinaryOperatorKind.LiftedLongDivision,
410(int)BinaryOperatorKind.LiftedULongDivision,
411(int)BinaryOperatorKind.LiftedNIntDivision,
412(int)BinaryOperatorKind.LiftedNUIntDivision,
413(int)BinaryOperatorKind.LiftedFloatDivision,
414(int)BinaryOperatorKind.LiftedDoubleDivision,
415(int)BinaryOperatorKind.LiftedDecimalDivision,
419(int)BinaryOperatorKind.IntRemainder,
420(int)BinaryOperatorKind.UIntRemainder,
421(int)BinaryOperatorKind.LongRemainder,
422(int)BinaryOperatorKind.ULongRemainder,
423(int)BinaryOperatorKind.NIntRemainder,
424(int)BinaryOperatorKind.NUIntRemainder,
425(int)BinaryOperatorKind.FloatRemainder,
426(int)BinaryOperatorKind.DoubleRemainder,
427(int)BinaryOperatorKind.DecimalRemainder,
428(int)BinaryOperatorKind.LiftedIntRemainder,
429(int)BinaryOperatorKind.LiftedUIntRemainder,
430(int)BinaryOperatorKind.LiftedLongRemainder,
431(int)BinaryOperatorKind.LiftedULongRemainder,
432(int)BinaryOperatorKind.LiftedNIntRemainder,
433(int)BinaryOperatorKind.LiftedNUIntRemainder,
434(int)BinaryOperatorKind.LiftedFloatRemainder,
435(int)BinaryOperatorKind.LiftedDoubleRemainder,
436(int)BinaryOperatorKind.LiftedDecimalRemainder,
440(int)BinaryOperatorKind.IntLeftShift,
441(int)BinaryOperatorKind.UIntLeftShift,
442(int)BinaryOperatorKind.LongLeftShift,
443(int)BinaryOperatorKind.ULongLeftShift,
444(int)BinaryOperatorKind.NIntLeftShift,
445(int)BinaryOperatorKind.NUIntLeftShift,
446(int)BinaryOperatorKind.LiftedIntLeftShift,
447(int)BinaryOperatorKind.LiftedUIntLeftShift,
448(int)BinaryOperatorKind.LiftedLongLeftShift,
449(int)BinaryOperatorKind.LiftedULongLeftShift,
450(int)BinaryOperatorKind.LiftedNIntLeftShift,
451(int)BinaryOperatorKind.LiftedNUIntLeftShift,
455(int)BinaryOperatorKind.IntRightShift,
456(int)BinaryOperatorKind.UIntRightShift,
457(int)BinaryOperatorKind.LongRightShift,
458(int)BinaryOperatorKind.ULongRightShift,
459(int)BinaryOperatorKind.NIntRightShift,
460(int)BinaryOperatorKind.NUIntRightShift,
461(int)BinaryOperatorKind.LiftedIntRightShift,
462(int)BinaryOperatorKind.LiftedUIntRightShift,
463(int)BinaryOperatorKind.LiftedLongRightShift,
464(int)BinaryOperatorKind.LiftedULongRightShift,
465(int)BinaryOperatorKind.LiftedNIntRightShift,
466(int)BinaryOperatorKind.LiftedNUIntRightShift,
470(int)BinaryOperatorKind.IntEqual,
471(int)BinaryOperatorKind.UIntEqual,
472(int)BinaryOperatorKind.LongEqual,
473(int)BinaryOperatorKind.ULongEqual,
474(int)BinaryOperatorKind.NIntEqual,
475(int)BinaryOperatorKind.NUIntEqual,
476(int)BinaryOperatorKind.FloatEqual,
477(int)BinaryOperatorKind.DoubleEqual,
478(int)BinaryOperatorKind.DecimalEqual,
479(int)BinaryOperatorKind.BoolEqual,
480(int)BinaryOperatorKind.LiftedIntEqual,
481(int)BinaryOperatorKind.LiftedUIntEqual,
482(int)BinaryOperatorKind.LiftedLongEqual,
483(int)BinaryOperatorKind.LiftedULongEqual,
484(int)BinaryOperatorKind.LiftedNIntEqual,
485(int)BinaryOperatorKind.LiftedNUIntEqual,
486(int)BinaryOperatorKind.LiftedFloatEqual,
487(int)BinaryOperatorKind.LiftedDoubleEqual,
488(int)BinaryOperatorKind.LiftedDecimalEqual,
489(int)BinaryOperatorKind.LiftedBoolEqual,
490(int)BinaryOperatorKind.ObjectEqual,
491(int)BinaryOperatorKind.StringEqual,
495(int)BinaryOperatorKind.IntNotEqual,
496(int)BinaryOperatorKind.UIntNotEqual,
497(int)BinaryOperatorKind.LongNotEqual,
498(int)BinaryOperatorKind.ULongNotEqual,
499(int)BinaryOperatorKind.NIntNotEqual,
500(int)BinaryOperatorKind.NUIntNotEqual,
501(int)BinaryOperatorKind.FloatNotEqual,
502(int)BinaryOperatorKind.DoubleNotEqual,
503(int)BinaryOperatorKind.DecimalNotEqual,
504(int)BinaryOperatorKind.BoolNotEqual,
505(int)BinaryOperatorKind.LiftedIntNotEqual,
506(int)BinaryOperatorKind.LiftedUIntNotEqual,
507(int)BinaryOperatorKind.LiftedLongNotEqual,
508(int)BinaryOperatorKind.LiftedULongNotEqual,
509(int)BinaryOperatorKind.LiftedNIntNotEqual,
510(int)BinaryOperatorKind.LiftedNUIntNotEqual,
511(int)BinaryOperatorKind.LiftedFloatNotEqual,
512(int)BinaryOperatorKind.LiftedDoubleNotEqual,
513(int)BinaryOperatorKind.LiftedDecimalNotEqual,
514(int)BinaryOperatorKind.LiftedBoolNotEqual,
515(int)BinaryOperatorKind.ObjectNotEqual,
516(int)BinaryOperatorKind.StringNotEqual,
520(int)BinaryOperatorKind.IntGreaterThan,
521(int)BinaryOperatorKind.UIntGreaterThan,
522(int)BinaryOperatorKind.LongGreaterThan,
523(int)BinaryOperatorKind.ULongGreaterThan,
524(int)BinaryOperatorKind.NIntGreaterThan,
525(int)BinaryOperatorKind.NUIntGreaterThan,
526(int)BinaryOperatorKind.FloatGreaterThan,
527(int)BinaryOperatorKind.DoubleGreaterThan,
528(int)BinaryOperatorKind.DecimalGreaterThan,
529(int)BinaryOperatorKind.LiftedIntGreaterThan,
530(int)BinaryOperatorKind.LiftedUIntGreaterThan,
531(int)BinaryOperatorKind.LiftedLongGreaterThan,
532(int)BinaryOperatorKind.LiftedULongGreaterThan,
533(int)BinaryOperatorKind.LiftedNIntGreaterThan,
534(int)BinaryOperatorKind.LiftedNUIntGreaterThan,
535(int)BinaryOperatorKind.LiftedFloatGreaterThan,
536(int)BinaryOperatorKind.LiftedDoubleGreaterThan,
537(int)BinaryOperatorKind.LiftedDecimalGreaterThan,
541(int)BinaryOperatorKind.IntLessThan,
542(int)BinaryOperatorKind.UIntLessThan,
543(int)BinaryOperatorKind.LongLessThan,
544(int)BinaryOperatorKind.ULongLessThan,
545(int)BinaryOperatorKind.NIntLessThan,
546(int)BinaryOperatorKind.NUIntLessThan,
547(int)BinaryOperatorKind.FloatLessThan,
548(int)BinaryOperatorKind.DoubleLessThan,
549(int)BinaryOperatorKind.DecimalLessThan,
550(int)BinaryOperatorKind.LiftedIntLessThan,
551(int)BinaryOperatorKind.LiftedUIntLessThan,
552(int)BinaryOperatorKind.LiftedLongLessThan,
553(int)BinaryOperatorKind.LiftedULongLessThan,
554(int)BinaryOperatorKind.LiftedNIntLessThan,
555(int)BinaryOperatorKind.LiftedNUIntLessThan,
556(int)BinaryOperatorKind.LiftedFloatLessThan,
557(int)BinaryOperatorKind.LiftedDoubleLessThan,
558(int)BinaryOperatorKind.LiftedDecimalLessThan,
562(int)BinaryOperatorKind.IntGreaterThanOrEqual,
563(int)BinaryOperatorKind.UIntGreaterThanOrEqual,
564(int)BinaryOperatorKind.LongGreaterThanOrEqual,
565(int)BinaryOperatorKind.ULongGreaterThanOrEqual,
566(int)BinaryOperatorKind.NIntGreaterThanOrEqual,
567(int)BinaryOperatorKind.NUIntGreaterThanOrEqual,
568(int)BinaryOperatorKind.FloatGreaterThanOrEqual,
569(int)BinaryOperatorKind.DoubleGreaterThanOrEqual,
570(int)BinaryOperatorKind.DecimalGreaterThanOrEqual,
571(int)BinaryOperatorKind.LiftedIntGreaterThanOrEqual,
572(int)BinaryOperatorKind.LiftedUIntGreaterThanOrEqual,
573(int)BinaryOperatorKind.LiftedLongGreaterThanOrEqual,
574(int)BinaryOperatorKind.LiftedULongGreaterThanOrEqual,
575(int)BinaryOperatorKind.LiftedNIntGreaterThanOrEqual,
576(int)BinaryOperatorKind.LiftedNUIntGreaterThanOrEqual,
577(int)BinaryOperatorKind.LiftedFloatGreaterThanOrEqual,
578(int)BinaryOperatorKind.LiftedDoubleGreaterThanOrEqual,
579(int)BinaryOperatorKind.LiftedDecimalGreaterThanOrEqual,
583(int)BinaryOperatorKind.IntLessThanOrEqual,
584(int)BinaryOperatorKind.UIntLessThanOrEqual,
585(int)BinaryOperatorKind.LongLessThanOrEqual,
586(int)BinaryOperatorKind.ULongLessThanOrEqual,
587(int)BinaryOperatorKind.NIntLessThanOrEqual,
588(int)BinaryOperatorKind.NUIntLessThanOrEqual,
589(int)BinaryOperatorKind.FloatLessThanOrEqual,
590(int)BinaryOperatorKind.DoubleLessThanOrEqual,
591(int)BinaryOperatorKind.DecimalLessThanOrEqual,
592(int)BinaryOperatorKind.LiftedIntLessThanOrEqual,
593(int)BinaryOperatorKind.LiftedUIntLessThanOrEqual,
594(int)BinaryOperatorKind.LiftedLongLessThanOrEqual,
595(int)BinaryOperatorKind.LiftedULongLessThanOrEqual,
596(int)BinaryOperatorKind.LiftedNIntLessThanOrEqual,
597(int)BinaryOperatorKind.LiftedNUIntLessThanOrEqual,
598(int)BinaryOperatorKind.LiftedFloatLessThanOrEqual,
599(int)BinaryOperatorKind.LiftedDoubleLessThanOrEqual,
600(int)BinaryOperatorKind.LiftedDecimalLessThanOrEqual,
604(int)BinaryOperatorKind.IntAnd,
605(int)BinaryOperatorKind.UIntAnd,
606(int)BinaryOperatorKind.LongAnd,
607(int)BinaryOperatorKind.ULongAnd,
608(int)BinaryOperatorKind.NIntAnd,
609(int)BinaryOperatorKind.NUIntAnd,
610(int)BinaryOperatorKind.BoolAnd,
611(int)BinaryOperatorKind.LiftedIntAnd,
612(int)BinaryOperatorKind.LiftedUIntAnd,
613(int)BinaryOperatorKind.LiftedLongAnd,
614(int)BinaryOperatorKind.LiftedULongAnd,
615(int)BinaryOperatorKind.LiftedNIntAnd,
616(int)BinaryOperatorKind.LiftedNUIntAnd,
617(int)BinaryOperatorKind.LiftedBoolAnd,
621(int)BinaryOperatorKind.IntXor,
622(int)BinaryOperatorKind.UIntXor,
623(int)BinaryOperatorKind.LongXor,
624(int)BinaryOperatorKind.ULongXor,
625(int)BinaryOperatorKind.NIntXor,
626(int)BinaryOperatorKind.NUIntXor,
627(int)BinaryOperatorKind.BoolXor,
628(int)BinaryOperatorKind.LiftedIntXor,
629(int)BinaryOperatorKind.LiftedUIntXor,
630(int)BinaryOperatorKind.LiftedLongXor,
631(int)BinaryOperatorKind.LiftedULongXor,
632(int)BinaryOperatorKind.LiftedNIntXor,
633(int)BinaryOperatorKind.LiftedNUIntXor,
634(int)BinaryOperatorKind.LiftedBoolXor,
638(int)BinaryOperatorKind.IntOr,
639(int)BinaryOperatorKind.UIntOr,
640(int)BinaryOperatorKind.LongOr,
641(int)BinaryOperatorKind.ULongOr,
642(int)BinaryOperatorKind.NIntOr,
643(int)BinaryOperatorKind.NUIntOr,
644(int)BinaryOperatorKind.BoolOr,
645(int)BinaryOperatorKind.LiftedIntOr,
646(int)BinaryOperatorKind.LiftedUIntOr,
647(int)BinaryOperatorKind.LiftedLongOr,
648(int)BinaryOperatorKind.LiftedULongOr,
649(int)BinaryOperatorKind.LiftedNIntOr,
650(int)BinaryOperatorKind.LiftedNUIntOr,
651(int)BinaryOperatorKind.LiftedBoolOr,
655(int)BinaryOperatorKind.IntUnsignedRightShift,
656(int)BinaryOperatorKind.UIntUnsignedRightShift,
657(int)BinaryOperatorKind.LongUnsignedRightShift,
658(int)BinaryOperatorKind.ULongUnsignedRightShift,
659(int)BinaryOperatorKind.NIntUnsignedRightShift,
660(int)BinaryOperatorKind.NUIntUnsignedRightShift,
661(int)BinaryOperatorKind.LiftedIntUnsignedRightShift,
662(int)BinaryOperatorKind.LiftedUIntUnsignedRightShift,
663(int)BinaryOperatorKind.LiftedLongUnsignedRightShift,
664(int)BinaryOperatorKind.LiftedULongUnsignedRightShift,
665(int)BinaryOperatorKind.LiftedNIntUnsignedRightShift,
666(int)BinaryOperatorKind.LiftedNUIntUnsignedRightShift,
681case BinaryOperatorKind.NInt:
682case BinaryOperatorKind.NUInt:
696static readonlySpanOfByte => new BinaryOperatorSignature(BinaryOperatorKind.Utf8Addition, readonlySpanOfByte, readonlySpanOfByte, readonlySpanOfByte),
702internal BinaryOperatorSignature GetSignature(BinaryOperatorKind kind)
707case BinaryOperatorKind.Multiplication:
708case BinaryOperatorKind.Division:
709case BinaryOperatorKind.Subtraction:
710case BinaryOperatorKind.Remainder:
711case BinaryOperatorKind.And:
712case BinaryOperatorKind.Or:
713case BinaryOperatorKind.Xor:
715case BinaryOperatorKind.Addition:
717case BinaryOperatorKind.LeftShift:
718case BinaryOperatorKind.RightShift:
719case BinaryOperatorKind.UnsignedRightShift:
727case BinaryOperatorKind.Equal:
728case BinaryOperatorKind.NotEqual:
729case BinaryOperatorKind.GreaterThan:
730case BinaryOperatorKind.LessThan:
731case BinaryOperatorKind.GreaterThanOrEqual:
732case BinaryOperatorKind.LessThanOrEqual:
738private TypeSymbol LeftType(BinaryOperatorKind kind)
748case BinaryOperatorKind.Int: return _compilation.GetSpecialType(SpecialType.System_Int32);
749case BinaryOperatorKind.UInt: return _compilation.GetSpecialType(SpecialType.System_UInt32);
750case BinaryOperatorKind.Long: return _compilation.GetSpecialType(SpecialType.System_Int64);
751case BinaryOperatorKind.ULong: return _compilation.GetSpecialType(SpecialType.System_UInt64);
752case BinaryOperatorKind.NInt: return _compilation.CreateNativeIntegerTypeSymbol(signed: true);
753case BinaryOperatorKind.NUInt: return _compilation.CreateNativeIntegerTypeSymbol(signed: false);
754case BinaryOperatorKind.Float: return _compilation.GetSpecialType(SpecialType.System_Single);
755case BinaryOperatorKind.Double: return _compilation.GetSpecialType(SpecialType.System_Double);
756case BinaryOperatorKind.Decimal: return _compilation.GetSpecialType(SpecialType.System_Decimal);
757case BinaryOperatorKind.Bool: return _compilation.GetSpecialType(SpecialType.System_Boolean);
758case BinaryOperatorKind.ObjectAndString:
759case BinaryOperatorKind.Object:
761case BinaryOperatorKind.String:
762case BinaryOperatorKind.StringAndObject:
770private TypeSymbol RightType(BinaryOperatorKind kind)
780case BinaryOperatorKind.Int: return _compilation.GetSpecialType(SpecialType.System_Int32);
781case BinaryOperatorKind.UInt: return _compilation.GetSpecialType(SpecialType.System_UInt32);
782case BinaryOperatorKind.Long: return _compilation.GetSpecialType(SpecialType.System_Int64);
783case BinaryOperatorKind.ULong: return _compilation.GetSpecialType(SpecialType.System_UInt64);
784case BinaryOperatorKind.NInt: return _compilation.CreateNativeIntegerTypeSymbol(signed: true);
785case BinaryOperatorKind.NUInt: return _compilation.CreateNativeIntegerTypeSymbol(signed: false);
786case BinaryOperatorKind.Float: return _compilation.GetSpecialType(SpecialType.System_Single);
787case BinaryOperatorKind.Double: return _compilation.GetSpecialType(SpecialType.System_Double);
788case BinaryOperatorKind.Decimal: return _compilation.GetSpecialType(SpecialType.System_Decimal);
789case BinaryOperatorKind.Bool: return _compilation.GetSpecialType(SpecialType.System_Boolean);
790case BinaryOperatorKind.ObjectAndString:
791case BinaryOperatorKind.String:
793case BinaryOperatorKind.StringAndObject:
794case BinaryOperatorKind.Object:
802private TypeSymbol ReturnType(BinaryOperatorKind kind)
812case BinaryOperatorKind.Int: return _compilation.GetSpecialType(SpecialType.System_Int32);
813case BinaryOperatorKind.UInt: return _compilation.GetSpecialType(SpecialType.System_UInt32);
814case BinaryOperatorKind.Long: return _compilation.GetSpecialType(SpecialType.System_Int64);
815case BinaryOperatorKind.ULong: return _compilation.GetSpecialType(SpecialType.System_UInt64);
816case BinaryOperatorKind.NInt: return _compilation.CreateNativeIntegerTypeSymbol(signed: true);
817case BinaryOperatorKind.NUInt: return _compilation.CreateNativeIntegerTypeSymbol(signed: false);
818case BinaryOperatorKind.Float: return _compilation.GetSpecialType(SpecialType.System_Single);
819case BinaryOperatorKind.Double: return _compilation.GetSpecialType(SpecialType.System_Double);
820case BinaryOperatorKind.Decimal: return _compilation.GetSpecialType(SpecialType.System_Decimal);
821case BinaryOperatorKind.Bool: return _compilation.GetSpecialType(SpecialType.System_Boolean);
822case BinaryOperatorKind.Object: return _compilation.GetSpecialType(SpecialType.System_Object);
823case BinaryOperatorKind.ObjectAndString:
824case BinaryOperatorKind.StringAndObject:
825case BinaryOperatorKind.String:
833private TypeSymbol LiftedType(BinaryOperatorKind kind)
839BinaryOperatorKind.Int => _compilation.GetSpecialType(SpecialType.System_Int32),
840BinaryOperatorKind.UInt => _compilation.GetSpecialType(SpecialType.System_UInt32),
841BinaryOperatorKind.Long => _compilation.GetSpecialType(SpecialType.System_Int64),
842BinaryOperatorKind.ULong => _compilation.GetSpecialType(SpecialType.System_UInt64),
843BinaryOperatorKind.NInt => _compilation.CreateNativeIntegerTypeSymbol(signed: true),
844BinaryOperatorKind.NUInt => _compilation.CreateNativeIntegerTypeSymbol(signed: false),
845BinaryOperatorKind.Float => _compilation.GetSpecialType(SpecialType.System_Single),
846BinaryOperatorKind.Double => _compilation.GetSpecialType(SpecialType.System_Double),
847BinaryOperatorKind.Decimal => _compilation.GetSpecialType(SpecialType.System_Decimal),
848BinaryOperatorKind.Bool => _compilation.GetSpecialType(SpecialType.System_Boolean),
Compiler\MethodBodySynthesizer.Lowered.cs (11)
85F.Binary(BinaryOperatorKind.ObjectNotEqual, F.SpecialType(SpecialType.System_Boolean),
95F.Binary(BinaryOperatorKind.Multiplication, hashCode.Type,
96F.Binary(BinaryOperatorKind.Xor, hashCode.Type,
107F.Binary(BinaryOperatorKind.Addition, i.Type,
112F.Binary(BinaryOperatorKind.LessThan, F.SpecialType(SpecialType.System_Boolean),
182F.Binary(BinaryOperatorKind.Multiplication, hashCode.Type,
183F.Binary(BinaryOperatorKind.Xor, hashCode.Type,
196F.Binary(BinaryOperatorKind.Addition, i.Type,
201F.Binary(BinaryOperatorKind.LessThan, F.SpecialType(SpecialType.System_Boolean),
367currentHashValue = F.Binary(BinaryOperatorKind.IntMultiplication, system_Int32, currentHashValue, boundHashFactor);
370currentHashValue = F.Binary(BinaryOperatorKind.IntAddition,
Generated\BoundNodes.xml.Generated.cs (15)
1642public BoundBinaryOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type, bool hasErrors = false)
1655public BinaryOperatorKind OperatorKind { get; }
1662public BoundBinaryOperator Update(BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type)
1676public BoundTupleBinaryOperator(SyntaxNode syntax, BoundExpression left, BoundExpression right, BinaryOperatorKind operatorKind, TupleBinaryOperatorInfo.Multiple operators, TypeSymbol type, bool hasErrors = false)
1694public BinaryOperatorKind OperatorKind { get; }
1700public BoundTupleBinaryOperator Update(BoundExpression left, BoundExpression right, BinaryOperatorKind operatorKind, TupleBinaryOperatorInfo.Multiple operators, TypeSymbol type)
1714public BoundUserDefinedConditionalLogicalOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, MethodSymbol logicalOperator, MethodSymbol trueOperator, MethodSymbol falseOperator, BoundValuePlaceholder? trueFalseOperandPlaceholder, BoundExpression? trueFalseOperandConversion, TypeSymbol? constrainedToTypeOpt, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, BoundExpression left, BoundExpression right, TypeSymbol type, bool hasErrors = false)
1740public BinaryOperatorKind OperatorKind { get; }
1753public BoundUserDefinedConditionalLogicalOperator Update(BinaryOperatorKind operatorKind, MethodSymbol logicalOperator, MethodSymbol trueOperator, MethodSymbol falseOperator, BoundValuePlaceholder? trueFalseOperandPlaceholder, BoundExpression? trueFalseOperandConversion, TypeSymbol? constrainedToTypeOpt, LookupResultKind resultKind, ImmutableArray<MethodSymbol> originalUserDefinedOperatorsOpt, BoundExpression left, BoundExpression right, TypeSymbol type)
5339public BoundDagRelationalTest(SyntaxNode syntax, BinaryOperatorKind operatorKind, ConstantValue value, BoundDagTemp input, bool hasErrors = false)
5350public BinaryOperatorKind OperatorKind { get; }
5356public BoundDagRelationalTest Update(BinaryOperatorKind operatorKind, ConstantValue value, BoundDagTemp input)
8526public BoundRelationalPattern(SyntaxNode syntax, BinaryOperatorKind relation, BoundExpression value, ConstantValue constantValue, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8544public BinaryOperatorKind Relation { get; }
8551public BoundRelationalPattern Update(BinaryOperatorKind relation, BoundExpression value, ConstantValue constantValue, TypeSymbol inputType, TypeSymbol narrowedType)
Lowering\LocalRewriter\LocalRewriter.DecisionDagRewriter.cs (7)
644splitCases(ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, BinaryOperatorKind op, ConstantValue value)
732_fac.Related(BinaryOperatorKind.LessThanOrEqual, x, y) ?
733(_fac.Related(BinaryOperatorKind.LessThanOrEqual, y, x) ? 0 : -1) :
813var lessThanOrEqualOperator = input.Type.SpecialType switch
815SpecialType.System_Single => BinaryOperatorKind.FloatLessThanOrEqual,
816SpecialType.System_Double => BinaryOperatorKind.DoubleLessThanOrEqual,
817SpecialType.System_Decimal => BinaryOperatorKind.DecimalLessThanOrEqual,
Lowering\LocalRewriter\LocalRewriter.DecisionDagRewriter.ValueDispatchNode.cs (12)
63/// For <see cref="BinaryOperatorKind.LessThan"/> and <see cref="BinaryOperatorKind.LessThanOrEqual"/>,
65/// is <see cref="Right"/>; for <see cref="BinaryOperatorKind.GreaterThan"/> and
66/// <see cref="BinaryOperatorKind.GreaterThanOrEqual"/> it is reversed.
67/// See <see cref="IsReversed(BinaryOperatorKind)"/> for where that is computed.
81public readonly BinaryOperatorKind Operator;
86private RelationalDispatch(SyntaxNode syntax, ConstantValue value, BinaryOperatorKind op, ValueDispatchNode left, ValueDispatchNode right) : base(syntax)
100private static bool IsReversed(BinaryOperatorKind op) => op.Operator() switch { BinaryOperatorKind.GreaterThan => true, BinaryOperatorKind.GreaterThanOrEqual => true, _ => false };
133public static ValueDispatchNode CreateBalanced(SyntaxNode syntax, ConstantValue value, BinaryOperatorKind op, ValueDispatchNode whenTrue, ValueDispatchNode whenFalse)
140private static ValueDispatchNode CreateBalancedCore(SyntaxNode syntax, ConstantValue value, BinaryOperatorKind op, ValueDispatchNode left, ValueDispatchNode right)
Lowering\LocalRewriter\LocalRewriter_BinaryOperator.cs (224)
72var operatorKind = node.OperatorKind;
89operatorKind.Operator() == BinaryOperatorKind.And ? node.FalseOperator : node.TrueOperator,
93var andOperatorCall = LowerUserDefinedBinaryOperator(syntax, operatorKind & ~BinaryOperatorKind.Logical, boundTemp, loweredRight, type, node.LogicalOperator, node.ConstrainedToTypeOpt);
123if (node.OperatorKind is BinaryOperatorKind.Utf8Addition)
145if (current.InterpolatedStringHandlerData is not null || current.OperatorKind is BinaryOperatorKind.Utf8Addition || IsBinaryStringConcatenation(current))
169Debug.Assert(node.OperatorKind == BinaryOperatorKind.StringConcatenation);
183BinaryOperatorKind operatorKind,
199BinaryOperatorKind operatorKind,
215case BinaryOperatorKind.ObjectAndStringConcatenation:
216case BinaryOperatorKind.StringAndObjectConcatenation:
217case BinaryOperatorKind.StringConcatenation:
219case BinaryOperatorKind.DelegateCombination:
221case BinaryOperatorKind.DelegateRemoval:
223case BinaryOperatorKind.DelegateEqual:
225case BinaryOperatorKind.DelegateNotEqual:
259case BinaryOperatorKind.NullableNullEqual:
260case BinaryOperatorKind.NullableNullNotEqual:
263case BinaryOperatorKind.ObjectAndStringConcatenation:
264case BinaryOperatorKind.StringAndObjectConcatenation:
265case BinaryOperatorKind.StringConcatenation:
268case BinaryOperatorKind.StringEqual:
271case BinaryOperatorKind.StringNotEqual:
274case BinaryOperatorKind.DelegateCombination:
277case BinaryOperatorKind.DelegateRemoval:
280case BinaryOperatorKind.DelegateEqual:
283case BinaryOperatorKind.DelegateNotEqual:
286case BinaryOperatorKind.LogicalBoolAnd:
293operatorKind &= ~BinaryOperatorKind.Logical;
298case BinaryOperatorKind.LogicalBoolOr:
305operatorKind &= ~BinaryOperatorKind.Logical;
310case BinaryOperatorKind.BoolAnd:
331case BinaryOperatorKind.BoolOr:
336case BinaryOperatorKind.BoolEqual:
350case BinaryOperatorKind.BoolNotEqual:
364case BinaryOperatorKind.BoolXor:
378case BinaryOperatorKind.IntLeftShift:
379case BinaryOperatorKind.UIntLeftShift:
380case BinaryOperatorKind.IntRightShift:
381case BinaryOperatorKind.UIntRightShift:
382case BinaryOperatorKind.IntUnsignedRightShift:
383case BinaryOperatorKind.UIntUnsignedRightShift:
386case BinaryOperatorKind.LongLeftShift:
387case BinaryOperatorKind.ULongLeftShift:
388case BinaryOperatorKind.LongRightShift:
389case BinaryOperatorKind.ULongRightShift:
390case BinaryOperatorKind.LongUnsignedRightShift:
391case BinaryOperatorKind.ULongUnsignedRightShift:
394case BinaryOperatorKind.NIntRightShift:
395case BinaryOperatorKind.NUIntRightShift:
396case BinaryOperatorKind.NIntUnsignedRightShift:
397case BinaryOperatorKind.NUIntUnsignedRightShift:
398case BinaryOperatorKind.NIntLeftShift:
399case BinaryOperatorKind.NUIntLeftShift:
402case BinaryOperatorKind.DecimalAddition:
403case BinaryOperatorKind.DecimalSubtraction:
404case BinaryOperatorKind.DecimalMultiplication:
405case BinaryOperatorKind.DecimalDivision:
406case BinaryOperatorKind.DecimalRemainder:
407case BinaryOperatorKind.DecimalEqual:
408case BinaryOperatorKind.DecimalNotEqual:
409case BinaryOperatorKind.DecimalLessThan:
410case BinaryOperatorKind.DecimalLessThanOrEqual:
411case BinaryOperatorKind.DecimalGreaterThan:
412case BinaryOperatorKind.DecimalGreaterThanOrEqual:
415case BinaryOperatorKind.PointerAndIntAddition:
416case BinaryOperatorKind.PointerAndUIntAddition:
417case BinaryOperatorKind.PointerAndLongAddition:
418case BinaryOperatorKind.PointerAndULongAddition:
419case BinaryOperatorKind.PointerAndIntSubtraction:
420case BinaryOperatorKind.PointerAndUIntSubtraction:
421case BinaryOperatorKind.PointerAndLongSubtraction:
422case BinaryOperatorKind.PointerAndULongSubtraction:
429case BinaryOperatorKind.IntAndPointerAddition:
430case BinaryOperatorKind.UIntAndPointerAddition:
431case BinaryOperatorKind.LongAndPointerAddition:
432case BinaryOperatorKind.ULongAndPointerAddition:
439case BinaryOperatorKind.PointerSubtraction:
442case BinaryOperatorKind.IntAddition:
443case BinaryOperatorKind.UIntAddition:
444case BinaryOperatorKind.LongAddition:
445case BinaryOperatorKind.ULongAddition:
456case BinaryOperatorKind.IntSubtraction:
457case BinaryOperatorKind.LongSubtraction:
458case BinaryOperatorKind.UIntSubtraction:
459case BinaryOperatorKind.ULongSubtraction:
466case BinaryOperatorKind.IntMultiplication:
467case BinaryOperatorKind.LongMultiplication:
468case BinaryOperatorKind.UIntMultiplication:
469case BinaryOperatorKind.ULongMultiplication:
488case BinaryOperatorKind.IntGreaterThan:
489case BinaryOperatorKind.IntLessThanOrEqual:
493var newOp = operatorKind == BinaryOperatorKind.IntGreaterThan ?
494BinaryOperatorKind.NotEqual :
495BinaryOperatorKind.Equal;
497operatorKind &= ~BinaryOperatorKind.OpMask;
503case BinaryOperatorKind.IntLessThan:
504case BinaryOperatorKind.IntGreaterThanOrEqual:
508var newOp = operatorKind == BinaryOperatorKind.IntLessThan ?
509BinaryOperatorKind.NotEqual :
510BinaryOperatorKind.Equal;
512operatorKind &= ~BinaryOperatorKind.OpMask;
518case BinaryOperatorKind.IntEqual:
519case BinaryOperatorKind.IntNotEqual:
531case BinaryOperatorKind.Utf8Addition:
544private BoundExpression RewriteLiftedBinaryOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, MethodSymbol? method, TypeSymbol? constrainedToTypeOpt)
552operatorKind != BinaryOperatorKind.LiftedBoolOr && operatorKind != BinaryOperatorKind.LiftedBoolAnd &&
573if (operatorKind.Operator() == BinaryOperatorKind.NotEqual ||
574operatorKind.Operator() == BinaryOperatorKind.Equal)
604BinaryOperatorKind operatorKind,
613Debug.Assert(operatorKind.Operator() == BinaryOperatorKind.And || operatorKind.Operator() == BinaryOperatorKind.Or);
624bool isAnd = operatorKind.Operator() == BinaryOperatorKind.And;
688result = _factory.Binary(BinaryOperatorKind.LogicalOr, boolean, leftTest, result);
732private BoundExpression MakeTruthTestForDynamicLogicalOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, TypeSymbol boolean, MethodSymbol? leftTruthOperator, TypeSymbol? constrainedToTypeOpt, bool negative)
787BinaryOperatorKind operatorKind,
815BinaryOperatorKind kind,
834return MakeLiteral(syntax, ConstantValue.Create(kind.Operator() == BinaryOperatorKind.Equal), boolType);
857BinaryOperatorKind operatorKind = kind.Operator();
861BoundExpression result = MakeLiteral(syntax, ConstantValue.Create(operatorKind == BinaryOperatorKind.NotEqual), boolType);
888if (operatorKind == BinaryOperatorKind.Equal || operatorKind == BinaryOperatorKind.NotEqual)
891BoundExpression result = operatorKind == BinaryOperatorKind.Equal ?
898BoundExpression falseExpr = MakeBooleanConstant(syntax, operatorKind == BinaryOperatorKind.NotEqual);
955BinaryOperatorKind kind,
1018if (kind.Operator() is BinaryOperatorKind.Equal or BinaryOperatorKind.NotEqual)
1055BinaryOperatorKind leftOperator;
1056BinaryOperatorKind rightOperator;
1058BinaryOperatorKind operatorKind = kind.Operator();
1061case BinaryOperatorKind.Equal:
1062case BinaryOperatorKind.NotEqual:
1063leftOperator = BinaryOperatorKind.Equal;
1064rightOperator = BinaryOperatorKind.BoolEqual;
1068rightOperator = BinaryOperatorKind.BoolAnd;
1096operatorKind: BinaryOperatorKind.BoolAnd,
1105if (operatorKind == BinaryOperatorKind.NotEqual)
1145BinaryOperatorKind kind,
1229BinaryOperatorKind conditionOperator;
1230BinaryOperatorKind operatorKind = kind.Operator();
1233case BinaryOperatorKind.Equal:
1234case BinaryOperatorKind.NotEqual:
1235conditionOperator = BinaryOperatorKind.BoolEqual;
1238conditionOperator = BinaryOperatorKind.BoolAnd;
1264if (operatorKind == BinaryOperatorKind.Equal || operatorKind == BinaryOperatorKind.NotEqual)
1279rewrittenAlternative: MakeLiteral(syntax, ConstantValue.Create(operatorKind == BinaryOperatorKind.Equal), boolType),
1292BoundExpression alternative = MakeBooleanConstant(syntax, operatorKind == BinaryOperatorKind.NotEqual);
1313BinaryOperatorKind kind,
1353BinaryOperatorKind kind,
1422BinaryOperatorKind kind,
1476BoundExpression condition = MakeBinaryOperator(syntax, BinaryOperatorKind.BoolAnd, callX_HasValue, callY_HasValue, boolType, method: null, constrainedToTypeOpt: null);
1524BinaryOperatorKind kind,
1538if (kind == BinaryOperatorKind.LiftedBoolAnd || kind == BinaryOperatorKind.LiftedBoolOr)
1675BinaryOperatorKind kind,
1712BoundExpression newNullBool = MakeNewNullableBoolean(syntax, kind == BinaryOperatorKind.LiftedBoolOr);
1717rewrittenConsequence: kind == BinaryOperatorKind.LiftedBoolAnd ? nullBool : newNullBool,
1718rewrittenAlternative: kind == BinaryOperatorKind.LiftedBoolAnd ? newNullBool : nullBool,
1739BoundExpression consequence = kind == BinaryOperatorKind.LiftedBoolAnd ? nullBool : boundTemp;
1740BoundExpression alternative = kind == BinaryOperatorKind.LiftedBoolAnd ? boundTemp : nullBool;
1760BinaryOperatorKind kind,
1800BoundExpression newNullBool = MakeNewNullableBoolean(syntax, kind == BinaryOperatorKind.LiftedBoolOr);
1801BoundExpression consequence = kind == BinaryOperatorKind.LiftedBoolOr ? newNullBool : maybeNullTemp;
1802BoundExpression alternative = kind == BinaryOperatorKind.LiftedBoolOr ? maybeNullTemp : newNullBool;
1821BinaryOperatorKind kind,
1867operatorKind: BinaryOperatorKind.LogicalBoolOr,
1880operatorKind: BinaryOperatorKind.LogicalBoolOr,
1887BoundExpression consequence = kind == BinaryOperatorKind.LiftedBoolAnd ? boundTempY : boundTempX;
1888BoundExpression alternative = kind == BinaryOperatorKind.LiftedBoolAnd ? boundTempX : boundTempY;
1943BinaryOperatorKind kind,
1969return MakeLiteral(syntax, ConstantValue.Create(kind == BinaryOperatorKind.NullableNullEqual), returnType);
1984value: MakeBooleanConstant(syntax, kind == BinaryOperatorKind.NullableNullNotEqual),
2000var whenNull = kind == BinaryOperatorKind.NullableNullEqual ? MakeBooleanConstant(syntax, true) : null;
2006BoundExpression result = kind == BinaryOperatorKind.NullableNullNotEqual ?
2013private BoundExpression RewriteStringEquality(BoundBinaryOperator? oldNode, SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, SpecialMember member)
2026private BoundExpression RewriteDelegateOperation(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundExpression loweredLeft, BoundExpression loweredRight, TypeSymbol type, SpecialMember member)
2029if (operatorKind == BinaryOperatorKind.DelegateEqual || operatorKind == BinaryOperatorKind.DelegateNotEqual)
2037operatorKind = (operatorKind & (~BinaryOperatorKind.Delegate)) | BinaryOperatorKind.Object;
2056private BoundExpression RewriteDecimalBinaryOperation(SyntaxNode syntax, BoundExpression loweredLeft, BoundExpression loweredRight, BinaryOperatorKind operatorKind)
2065case BinaryOperatorKind.DecimalAddition: member = SpecialMember.System_Decimal__op_Addition; break;
2066case BinaryOperatorKind.DecimalSubtraction: member = SpecialMember.System_Decimal__op_Subtraction; break;
2067case BinaryOperatorKind.DecimalMultiplication: member = SpecialMember.System_Decimal__op_Multiply; break;
2068case BinaryOperatorKind.DecimalDivision: member = SpecialMember.System_Decimal__op_Division; break;
2069case BinaryOperatorKind.DecimalRemainder: member = SpecialMember.System_Decimal__op_Modulus; break;
2070case BinaryOperatorKind.DecimalEqual: member = SpecialMember.System_Decimal__op_Equality; break;
2071case BinaryOperatorKind.DecimalNotEqual: member = SpecialMember.System_Decimal__op_Inequality; break;
2072case BinaryOperatorKind.DecimalLessThan: member = SpecialMember.System_Decimal__op_LessThan; break;
2073case BinaryOperatorKind.DecimalLessThanOrEqual: member = SpecialMember.System_Decimal__op_LessThanOrEqual; break;
2074case BinaryOperatorKind.DecimalGreaterThan: member = SpecialMember.System_Decimal__op_GreaterThan; break;
2075case BinaryOperatorKind.DecimalGreaterThanOrEqual: member = SpecialMember.System_Decimal__op_GreaterThanOrEqual; break;
2087private BoundExpression MakeNullCheck(SyntaxNode syntax, BoundExpression rewrittenExpr, BinaryOperatorKind operatorKind)
2089Debug.Assert((operatorKind == BinaryOperatorKind.Equal) || (operatorKind == BinaryOperatorKind.NotEqual) ||
2090(operatorKind == BinaryOperatorKind.NullableNullEqual) || (operatorKind == BinaryOperatorKind.NullableNullNotEqual));
2108case BinaryOperatorKind.Equal:
2110case BinaryOperatorKind.NotEqual:
2126operatorKind |= BinaryOperatorKind.NullableNull;
2147BinaryOperatorKind operatorKind,
2171BinaryOperatorKind andOperatorKind = (operatorKind & ~BinaryOperatorKind.OpMask) | BinaryOperatorKind.And;
2209BinaryOperatorKind operatorKind,
2249BinaryOperatorKind andOperatorKind = (operatorKind & ~BinaryOperatorKind.OpMask) | BinaryOperatorKind.And;
2269BinaryOperatorKind kind,
2289Debug.Assert(kind.Operator() == BinaryOperatorKind.Addition);
2294kind = kind & ~BinaryOperatorKind.Checked;
2391BinaryOperatorKind multiplicationKind = BinaryOperatorKind.Multiplication;
2406multiplicationKind |= BinaryOperatorKind.Int; //i.e. signed
2419multiplicationKind |= BinaryOperatorKind.Long;
2431multiplicationKind |= BinaryOperatorKind.Long;
2443multiplicationKind |= BinaryOperatorKind.ULong;
2456multiplicationKind |= BinaryOperatorKind.Checked;
2465BinaryOperatorKind kind,
2483BinaryOperatorKind.Division,
2486kind & ~BinaryOperatorKind.Checked, // For some reason, dev10 never checks for subtraction overflow.
Lowering\LocalRewriter\LocalRewriter_CollectionExpression.cs (4)
809_factory.Binary(BinaryOperatorKind.Addition, indexTemp.Type, indexTemp, _factory.Literal(1)),
1013sideEffects.Add(new BoundAssignmentOperator(rewrittenSpreadOperand.Syntax, indexTemp, _factory.Binary(BinaryOperatorKind.Addition, indexTemp.Type, indexTemp, spreadLength), isRef: false, indexTemp.Type));
1145_factory.Binary(BinaryOperatorKind.Addition, indexTemp.Type, indexTemp, _factory.Literal(1)),
1317_factory.Binary(BinaryOperatorKind.Addition, sum.Type!, sum, value);
Lowering\LocalRewriter\LocalRewriter_FixedStatement.cs (5)
475BoundExpression notNullCheck = _factory.MakeNullCheck(factory.Syntax, factory.Local(localSymbol), BinaryOperatorKind.NotEqual);
488BoundExpression addition = factory.Binary(BinaryOperatorKind.PointerAndIntAddition, localType, factory.Local(localSymbol), helperCall);
529BoundExpression notNullCheck = _factory.MakeNullCheck(factory.Syntax, arrayTempInit, BinaryOperatorKind.NotEqual);
552BoundExpression lengthCheck = factory.Binary(BinaryOperatorKind.IntNotEqual, factory.SpecialType(SpecialType.System_Boolean), lengthCall, factory.Literal(0));
555BoundExpression condition = factory.Binary(BinaryOperatorKind.LogicalBoolAnd, factory.SpecialType(SpecialType.System_Boolean), notNullCheck, lengthCheck);
Lowering\LocalRewriter\LocalRewriter_TupleBinaryOperator.cs (14)
247ArrayBuilder<LocalSymbol> temps, BinaryOperatorKind operatorKind)
259return new BoundLiteral(left.Syntax, ConstantValue.Create(nullnull.Kind == BinaryOperatorKind.Equal), boolType);
267TypeSymbol boolType, ArrayBuilder<LocalSymbol> temps, BinaryOperatorKind operatorKind)
316bool boolValue = operatorKind == BinaryOperatorKind.Equal; // true/false
341_factory.Binary(BinaryOperatorKind.Equal, boolType, leftHasValue, rightHasValue),
486ArrayBuilder<LocalSymbol> temps, BinaryOperatorKind operatorKind)
502var logicalOperator = operatorKind == BinaryOperatorKind.Equal ? BinaryOperatorKind.LogicalBoolAnd : BinaryOperatorKind.LogicalBoolOr;
542BoundExpression left, BoundExpression right, TypeSymbol boolType, BinaryOperatorKind operatorKind)
556if (operatorKind == BinaryOperatorKind.Equal)
569return new BoundLiteral(left.Syntax, ConstantValue.Create(operatorKind == BinaryOperatorKind.Equal), boolType);
586if (operatorKind == BinaryOperatorKind.Equal)
Lowering\SyntheticBoundNodeFactory.cs (26)
642public BoundBinaryOperator Binary(BinaryOperatorKind kind, TypeSymbol type, BoundExpression left, BoundExpression right)
665return Binary(BinaryOperatorKind.LogicalBoolAnd, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
672return Binary(BinaryOperatorKind.LogicalBoolOr, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
677return Binary(BinaryOperatorKind.IntEqual, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
682return Binary(BinaryOperatorKind.ObjectEqual, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
693return Binary(BinaryOperatorKind.ObjectNotEqual, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
698return Binary(BinaryOperatorKind.IntNotEqual, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
703return Binary(BinaryOperatorKind.IntLessThan, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
708return Binary(BinaryOperatorKind.IntGreaterThanOrEqual, SpecialType(CodeAnalysis.SpecialType.System_Boolean), left, right);
713return Binary(BinaryOperatorKind.IntSubtraction, SpecialType(CodeAnalysis.SpecialType.System_Int32), left, right);
718return Binary(BinaryOperatorKind.IntMultiplication, SpecialType(CodeAnalysis.SpecialType.System_Int32), left, right);
1759internal BoundExpression MakeNullCheck(SyntaxNode syntax, BoundExpression rewrittenExpr, BinaryOperatorKind operatorKind)
1761Debug.Assert((operatorKind == BinaryOperatorKind.Equal) || (operatorKind == BinaryOperatorKind.NotEqual) ||
1762(operatorKind == BinaryOperatorKind.NullableNullEqual) || (operatorKind == BinaryOperatorKind.NullableNullNotEqual));
1780case BinaryOperatorKind.Equal:
1782case BinaryOperatorKind.NotEqual:
1798operatorKind |= BinaryOperatorKind.NullableNull;
1801if (operatorKind == BinaryOperatorKind.NullableNullEqual || operatorKind == BinaryOperatorKind.NullableNullNotEqual)
1823BinaryOperatorKind kind,
1849return Literal(kind == BinaryOperatorKind.NullableNullEqual);
1864value: Literal(kind == BinaryOperatorKind.NullableNullNotEqual),
1880var whenNull = kind == BinaryOperatorKind.NullableNullEqual ? Literal(true) : null;
1886BoundExpression result = kind == BinaryOperatorKind.NullableNullNotEqual ?
Utilities\IValueSet.cs (13)
35/// are <see cref="BinaryOperatorKind.Equal"/> for all supported types, and for numeric types we also support
36/// <see cref="BinaryOperatorKind.LessThan"/>, <see cref="BinaryOperatorKind.LessThanOrEqual"/>, <see cref="BinaryOperatorKind.GreaterThan"/>, and
37/// <see cref="BinaryOperatorKind.GreaterThanOrEqual"/>.
39bool Any(BinaryOperatorKind relation, ConstantValue value);
43/// Because of that all four combinations of results from <see cref="Any(BinaryOperatorKind, ConstantValue)"/> and <see cref="All(BinaryOperatorKind, ConstantValue)"/>
48bool All(BinaryOperatorKind relation, ConstantValue value);
85bool Any(BinaryOperatorKind relation, T value);
89/// Because of that all four combinations of results from <see cref="Any(BinaryOperatorKind, T)"/> and <see cref="All(BinaryOperatorKind, T)"/>
94bool All(BinaryOperatorKind relation, T value);