Skip to content

Commit d365eff

Browse files
authored
Fixed integer range minus bugs
1 parent 3225717 commit d365eff

File tree

3 files changed

+25
-11
lines changed

3 files changed

+25
-11
lines changed

src/Analyser/MutatingScope.php

+13-2
Original file line numberDiff line numberDiff line change
@@ -5241,7 +5241,11 @@ private function integerRangeMath(Type $range, Expr $node, Type $operand): Type
52415241
if ($operand->getMin() === null) {
52425242
$min = null;
52435243
} elseif ($rangeMin !== null) {
5244-
$min = $rangeMin - $operand->getMin();
5244+
if ($operand->getMax() !== null) {
5245+
$min = $rangeMin - $operand->getMax();
5246+
} else {
5247+
$min = $rangeMin - $operand->getMin();
5248+
}
52455249
} else {
52465250
$min = null;
52475251
}
@@ -5250,7 +5254,14 @@ private function integerRangeMath(Type $range, Expr $node, Type $operand): Type
52505254
$min = null;
52515255
$max = null;
52525256
} elseif ($rangeMax !== null) {
5253-
$max = $rangeMax - $operand->getMax();
5257+
if ($rangeMin !== null && $operand->getMin() === null) {
5258+
$min = $rangeMin - $operand->getMax();
5259+
$max = null;
5260+
} elseif ($operand->getMin() !== null) {
5261+
$max = $rangeMax - $operand->getMin();
5262+
} else {
5263+
$max = null;
5264+
}
52545265
} else {
52555266
$max = null;
52565267
}

tests/PHPStan/Analyser/data/integer-range-types.php

+8-5
Original file line numberDiff line numberDiff line change
@@ -202,13 +202,14 @@ public function supportsPhpdocIntegerRange() {
202202
* @param positive-int $pi
203203
* @param int<1, 10> $r1
204204
* @param int<5, 10> $r2
205+
* @param int<-9, 100> $r3
205206
* @param int<min, 5> $rMin
206207
* @param int<5, max> $rMax
207208
*
208209
* @param 20|40|60 $x
209210
* @param 2|4 $y
210211
*/
211-
public function math($i, $j, $z, $pi, $r1, $r2, $rMin, $rMax, $x, $y) {
212+
public function math($i, $j, $z, $pi, $r1, $r2, $r3, $rMin, $rMax, $x, $y) {
212213
assertType('int', $r1 + $i);
213214
assertType('int', $r1 - $i);
214215
assertType('int', $r1 * $i);
@@ -254,16 +255,18 @@ public function math($i, $j, $z, $pi, $r1, $r2, $rMin, $rMax, $x, $y) {
254255
assertType('float|int<1, max>', $rMax / 4);
255256

256257
assertType('int<6, 20>', $r1 + $r2);
257-
assertType('int<-4, 0>', $r1 - $r2);
258+
assertType('int<-9, 5>', $r1 - $r2);
258259
assertType('int<5, 100>', $r1 * $r2);
259260
assertType('float|int<0, 1>', $r1 / $r2);
260261

262+
assertType('int<-99, 19>', $r1 - $r3);
263+
261264
assertType('int<min, 15>', $r1 + $rMin);
262-
assertType('int<min, 5>', $r1 - $rMin);
265+
assertType('int<-4, max>', $r1 - $rMin);
263266
assertType('int<min, 50>', $r1 * $rMin);
264267
assertType('float|int<min, 2>', $r1 / $rMin);
265268
assertType('int<min, 15>', $rMin + $r1);
266-
assertType('int<min, -5>', $rMin - $r1);
269+
assertType('int<min, 4>', $rMin - $r1);
267270
assertType('int<min, 50>', $rMin * $r1);
268271
assertType('float|int<min, 0>', $rMin / $r1);
269272

@@ -272,7 +275,7 @@ public function math($i, $j, $z, $pi, $r1, $r2, $rMin, $rMax, $x, $y) {
272275
assertType('int<5, max>', $r1 * $rMax);
273276
assertType('float|int<0, max>', $r1 / $rMax);
274277
assertType('int<6, max>', $rMax + $r1);
275-
assertType('int<4, max>', $rMax - $r1);
278+
assertType('int<-5, max>', $rMax - $r1);
276279
assertType('int<5, max>', $rMax * $r1);
277280
assertType('float|int<5, max>', $rMax / $r1);
278281

tests/PHPStan/Analyser/data/math.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,19 @@ public function doBaz(int $rangeFiveBoth, int $rangeFiveLeft, int $rangeFiveRigh
5252
assertType('int', $rangeFiveRight - $rangeFiveLeft);
5353

5454
assertType('int<-10, 10>', $rangeFiveBoth + $rangeFiveBoth);
55-
assertType('0', $rangeFiveBoth - $rangeFiveBoth);
55+
assertType('int<-10, 10>', $rangeFiveBoth - $rangeFiveBoth);
5656

5757
assertType('int<-10, max>', $rangeFiveBoth + $rangeFiveLeft);
5858
assertType('int', $rangeFiveBoth - $rangeFiveLeft);
5959

6060
assertType('int<min, 10>', $rangeFiveBoth + $rangeFiveRight);
61-
assertType('int<min, 0>', $rangeFiveBoth - $rangeFiveRight);
61+
assertType('int<-10, max>', $rangeFiveBoth - $rangeFiveRight);
6262

6363
assertType('int<-10, max>', $rangeFiveLeft + $rangeFiveBoth);
64-
assertType('int<0, max>', $rangeFiveLeft - $rangeFiveBoth);
64+
assertType('int<-10, max>', $rangeFiveLeft - $rangeFiveBoth);
6565

6666
assertType('int<min, 10>', $rangeFiveRight + $rangeFiveBoth);
67-
assertType('int<min, 0>', $rangeFiveRight - $rangeFiveBoth);
67+
assertType('int<min, 10>', $rangeFiveRight - $rangeFiveBoth);
6868
}
6969

7070
public function doLorem($a, $b): void

0 commit comments

Comments
 (0)