Skip to content

Commit 4e311c4

Browse files
authored
Merge branch refs/heads/1.9.x into 1.10.x
2 parents c02f76e + 5bd68ef commit 4e311c4

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

src/Type/Php/FilterFunctionReturnTypeHelper.php

+8-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PHPStan\Type\ArrayType;
1212
use PHPStan\Type\BooleanType;
1313
use PHPStan\Type\Constant\ConstantBooleanType;
14+
use PHPStan\Type\Constant\ConstantFloatType;
1415
use PHPStan\Type\Constant\ConstantIntegerType;
1516
use PHPStan\Type\Constant\ConstantStringType;
1617
use PHPStan\Type\ConstantScalarType;
@@ -28,6 +29,7 @@
2829
use function octdec;
2930
use function preg_match;
3031
use function sprintf;
32+
use const PHP_FLOAT_EPSILON;
3133

3234
final class FilterFunctionReturnTypeHelper
3335
{
@@ -196,14 +198,16 @@ private function determineExactType(Type $in, int $filterValue, Type $defaultTyp
196198
}
197199

198200
if ($filterValue === $this->getConstant('FILTER_VALIDATE_INT')) {
199-
if ($in->isFloat()->yes()) {
200-
return $in->toInteger();
201-
}
202-
203201
if ($in->isInteger()->yes()) {
204202
return $in;
205203
}
206204

205+
if ($in instanceof ConstantFloatType) {
206+
return $in->getValue() - (int) $in->getValue() <= PHP_FLOAT_EPSILON
207+
? $in->toInteger()
208+
: $defaultType;
209+
}
210+
207211
if ($in instanceof ConstantStringType) {
208212
$value = $in->getValue();
209213
$allowOctal = $this->hasFlag($this->getConstant('FILTER_FLAG_ALLOW_OCTAL'), $flagsType);

tests/PHPStan/Analyser/data/filter-var.php

+9-1
Original file line numberDiff line numberDiff line change
@@ -47,51 +47,59 @@ public function scalars(bool $bool, float $float, int $int, string $string, int
4747
assertType('false', filter_var(false, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));
4848
assertType('bool|null', filter_var($float, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));
4949
assertType('bool|null', filter_var(17.0, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null
50+
assertType('bool|null', filter_var(17.1, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null
5051
assertType('bool|null', filter_var($int, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));
5152
assertType('bool|null', filter_var($intRange, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));
5253
assertType('bool|null', filter_var(17, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null
5354
assertType('bool|null', filter_var($string, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));
5455
assertType('bool|null', filter_var($nonEmptyString, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE));
5556
assertType('bool|null', filter_var('17', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null
57+
assertType('bool|null', filter_var('17.1', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null
5658
assertType('bool|null', filter_var(null, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null
5759

5860
assertType('float|false', filter_var($bool, FILTER_VALIDATE_FLOAT));
5961
assertType('float|false', filter_var(true, FILTER_VALIDATE_FLOAT)); // could be 1
6062
assertType('float|false', filter_var(false, FILTER_VALIDATE_FLOAT)); // could be false
6163
assertType('float', filter_var($float, FILTER_VALIDATE_FLOAT));
6264
assertType('17.0', filter_var(17.0, FILTER_VALIDATE_FLOAT));
65+
assertType('17.1', filter_var(17.1, FILTER_VALIDATE_FLOAT));
6366
assertType('float', filter_var($int, FILTER_VALIDATE_FLOAT));
6467
assertType('float', filter_var($intRange, FILTER_VALIDATE_FLOAT));
6568
assertType('17.0', filter_var(17, FILTER_VALIDATE_FLOAT));
6669
assertType('float|false', filter_var($string, FILTER_VALIDATE_FLOAT));
6770
assertType('float|false', filter_var($nonEmptyString, FILTER_VALIDATE_FLOAT));
6871
assertType('float|false', filter_var('17', FILTER_VALIDATE_FLOAT)); // could be 17.0
72+
assertType('float|false', filter_var('17.1', FILTER_VALIDATE_FLOAT)); // could be 17.1
6973
assertType('float|false', filter_var(null, FILTER_VALIDATE_FLOAT)); // could be false
7074

7175
assertType('int|false', filter_var($bool, FILTER_VALIDATE_INT));
7276
assertType('int|false', filter_var(true, FILTER_VALIDATE_INT)); // could be 1
7377
assertType('int|false', filter_var(false, FILTER_VALIDATE_INT)); // could be false
74-
assertType('int', filter_var($float, FILTER_VALIDATE_INT));
78+
assertType('int|false', filter_var($float, FILTER_VALIDATE_INT));
7579
assertType('17', filter_var(17.0, FILTER_VALIDATE_INT));
80+
assertType('false', filter_var(17.1, FILTER_VALIDATE_INT));
7681
assertType('int', filter_var($int, FILTER_VALIDATE_INT));
7782
assertType('int<0, 9>', filter_var($intRange, FILTER_VALIDATE_INT));
7883
assertType('17', filter_var(17, FILTER_VALIDATE_INT));
7984
assertType('int|false', filter_var($string, FILTER_VALIDATE_INT));
8085
assertType('int|false', filter_var($nonEmptyString, FILTER_VALIDATE_INT));
8186
assertType('17', filter_var('17', FILTER_VALIDATE_INT));
87+
assertType('false', filter_var('17.1', FILTER_VALIDATE_INT));
8288
assertType('int|false', filter_var(null, FILTER_VALIDATE_INT)); // could be false
8389

8490
assertType("''|'1'", filter_var($bool));
8591
assertType("'1'", filter_var(true));
8692
assertType("''", filter_var(false));
8793
assertType('numeric-string', filter_var($float));
8894
assertType("'17'", filter_var(17.0));
95+
assertType("'17.1'", filter_var(17.1));
8996
assertType('numeric-string', filter_var($int));
9097
assertType('numeric-string', filter_var($intRange));
9198
assertType("'17'", filter_var(17));
9299
assertType('string', filter_var($string));
93100
assertType('non-empty-string', filter_var($nonEmptyString));
94101
assertType("'17'", filter_var('17'));
102+
assertType("'17.1'", filter_var('17.1'));
95103
assertType("''", filter_var(null));
96104
}
97105

tests/PHPStan/Rules/Comparison/BooleanNotConstantConditionRuleTest.php

+6
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,10 @@ public function testBug5317(): void
142142
]);
143143
}
144144

145+
public function testBug8797(): void
146+
{
147+
$this->treatPhpDocTypesAsCertain = true;
148+
$this->analyse([__DIR__ . '/data/bug-8797.php'], []);
149+
}
150+
145151
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Bug8797;
4+
5+
final class TestClass
6+
{
7+
public function testMethod(float $float): void {
8+
$boolean = filter_var($float, FILTER_VALIDATE_INT) !== false;
9+
if (!$boolean) {
10+
return;
11+
}
12+
}
13+
}

0 commit comments

Comments
 (0)