Binder\Binder_Operators.cs (303)
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),
192isUnsignedRightShift: bestSignature.Kind.Operator() == BinaryOperatorKind.UnsignedRightShift, bestSignature.ConstrainedToTypeOpt, diagnostics);
262BoundCompoundAssignmentOperator? tryApplyUserDefinedInstanceOperator(ExpressionSyntax node, SyntaxToken operatorToken, BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BindingDiagnosticBag diagnostics)
403private BoundExpression BindEventAssignment(AssignmentExpressionSyntax node, BoundEventAccess left, BoundExpression right, BinaryOperatorKind opKind, BindingDiagnosticBag diagnostics)
405Debug.Assert(opKind == BinaryOperatorKind.Addition || opKind == BinaryOperatorKind.Subtraction);
428bool isAddition = opKind == BinaryOperatorKind.Addition;
513BinaryOperatorKind kind,
526if (!leftValidOperand || !rightValidOperand || kind == BinaryOperatorKind.UnsignedRightShift)
540if (!IsValidDynamicCondition(left, isNegative: kind == BinaryOperatorKind.LogicalAnd, diagnostics, userDefinedOperator: out userDefinedOperator))
544Error(diagnostics, ErrorCode.ERR_InvalidDynamicCondition, node.Left, left.Type, kind == BinaryOperatorKind.LogicalAnd ? "false" : "true");
557operatorKind: (hasError ? kind : kind.WithType(BinaryOperatorKind.Dynamic)).WithOverflowChecksIfApplicable(CheckOverflowAtRuntime),
653BinaryOperatorKind kind = SyntaxKindToBinaryOperatorKind(node.Kind());
684bool isEquality = kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual;
687return new BoundLiteral(node, ConstantValue.Create(kind == BinaryOperatorKind.Equal), GetSpecialType(SpecialType.System_Boolean, diagnostics, node));
691(kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual))
698&& kind == BinaryOperatorKind.Addition
703var stringConstant = FoldBinaryOperator(node, BinaryOperatorKind.StringConcatenation, left, right, right.Type, diagnostics);
704return new BoundBinaryOperator(node, BinaryOperatorKind.StringConcatenation, BoundBinaryOperator.UncommonData.UnconvertedInterpolatedStringAddition(stringConstant), LookupResultKind.Empty, left, right, right.Type);
729BinaryOperatorKind resultOperatorKind = signature.Kind;
734resultOperatorKind &= ~BinaryOperatorKind.TypeMask;
750if ((resultOperatorKind & BinaryOperatorKind.Pointer) == BinaryOperatorKind.Pointer &&
772isUnsignedRightShift: resultOperatorKind.Operator() == BinaryOperatorKind.UnsignedRightShift, signature.ConstrainedToTypeOpt, diagnostics);
780if (foundOperator && (resultOperatorKind.OperandTypes() != BinaryOperatorKind.NullableNull))
787resultOperatorKind is BinaryOperatorKind.ObjectEqual or BinaryOperatorKind.ObjectNotEqual &&
843private bool BindSimpleBinaryOperatorParts(BinaryExpressionSyntax node, BindingDiagnosticBag diagnostics, BoundExpression left, BoundExpression right, BinaryOperatorKind kind,
866bool isObjectEquality = signature.Kind == BinaryOperatorKind.ObjectEqual || signature.Kind == BinaryOperatorKind.ObjectNotEqual;
875(signature.Kind.Operator() == BinaryOperatorKind.Equal || signature.Kind.Operator() == BinaryOperatorKind.NotEqual) &&
881resultSignature = new BinaryOperatorSignature(kind | BinaryOperatorKind.NullableNull, leftType: null, rightType: null,
957private void ReportAssignmentOperatorError(AssignmentExpressionSyntax node, BinaryOperatorKind kind, BindingDiagnosticBag diagnostics, BoundExpression left, BoundExpression right, LookupResultKind resultKind)
1073BinaryOperatorKind kind = SyntaxKindToBinaryOperatorKind(node.Kind());
1075Debug.Assert(kind == BinaryOperatorKind.LogicalAnd || kind == BinaryOperatorKind.LogicalOr);
1084var constantValue = FoldBinaryOperator(node, kind | BinaryOperatorKind.Bool, left, right, left.Type, diagnostics);
1087return new BoundBinaryOperator(node, kind | BinaryOperatorKind.Bool, constantValue, methodOpt: null, constrainedToTypeOpt: null,
1145var resultKind = kind | signature.Kind.OperandTypes();
1148resultKind |= BinaryOperatorKind.Lifted;
1156CheckConstraintLanguageVersionAndRuntimeSupportForOperator(node, kind == BinaryOperatorKind.LogicalAnd ? falseOperator : trueOperator,
1160var trueFalseParameterType = (resultKind.Operator() == BinaryOperatorKind.And ? falseOperator : trueOperator).Parameters[0].Type;
1297Debug.Assert(signature.Kind.OperandTypes() == BinaryOperatorKind.UserDefined);
1486private TypeSymbol GetBinaryOperatorErrorType(BinaryOperatorKind kind, BindingDiagnosticBag diagnostics, CSharpSyntaxNode node)
1490case BinaryOperatorKind.Equal:
1491case BinaryOperatorKind.NotEqual:
1492case BinaryOperatorKind.GreaterThan:
1493case BinaryOperatorKind.LessThan:
1494case BinaryOperatorKind.GreaterThanOrEqual:
1495case BinaryOperatorKind.LessThanOrEqual:
1503BinaryOperatorKind kind,
1582private bool IsTypelessExpressionAllowedInBinaryOperator(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
1593bool isEquality = kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual;
1683private static object FoldDecimalBinaryOperators(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
1699case BinaryOperatorKind.DecimalAddition:
1701case BinaryOperatorKind.DecimalSubtraction:
1703case BinaryOperatorKind.DecimalMultiplication:
1705case BinaryOperatorKind.DecimalDivision:
1707case BinaryOperatorKind.DecimalRemainder:
1714private static object FoldNativeIntegerOverflowingBinaryOperator(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
1723case BinaryOperatorKind.NIntAddition:
1725case BinaryOperatorKind.NUIntAddition:
1727case BinaryOperatorKind.NIntSubtraction:
1729case BinaryOperatorKind.NUIntSubtraction:
1731case BinaryOperatorKind.NIntMultiplication:
1733case BinaryOperatorKind.NUIntMultiplication:
1735case BinaryOperatorKind.NIntDivision:
1737case BinaryOperatorKind.NIntRemainder:
1739case BinaryOperatorKind.NIntLeftShift:
1745case BinaryOperatorKind.NUIntLeftShift:
1757private static object FoldUncheckedIntegralBinaryOperator(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
1766case BinaryOperatorKind.IntAddition:
1768case BinaryOperatorKind.LongAddition:
1770case BinaryOperatorKind.UIntAddition:
1772case BinaryOperatorKind.ULongAddition:
1774case BinaryOperatorKind.IntSubtraction:
1776case BinaryOperatorKind.LongSubtraction:
1778case BinaryOperatorKind.UIntSubtraction:
1780case BinaryOperatorKind.ULongSubtraction:
1782case BinaryOperatorKind.IntMultiplication:
1784case BinaryOperatorKind.LongMultiplication:
1786case BinaryOperatorKind.UIntMultiplication:
1788case BinaryOperatorKind.ULongMultiplication:
1792case BinaryOperatorKind.IntDivision:
1800case BinaryOperatorKind.LongDivision:
1813private static object FoldCheckedIntegralBinaryOperator(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
1822case BinaryOperatorKind.IntAddition:
1824case BinaryOperatorKind.LongAddition:
1826case BinaryOperatorKind.UIntAddition:
1828case BinaryOperatorKind.ULongAddition:
1830case BinaryOperatorKind.IntSubtraction:
1832case BinaryOperatorKind.LongSubtraction:
1834case BinaryOperatorKind.UIntSubtraction:
1836case BinaryOperatorKind.ULongSubtraction:
1838case BinaryOperatorKind.IntMultiplication:
1840case BinaryOperatorKind.LongMultiplication:
1842case BinaryOperatorKind.UIntMultiplication:
1844case BinaryOperatorKind.ULongMultiplication:
1846case BinaryOperatorKind.IntDivision:
1848case BinaryOperatorKind.LongDivision:
1856internal static TypeSymbol GetEnumType(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
1860case BinaryOperatorKind.EnumAndUnderlyingAddition:
1861case BinaryOperatorKind.EnumAndUnderlyingSubtraction:
1862case BinaryOperatorKind.EnumAnd:
1863case BinaryOperatorKind.EnumOr:
1864case BinaryOperatorKind.EnumXor:
1865case BinaryOperatorKind.EnumEqual:
1866case BinaryOperatorKind.EnumGreaterThan:
1867case BinaryOperatorKind.EnumGreaterThanOrEqual:
1868case BinaryOperatorKind.EnumLessThan:
1869case BinaryOperatorKind.EnumLessThanOrEqual:
1870case BinaryOperatorKind.EnumNotEqual:
1871case BinaryOperatorKind.EnumSubtraction:
1873case BinaryOperatorKind.UnderlyingAndEnumAddition:
1874case BinaryOperatorKind.UnderlyingAndEnumSubtraction:
1905BinaryOperatorKind kind,
1939BinaryOperatorKind newKind = kind.Operator().WithType(newLeftOperand.Type!.SpecialType);
1943case BinaryOperatorKind.Addition:
1944case BinaryOperatorKind.Subtraction:
1945case BinaryOperatorKind.And:
1946case BinaryOperatorKind.Or:
1947case BinaryOperatorKind.Xor:
1951case BinaryOperatorKind.LessThan:
1952case BinaryOperatorKind.LessThanOrEqual:
1953case BinaryOperatorKind.GreaterThan:
1954case BinaryOperatorKind.GreaterThanOrEqual:
1955case BinaryOperatorKind.Equal:
1956case BinaryOperatorKind.NotEqual:
1968TypeSymbol resultType = kind == BinaryOperatorKind.EnumSubtraction ? underlyingType : enumType;
1980BinaryOperatorKind kind,
2135private static ConstantValue? TryFoldingNullableEquality(BinaryOperatorKind kind, BoundExpression left, BoundExpression right)
2139BinaryOperatorKind op = kind.Operator();
2140if (op == BinaryOperatorKind.Equal || op == BinaryOperatorKind.NotEqual)
2157return (leftIsNull == rightIsNull) == (op == BinaryOperatorKind.Equal) ? ConstantValue.True : ConstantValue.False;
2168private static object? FoldNeverOverflowBinaryOperators(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
2177case BinaryOperatorKind.ObjectEqual:
2181case BinaryOperatorKind.ObjectNotEqual:
2185case BinaryOperatorKind.DoubleAddition:
2187case BinaryOperatorKind.FloatAddition:
2189case BinaryOperatorKind.DoubleSubtraction:
2191case BinaryOperatorKind.FloatSubtraction:
2193case BinaryOperatorKind.DoubleMultiplication:
2195case BinaryOperatorKind.FloatMultiplication:
2197case BinaryOperatorKind.DoubleDivision:
2199case BinaryOperatorKind.FloatDivision:
2201case BinaryOperatorKind.DoubleRemainder:
2203case BinaryOperatorKind.FloatRemainder:
2205case BinaryOperatorKind.IntLeftShift:
2207case BinaryOperatorKind.LongLeftShift:
2209case BinaryOperatorKind.UIntLeftShift:
2211case BinaryOperatorKind.ULongLeftShift:
2213case BinaryOperatorKind.IntRightShift:
2214case BinaryOperatorKind.NIntRightShift:
2216case BinaryOperatorKind.IntUnsignedRightShift:
2218case BinaryOperatorKind.NIntUnsignedRightShift:
2220case BinaryOperatorKind.LongRightShift:
2222case BinaryOperatorKind.LongUnsignedRightShift:
2224case BinaryOperatorKind.UIntRightShift:
2225case BinaryOperatorKind.NUIntRightShift:
2226case BinaryOperatorKind.UIntUnsignedRightShift:
2227case BinaryOperatorKind.NUIntUnsignedRightShift:
2229case BinaryOperatorKind.ULongRightShift:
2230case BinaryOperatorKind.ULongUnsignedRightShift:
2232case BinaryOperatorKind.BoolAnd:
2234case BinaryOperatorKind.IntAnd:
2235case BinaryOperatorKind.NIntAnd:
2237case BinaryOperatorKind.LongAnd:
2239case BinaryOperatorKind.UIntAnd:
2240case BinaryOperatorKind.NUIntAnd:
2242case BinaryOperatorKind.ULongAnd:
2244case BinaryOperatorKind.BoolOr:
2246case BinaryOperatorKind.IntOr:
2247case BinaryOperatorKind.NIntOr:
2249case BinaryOperatorKind.LongOr:
2251case BinaryOperatorKind.UIntOr:
2252case BinaryOperatorKind.NUIntOr:
2254case BinaryOperatorKind.ULongOr:
2256case BinaryOperatorKind.BoolXor:
2258case BinaryOperatorKind.IntXor:
2259case BinaryOperatorKind.NIntXor:
2261case BinaryOperatorKind.LongXor:
2263case BinaryOperatorKind.UIntXor:
2264case BinaryOperatorKind.NUIntXor:
2266case BinaryOperatorKind.ULongXor:
2268case BinaryOperatorKind.LogicalBoolAnd:
2270case BinaryOperatorKind.LogicalBoolOr:
2272case BinaryOperatorKind.BoolEqual:
2274case BinaryOperatorKind.StringEqual:
2276case BinaryOperatorKind.DecimalEqual:
2278case BinaryOperatorKind.FloatEqual:
2280case BinaryOperatorKind.DoubleEqual:
2282case BinaryOperatorKind.IntEqual:
2283case BinaryOperatorKind.NIntEqual:
2285case BinaryOperatorKind.LongEqual:
2287case BinaryOperatorKind.UIntEqual:
2288case BinaryOperatorKind.NUIntEqual:
2290case BinaryOperatorKind.ULongEqual:
2292case BinaryOperatorKind.BoolNotEqual:
2294case BinaryOperatorKind.StringNotEqual:
2296case BinaryOperatorKind.DecimalNotEqual:
2298case BinaryOperatorKind.FloatNotEqual:
2300case BinaryOperatorKind.DoubleNotEqual:
2302case BinaryOperatorKind.IntNotEqual:
2303case BinaryOperatorKind.NIntNotEqual:
2305case BinaryOperatorKind.LongNotEqual:
2307case BinaryOperatorKind.UIntNotEqual:
2308case BinaryOperatorKind.NUIntNotEqual:
2310case BinaryOperatorKind.ULongNotEqual:
2312case BinaryOperatorKind.DecimalLessThan:
2314case BinaryOperatorKind.FloatLessThan:
2316case BinaryOperatorKind.DoubleLessThan:
2318case BinaryOperatorKind.IntLessThan:
2319case BinaryOperatorKind.NIntLessThan:
2321case BinaryOperatorKind.LongLessThan:
2323case BinaryOperatorKind.UIntLessThan:
2324case BinaryOperatorKind.NUIntLessThan:
2326case BinaryOperatorKind.ULongLessThan:
2328case BinaryOperatorKind.DecimalGreaterThan:
2330case BinaryOperatorKind.FloatGreaterThan:
2332case BinaryOperatorKind.DoubleGreaterThan:
2334case BinaryOperatorKind.IntGreaterThan:
2335case BinaryOperatorKind.NIntGreaterThan:
2337case BinaryOperatorKind.LongGreaterThan:
2339case BinaryOperatorKind.UIntGreaterThan:
2340case BinaryOperatorKind.NUIntGreaterThan:
2342case BinaryOperatorKind.ULongGreaterThan:
2344case BinaryOperatorKind.DecimalLessThanOrEqual:
2346case BinaryOperatorKind.FloatLessThanOrEqual:
2348case BinaryOperatorKind.DoubleLessThanOrEqual:
2350case BinaryOperatorKind.IntLessThanOrEqual:
2351case BinaryOperatorKind.NIntLessThanOrEqual:
2353case BinaryOperatorKind.LongLessThanOrEqual:
2355case BinaryOperatorKind.UIntLessThanOrEqual:
2356case BinaryOperatorKind.NUIntLessThanOrEqual:
2358case BinaryOperatorKind.ULongLessThanOrEqual:
2360case BinaryOperatorKind.DecimalGreaterThanOrEqual:
2362case BinaryOperatorKind.FloatGreaterThanOrEqual:
2364case BinaryOperatorKind.DoubleGreaterThanOrEqual:
2366case BinaryOperatorKind.IntGreaterThanOrEqual:
2367case BinaryOperatorKind.NIntGreaterThanOrEqual:
2369case BinaryOperatorKind.LongGreaterThanOrEqual:
2371case BinaryOperatorKind.UIntGreaterThanOrEqual:
2372case BinaryOperatorKind.NUIntGreaterThanOrEqual:
2374case BinaryOperatorKind.ULongGreaterThanOrEqual:
2376case BinaryOperatorKind.UIntDivision:
2377case BinaryOperatorKind.NUIntDivision:
2379case BinaryOperatorKind.ULongDivision:
2383case BinaryOperatorKind.IntRemainder:
2385case BinaryOperatorKind.LongRemainder:
2387case BinaryOperatorKind.UIntRemainder:
2388case BinaryOperatorKind.NUIntRemainder:
2390case BinaryOperatorKind.ULongRemainder:
2400private static ConstantValue? FoldStringConcatenation(BinaryOperatorKind kind, ConstantValue valueLeft, ConstantValue valueRight)
2405if (kind == BinaryOperatorKind.StringConcatenation)
2418public static BinaryOperatorKind SyntaxKindToBinaryOperatorKind(SyntaxKind kind)
2423case SyntaxKind.MultiplyExpression: return BinaryOperatorKind.Multiplication;
2425case SyntaxKind.DivideExpression: return BinaryOperatorKind.Division;
2427case SyntaxKind.ModuloExpression: return BinaryOperatorKind.Remainder;
2429case SyntaxKind.AddExpression: return BinaryOperatorKind.Addition;
2431case SyntaxKind.SubtractExpression: return BinaryOperatorKind.Subtraction;
2433case SyntaxKind.RightShiftExpression: return BinaryOperatorKind.RightShift;
2435case SyntaxKind.UnsignedRightShiftExpression: return BinaryOperatorKind.UnsignedRightShift;
2437case SyntaxKind.LeftShiftExpression: return BinaryOperatorKind.LeftShift;
2438case SyntaxKind.EqualsExpression: return BinaryOperatorKind.Equal;
2439case SyntaxKind.NotEqualsExpression: return BinaryOperatorKind.NotEqual;
2440case SyntaxKind.GreaterThanExpression: return BinaryOperatorKind.GreaterThan;
2441case SyntaxKind.LessThanExpression: return BinaryOperatorKind.LessThan;
2442case SyntaxKind.GreaterThanOrEqualExpression: return BinaryOperatorKind.GreaterThanOrEqual;
2443case SyntaxKind.LessThanOrEqualExpression: return BinaryOperatorKind.LessThanOrEqual;
2445case SyntaxKind.BitwiseAndExpression: return BinaryOperatorKind.And;
2447case SyntaxKind.BitwiseOrExpression: return BinaryOperatorKind.Or;
2449case SyntaxKind.ExclusiveOrExpression: return BinaryOperatorKind.Xor;
2450case SyntaxKind.LogicalAndExpression: return BinaryOperatorKind.LogicalAnd;
2451case SyntaxKind.LogicalOrExpression: return BinaryOperatorKind.LogicalOr;
3566private static bool IsDivisionByZero(BinaryOperatorKind kind, ConstantValue valueRight)
3572case BinaryOperatorKind.DecimalDivision:
3573case BinaryOperatorKind.DecimalRemainder:
3575case BinaryOperatorKind.IntDivision:
3576case BinaryOperatorKind.IntRemainder:
3577case BinaryOperatorKind.NIntDivision:
3578case BinaryOperatorKind.NIntRemainder:
3580case BinaryOperatorKind.LongDivision:
3581case BinaryOperatorKind.LongRemainder:
3583case BinaryOperatorKind.UIntDivision:
3584case BinaryOperatorKind.UIntRemainder:
3585case BinaryOperatorKind.NUIntDivision:
3586case BinaryOperatorKind.NUIntRemainder:
3588case BinaryOperatorKind.ULongDivision:
3589case BinaryOperatorKind.ULongRemainder:
4875private void CheckNativeIntegerFeatureAvailability(BinaryOperatorKind operatorKind, SyntaxNode syntax, BindingDiagnosticBag diagnostics)
4882switch (operatorKind & BinaryOperatorKind.TypeMask)
4884case BinaryOperatorKind.NInt:
4885case BinaryOperatorKind.NUInt:
Binder\Binder_Patterns.cs (32)
1635BinaryOperatorKind operation = tokenKindToBinaryOperatorKind(node.OperatorToken.Kind());
1636if (operation == BinaryOperatorKind.Equal)
1642BinaryOperatorKind opType = RelationalOperatorType(type.EnumUnderlyingTypeOrSelf());
1645case BinaryOperatorKind.Float:
1646case BinaryOperatorKind.Double:
1653case BinaryOperatorKind.String:
1654case BinaryOperatorKind.Bool:
1655case BinaryOperatorKind.Error:
1679static BinaryOperatorKind tokenKindToBinaryOperatorKind(SyntaxKind kind) => kind switch
1681SyntaxKind.LessThanEqualsToken => BinaryOperatorKind.LessThanOrEqual,
1682SyntaxKind.LessThanToken => BinaryOperatorKind.LessThan,
1683SyntaxKind.GreaterThanToken => BinaryOperatorKind.GreaterThan,
1684SyntaxKind.GreaterThanEqualsToken => BinaryOperatorKind.GreaterThanOrEqual,
1686_ => BinaryOperatorKind.Equal,
1695internal static BinaryOperatorKind RelationalOperatorType(TypeSymbol type) => type.SpecialType switch
1697SpecialType.System_Single => BinaryOperatorKind.Float,
1698SpecialType.System_Double => BinaryOperatorKind.Double,
1699SpecialType.System_Char => BinaryOperatorKind.Char,
1700SpecialType.System_SByte => BinaryOperatorKind.Int, // operands are converted to int
1701SpecialType.System_Byte => BinaryOperatorKind.Int, // operands are converted to int
1702SpecialType.System_UInt16 => BinaryOperatorKind.Int, // operands are converted to int
1703SpecialType.System_Int16 => BinaryOperatorKind.Int, // operands are converted to int
1704SpecialType.System_Int32 => BinaryOperatorKind.Int,
1705SpecialType.System_UInt32 => BinaryOperatorKind.UInt,
1706SpecialType.System_Int64 => BinaryOperatorKind.Long,
1707SpecialType.System_UInt64 => BinaryOperatorKind.ULong,
1708SpecialType.System_Decimal => BinaryOperatorKind.Decimal,
1709SpecialType.System_String => BinaryOperatorKind.String,
1710SpecialType.System_Boolean => BinaryOperatorKind.Bool,
1711SpecialType.System_IntPtr when type.IsNativeIntegerType => BinaryOperatorKind.NInt,
1712SpecialType.System_UIntPtr when type.IsNativeIntegerType => BinaryOperatorKind.NUInt,
1713_ => 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)
1141return resultForRelation(BinaryOperatorKind.Equal, t.Value);
1153resultForRelation(BinaryOperatorKind relation, ConstantValue value)
1353handleRelationWithValue(BinaryOperatorKind.Equal, v2.Value,
1358BinaryOperatorKind relation,
1493if (lengthValues.All(BinaryOperatorKind.Equal, lengthValue))
1499if (!_forLowering && lengthValues.Any(BinaryOperatorKind.Equal, lengthValue))
1755BinaryOperatorKind.LessThan => "<",
1756BinaryOperatorKind.LessThanOrEqual => "<=",
1757BinaryOperatorKind.GreaterThan => ">",
1758BinaryOperatorKind.GreaterThanOrEqual => ">=",
2225Debug.Assert(t.Relation == BinaryOperatorKind.GreaterThanOrEqual);
2240return knownResult(BinaryOperatorKind.Equal, t.Value, offset) ??
2252static Tests? knownResult(BinaryOperatorKind relation, ConstantValue constant, int offset)
2255var 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 (142)
20public void BinaryOperatorOverloadResolution(BinaryOperatorKind kind, bool isChecked, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
32internal void BinaryOperatorOverloadResolution_EasyOut(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, BinaryOperatorOverloadResolutionResult result)
43BinaryOperatorKind underlyingKind = kind & ~BinaryOperatorKind.Logical;
49BinaryOperatorKind kind,
209private bool GetUserDefinedBinaryOperatorsFromInterfaces(BinaryOperatorKind kind, bool isChecked,
305private void AddDelegateOperation(BinaryOperatorKind kind, TypeSymbol delegateType,
310case BinaryOperatorKind.Equal:
311case BinaryOperatorKind.NotEqual:
312operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Delegate, delegateType, delegateType, Compilation.GetSpecialType(SpecialType.System_Boolean)));
315case BinaryOperatorKind.Addition:
316case BinaryOperatorKind.Subtraction:
318operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Delegate, delegateType, delegateType, delegateType));
323private void GetDelegateOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right,
332case BinaryOperatorKind.Multiplication:
333case BinaryOperatorKind.Division:
334case BinaryOperatorKind.Remainder:
335case BinaryOperatorKind.RightShift:
336case BinaryOperatorKind.UnsignedRightShift:
337case BinaryOperatorKind.LeftShift:
338case BinaryOperatorKind.And:
339case BinaryOperatorKind.Or:
340case BinaryOperatorKind.Xor:
341case BinaryOperatorKind.GreaterThan:
342case BinaryOperatorKind.LessThan:
343case BinaryOperatorKind.GreaterThanOrEqual:
344case BinaryOperatorKind.LessThanOrEqual:
345case BinaryOperatorKind.LogicalAnd:
346case BinaryOperatorKind.LogicalOr:
349case BinaryOperatorKind.Addition:
350case BinaryOperatorKind.Subtraction:
351case BinaryOperatorKind.Equal:
352case BinaryOperatorKind.NotEqual:
378case BinaryOperatorKind.Equal:
379case BinaryOperatorKind.NotEqual:
441bool useIdentityConversion = kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual;
455if ((kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual)
464private void GetEnumOperation(BinaryOperatorKind kind, TypeSymbol enumType, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> operators)
483case BinaryOperatorKind.Addition:
484operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumAndUnderlyingAddition, enumType, underlying, enumType));
485operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UnderlyingAndEnumAddition, underlying, enumType, enumType));
486operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumAndUnderlyingAddition, nullableEnum, nullableUnderlying, nullableEnum));
487operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedUnderlyingAndEnumAddition, nullableUnderlying, nullableEnum, nullableEnum));
489case BinaryOperatorKind.Subtraction:
492operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumSubtraction, enumType, enumType, underlying));
493operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumAndUnderlyingSubtraction, enumType, underlying, enumType));
494operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumSubtraction, nullableEnum, nullableEnum, nullableUnderlying));
495operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumAndUnderlyingSubtraction, nullableEnum, nullableUnderlying, nullableEnum));
505operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumSubtraction, enumType, enumType, underlying)
507operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.EnumAndUnderlyingSubtraction, enumType, underlying, enumType)
509operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumSubtraction, nullableEnum, nullableEnum, nullableUnderlying)
511operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedEnumAndUnderlyingSubtraction, nullableEnum, nullableUnderlying, nullableEnum)
515operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UnderlyingAndEnumSubtraction, underlying, enumType, enumType)
517operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LiftedUnderlyingAndEnumSubtraction, nullableUnderlying, nullableEnum, nullableEnum)
521case BinaryOperatorKind.Equal:
522case BinaryOperatorKind.NotEqual:
523case BinaryOperatorKind.GreaterThan:
524case BinaryOperatorKind.LessThan:
525case BinaryOperatorKind.GreaterThanOrEqual:
526case BinaryOperatorKind.LessThanOrEqual:
528operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Enum, enumType, enumType, boolean));
529operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Lifted | BinaryOperatorKind.Enum, nullableEnum, nullableEnum, boolean));
531case BinaryOperatorKind.And:
532case BinaryOperatorKind.Or:
533case BinaryOperatorKind.Xor:
534operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Enum, enumType, enumType, enumType));
535operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Lifted | BinaryOperatorKind.Enum, nullableEnum, nullableEnum, nullableEnum));
541BinaryOperatorKind kind,
550case BinaryOperatorKind.Addition:
551operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndIntAddition, pointerType, Compilation.GetSpecialType(SpecialType.System_Int32), pointerType));
552operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndUIntAddition, pointerType, Compilation.GetSpecialType(SpecialType.System_UInt32), pointerType));
553operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndLongAddition, pointerType, Compilation.GetSpecialType(SpecialType.System_Int64), pointerType));
554operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndULongAddition, pointerType, Compilation.GetSpecialType(SpecialType.System_UInt64), pointerType));
555operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.IntAndPointerAddition, Compilation.GetSpecialType(SpecialType.System_Int32), pointerType, pointerType));
556operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UIntAndPointerAddition, Compilation.GetSpecialType(SpecialType.System_UInt32), pointerType, pointerType));
557operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.LongAndPointerAddition, Compilation.GetSpecialType(SpecialType.System_Int64), pointerType, pointerType));
558operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.ULongAndPointerAddition, Compilation.GetSpecialType(SpecialType.System_UInt64), pointerType, pointerType));
560case BinaryOperatorKind.Subtraction:
561operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndIntSubtraction, pointerType, Compilation.GetSpecialType(SpecialType.System_Int32), pointerType));
562operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndUIntSubtraction, pointerType, Compilation.GetSpecialType(SpecialType.System_UInt32), pointerType));
563operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndLongSubtraction, pointerType, Compilation.GetSpecialType(SpecialType.System_Int64), pointerType));
564operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerAndULongSubtraction, pointerType, Compilation.GetSpecialType(SpecialType.System_UInt64), pointerType));
565operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.PointerSubtraction, pointerType, pointerType, Compilation.GetSpecialType(SpecialType.System_Int64)));
571BinaryOperatorKind kind,
576case BinaryOperatorKind.Equal:
577case BinaryOperatorKind.NotEqual:
578case BinaryOperatorKind.GreaterThan:
579case BinaryOperatorKind.LessThan:
580case BinaryOperatorKind.GreaterThanOrEqual:
581case BinaryOperatorKind.LessThanOrEqual:
583operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Pointer, voidPointerType, voidPointerType, Compilation.GetSpecialType(SpecialType.System_Boolean)));
588private void GetEnumOperations(BinaryOperatorKind kind, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorSignature> results)
597case BinaryOperatorKind.Multiplication:
598case BinaryOperatorKind.Division:
599case BinaryOperatorKind.Remainder:
600case BinaryOperatorKind.RightShift:
601case BinaryOperatorKind.UnsignedRightShift:
602case BinaryOperatorKind.LeftShift:
603case BinaryOperatorKind.LogicalAnd:
604case BinaryOperatorKind.LogicalOr:
623case BinaryOperatorKind.And:
624case BinaryOperatorKind.Or:
625case BinaryOperatorKind.Xor:
632case BinaryOperatorKind.Addition:
639case BinaryOperatorKind.Subtraction:
646case BinaryOperatorKind.Equal:
647case BinaryOperatorKind.NotEqual:
648case BinaryOperatorKind.GreaterThan:
649case BinaryOperatorKind.LessThan:
650case BinaryOperatorKind.GreaterThanOrEqual:
651case BinaryOperatorKind.LessThanOrEqual:
674BinaryOperatorKind kind,
706private void GetAllBuiltInOperators(BinaryOperatorKind kind, bool isChecked, BoundExpression left, BoundExpression right, ArrayBuilder<BinaryOperatorAnalysisResult> results, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo)
712bool isEquality = kind == BinaryOperatorKind.Equal || kind == BinaryOperatorKind.NotEqual;
752if (kind.Operator() is BinaryOperatorKind.Addition &&
774return value is BoundUtf8String or BoundBinaryOperator { OperatorKind: BinaryOperatorKind.Utf8Addition };
783private void GetReferenceEquality(BinaryOperatorKind kind, ArrayBuilder<BinaryOperatorSignature> operators)
786operators.Add(new BinaryOperatorSignature(kind | BinaryOperatorKind.Object, @object, @object, Compilation.GetSpecialType(SpecialType.System_Boolean)));
852BinaryOperatorKind kind,
919BinaryOperatorKind kind,
959void getDeclaredOperators(TypeSymbol constrainedToTypeOpt, NamedTypeSymbol type, BinaryOperatorKind kind, string name, ArrayBuilder<BinaryOperatorSignature> operators)
976operators.Add(new BinaryOperatorSignature(BinaryOperatorKind.UserDefined | kind, leftOperandType, rightOperandType, resultType, op, constrainedToTypeOpt));
982void addLiftedOperators(TypeSymbol constrainedToTypeOpt, BinaryOperatorKind kind, ArrayBuilder<BinaryOperatorSignature> operators)
996BinaryOperatorKind.Lifted | BinaryOperatorKind.UserDefined | kind,
1002BinaryOperatorKind.Lifted | BinaryOperatorKind.UserDefined | kind,
1016private static LiftingResult UserDefinedBinaryOperatorCanBeLifted(TypeSymbol left, TypeSymbol right, TypeSymbol result, BinaryOperatorKind kind)
1041case BinaryOperatorKind.Equal:
1042case BinaryOperatorKind.NotEqual:
1046goto case BinaryOperatorKind.GreaterThan;
1047case BinaryOperatorKind.GreaterThan:
1048case BinaryOperatorKind.GreaterThanOrEqual:
1049case BinaryOperatorKind.LessThan:
1050case BinaryOperatorKind.LessThanOrEqual:
1372private static void AssertNotChecked(BinaryOperatorKind kind)
1374Debug.Assert((kind & ~BinaryOperatorKind.Checked) == kind, "Did not expect operator to be checked. Consider using .Operator() to mask.");
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)
1661public BoundBinaryOperator(SyntaxNode syntax, BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type, bool hasErrors = false)
1674public BinaryOperatorKind OperatorKind { get; }
1681public BoundBinaryOperator Update(BinaryOperatorKind operatorKind, BoundBinaryOperator.UncommonData? data, LookupResultKind resultKind, BoundExpression left, BoundExpression right, TypeSymbol type)
1695public BoundTupleBinaryOperator(SyntaxNode syntax, BoundExpression left, BoundExpression right, BinaryOperatorKind operatorKind, TupleBinaryOperatorInfo.Multiple operators, TypeSymbol type, bool hasErrors = false)
1713public BinaryOperatorKind OperatorKind { get; }
1719public BoundTupleBinaryOperator Update(BoundExpression left, BoundExpression right, BinaryOperatorKind operatorKind, TupleBinaryOperatorInfo.Multiple operators, TypeSymbol type)
1733public 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)
1755public BinaryOperatorKind OperatorKind { get; }
1768public 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)
5344public BoundDagRelationalTest(SyntaxNode syntax, BinaryOperatorKind operatorKind, ConstantValue value, BoundDagTemp input, bool hasErrors = false)
5355public BinaryOperatorKind OperatorKind { get; }
5361public BoundDagRelationalTest Update(BinaryOperatorKind operatorKind, ConstantValue value, BoundDagTemp input)
8527public BoundRelationalPattern(SyntaxNode syntax, BinaryOperatorKind relation, BoundExpression value, ConstantValue constantValue, TypeSymbol inputType, TypeSymbol narrowedType, bool hasErrors = false)
8545public BinaryOperatorKind Relation { get; }
8552public BoundRelationalPattern Update(BinaryOperatorKind relation, BoundExpression value, ConstantValue constantValue, TypeSymbol inputType, TypeSymbol narrowedType)
Lowering\LocalRewriter\LocalRewriter.DecisionDagRewriter.cs (6)
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) :
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)
810_factory.Binary(BinaryOperatorKind.Addition, indexTemp.Type, indexTemp, _factory.Literal(1)),
1014sideEffects.Add(new BoundAssignmentOperator(rewrittenSpreadOperand.Syntax, indexTemp, _factory.Binary(BinaryOperatorKind.Addition, indexTemp.Type, indexTemp, spreadLength), isRef: false, indexTemp.Type));
1146_factory.Binary(BinaryOperatorKind.Addition, indexTemp.Type, indexTemp, _factory.Literal(1)),
1318_factory.Binary(BinaryOperatorKind.Addition, sum.Type!, sum, value);
Lowering\LocalRewriter\LocalRewriter_FixedStatement.cs (5)
474BoundExpression notNullCheck = _factory.MakeNullCheck(factory.Syntax, factory.Local(localSymbol), BinaryOperatorKind.NotEqual);
487BoundExpression addition = factory.Binary(BinaryOperatorKind.PointerAndIntAddition, localType, factory.Local(localSymbol), helperCall);
528BoundExpression notNullCheck = _factory.MakeNullCheck(factory.Syntax, arrayTempInit, BinaryOperatorKind.NotEqual);
551BoundExpression lengthCheck = factory.Binary(BinaryOperatorKind.IntNotEqual, factory.SpecialType(SpecialType.System_Boolean), lengthCall, factory.Literal(0));
554BoundExpression 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)
660public BoundBinaryOperator Binary(BinaryOperatorKind kind, TypeSymbol type, BoundExpression left, BoundExpression right)
683return Binary(BinaryOperatorKind.LogicalBoolAnd, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
690return Binary(BinaryOperatorKind.LogicalBoolOr, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
695return Binary(BinaryOperatorKind.IntEqual, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
700return Binary(BinaryOperatorKind.ObjectEqual, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
711return Binary(BinaryOperatorKind.ObjectNotEqual, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
716return Binary(BinaryOperatorKind.IntNotEqual, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
721return Binary(BinaryOperatorKind.IntLessThan, SpecialType(Microsoft.CodeAnalysis.SpecialType.System_Boolean), left, right);
726return Binary(BinaryOperatorKind.IntGreaterThanOrEqual, SpecialType(CodeAnalysis.SpecialType.System_Boolean), left, right);
731return Binary(BinaryOperatorKind.IntSubtraction, SpecialType(CodeAnalysis.SpecialType.System_Int32), left, right);
736return Binary(BinaryOperatorKind.IntMultiplication, SpecialType(CodeAnalysis.SpecialType.System_Int32), left, right);
1777internal BoundExpression MakeNullCheck(SyntaxNode syntax, BoundExpression rewrittenExpr, BinaryOperatorKind operatorKind)
1779Debug.Assert((operatorKind == BinaryOperatorKind.Equal) || (operatorKind == BinaryOperatorKind.NotEqual) ||
1780(operatorKind == BinaryOperatorKind.NullableNullEqual) || (operatorKind == BinaryOperatorKind.NullableNullNotEqual));
1798case BinaryOperatorKind.Equal:
1800case BinaryOperatorKind.NotEqual:
1816operatorKind |= BinaryOperatorKind.NullableNull;
1819if (operatorKind == BinaryOperatorKind.NullableNullEqual || operatorKind == BinaryOperatorKind.NullableNullNotEqual)
1841BinaryOperatorKind kind,
1867return Literal(kind == BinaryOperatorKind.NullableNullEqual);
1882value: Literal(kind == BinaryOperatorKind.NullableNullNotEqual),
1898var whenNull = kind == BinaryOperatorKind.NullableNullEqual ? Literal(true) : null;
1904BoundExpression 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);