Skip to content

Commit

Permalink
multiply by zero is always zero
Browse files Browse the repository at this point in the history
  • Loading branch information
staabm committed Feb 6, 2022
1 parent 39e5e0c commit 5087733
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/Analyser/MutatingScope.php
Expand Up @@ -1040,6 +1040,34 @@ private function resolveType(Expr $node): Type
return new StringType();
}

if (
$node instanceof Node\Expr\BinaryOp\Mul
|| $node instanceof Node\Expr\AssignOp\Mul
) {
if ($node instanceof Node\Expr\AssignOp) {
$leftType = $this->getType($node->var)->toNumber();
$rightType = $this->getType($node->expr)->toNumber();
} else {
$leftType = $this->getType($node->left)->toNumber();
$rightType = $this->getType($node->right)->toNumber();
}

$floatType = new FloatType();

if ($leftType instanceof ConstantIntegerType && $leftType->getValue() === 0) {
if ($floatType->isSuperTypeOf($rightType)->yes()) {
return new ConstantFloatType(0.0);
}
return new ConstantIntegerType(0);
}
if ($rightType instanceof ConstantIntegerType && $rightType->getValue() === 0) {
if ($floatType->isSuperTypeOf($leftType)->yes()) {
return new ConstantFloatType(0.0);
}
return new ConstantIntegerType(0);
}
}

if (
$node instanceof Node\Expr\BinaryOp\Div
|| $node instanceof Node\Expr\AssignOp\Div
Expand Down
30 changes: 30 additions & 0 deletions tests/PHPStan/Analyser/data/math.php
Expand Up @@ -109,4 +109,34 @@ public function doSit(int $i, int $j): void
assertType('int', $i - $j);
}

/**
* @param int<-5, 5> $range
*/
public function multiplyZero(int $i, float $f, $range): void
{
assertType('0', $i * false);
assertType('0.0', $f * false);
assertType('0', $range * false);

assertType('0', $i * '0');
assertType('0.0', $f * '0');
assertType('0', $range * '0');

assertType('0', $i * 0);
assertType('0.0', $f * 0);
assertType('0', $range * 0);

assertType('0', 0 * $i);
assertType('0.0', 0 * $f);
assertType('0', 0 * $range);

$i *= 0;
$f *= 0;
$range *= 0;
assertType('0', $i);
assertType('0.0', $f);
assertType('0', $range);

}

}

0 comments on commit 5087733

Please sign in to comment.