@@ -1446,30 +1446,38 @@ private function callOperatorTypeSpecifyingExtensions(Expr\BinaryOp $expr, Type
14461446 */
14471447 private function resolveCommonMath (Expr \BinaryOp $ expr , Type $ leftType , Type $ rightType ): Type
14481448 {
1449+ $ types = TypeCombinator::union ($ leftType , $ rightType );
14491450 $ leftNumberType = $ leftType ->toNumber ();
14501451 $ rightNumberType = $ rightType ->toNumber ();
14511452
1452- if ($ rightNumberType instanceof IntegerRangeType || $ rightNumberType instanceof ConstantIntegerType || $ rightType instanceof UnionType) {
1453+ if (
1454+ !$ types instanceof MixedType
1455+ && (
1456+ $ rightNumberType instanceof IntegerRangeType
1457+ || $ rightNumberType instanceof ConstantIntegerType
1458+ || $ rightNumberType instanceof UnionType
1459+ )
1460+ ) {
14531461 if ($ leftNumberType instanceof IntegerRangeType || $ leftNumberType instanceof ConstantIntegerType) {
14541462 return $ this ->integerRangeMath (
14551463 $ leftNumberType ,
14561464 $ expr ,
14571465 $ rightNumberType ,
14581466 );
1459- } elseif ($ leftType instanceof UnionType) {
1467+ } elseif ($ leftNumberType instanceof UnionType) {
14601468 $ unionParts = [];
14611469
1462- foreach ($ leftType ->getTypes () as $ type ) {
1470+ foreach ($ leftNumberType ->getTypes () as $ type ) {
14631471 $ numberType = $ type ->toNumber ();
14641472 if ($ numberType instanceof IntegerRangeType || $ numberType instanceof ConstantIntegerType) {
14651473 $ unionParts [] = $ this ->integerRangeMath ($ numberType , $ expr , $ rightNumberType );
14661474 } else {
1467- $ unionParts [] = $ type ;
1475+ $ unionParts [] = $ numberType ;
14681476 }
14691477 }
14701478
14711479 $ union = TypeCombinator::union (...$ unionParts );
1472- if ($ leftType instanceof BenevolentUnionType) {
1480+ if ($ leftNumberType instanceof BenevolentUnionType) {
14731481 return TypeUtils::toBenevolentUnion ($ union )->toNumber ();
14741482 }
14751483
@@ -1482,7 +1490,6 @@ private function resolveCommonMath(Expr\BinaryOp $expr, Type $leftType, Type $ri
14821490 return $ specifiedTypes ;
14831491 }
14841492
1485- $ types = TypeCombinator::union ($ leftType , $ rightType );
14861493 if (
14871494 $ leftType ->isArray ()->yes ()
14881495 || $ rightType ->isArray ()->yes ()
0 commit comments