From c671c26b7ae85ec0a2e9176a32ff3bc0c1a3099a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Mon, 23 Sep 2024 09:23:33 +0200 Subject: [PATCH] Drop wrong float comparison for filter_var() --- src/Type/Php/FilterFunctionReturnTypeHelper.php | 3 +-- tests/PHPStan/Analyser/nsrt/filter-var.php | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Type/Php/FilterFunctionReturnTypeHelper.php b/src/Type/Php/FilterFunctionReturnTypeHelper.php index 7ae801bfd9..17ba5ade7b 100644 --- a/src/Type/Php/FilterFunctionReturnTypeHelper.php +++ b/src/Type/Php/FilterFunctionReturnTypeHelper.php @@ -32,7 +32,6 @@ use function octdec; use function preg_match; use function sprintf; -use const PHP_FLOAT_EPSILON; final class FilterFunctionReturnTypeHelper { @@ -293,7 +292,7 @@ private function determineExactType(Type $in, int $filterValue, Type $defaultTyp } if ($in instanceof ConstantFloatType) { - return $in->getValue() - (int) $in->getValue() <= PHP_FLOAT_EPSILON + return $in->getValue() - (int) $in->getValue() === 0.0 ? $in->toInteger() : $defaultType; } diff --git a/tests/PHPStan/Analyser/nsrt/filter-var.php b/tests/PHPStan/Analyser/nsrt/filter-var.php index 12f97e63b5..0d43930de3 100644 --- a/tests/PHPStan/Analyser/nsrt/filter-var.php +++ b/tests/PHPStan/Analyser/nsrt/filter-var.php @@ -106,12 +106,14 @@ public function scalars(bool $bool, float $float, int $int, string $string, int assertType('bool|null', filter_var($float, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); assertType('bool|null', filter_var(17.0, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null assertType('bool|null', filter_var(17.1, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null + assertType('bool|null', filter_var(1e-50, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null assertType('bool|null', filter_var($int, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); assertType('bool|null', filter_var($intRange, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); assertType('bool|null', filter_var(17, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null assertType('bool|null', filter_var($string, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); assertType('bool|null', filter_var($nonEmptyString, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); assertType('bool|null', filter_var('17', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null + assertType('bool|null', filter_var('17.0', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null assertType('bool|null', filter_var('17.1', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); // could be null assertType('null', filter_var(null, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); @@ -121,12 +123,14 @@ public function scalars(bool $bool, float $float, int $int, string $string, int assertType('float', filter_var($float, FILTER_VALIDATE_FLOAT)); assertType('17.0', filter_var(17.0, FILTER_VALIDATE_FLOAT)); assertType('17.1', filter_var(17.1, FILTER_VALIDATE_FLOAT)); + assertType('1.0E-50', filter_var(1e-50, FILTER_VALIDATE_FLOAT)); assertType('float', filter_var($int, FILTER_VALIDATE_FLOAT)); assertType('float', filter_var($intRange, FILTER_VALIDATE_FLOAT)); assertType('17.0', filter_var(17, FILTER_VALIDATE_FLOAT)); assertType('float|false', filter_var($string, FILTER_VALIDATE_FLOAT)); assertType('float|false', filter_var($nonEmptyString, FILTER_VALIDATE_FLOAT)); assertType('float|false', filter_var('17', FILTER_VALIDATE_FLOAT)); // could be 17.0 + assertType('float|false', filter_var('17.0', FILTER_VALIDATE_FLOAT)); // could be 17.0 assertType('float|false', filter_var('17.1', FILTER_VALIDATE_FLOAT)); // could be 17.1 assertType('false', filter_var(null, FILTER_VALIDATE_FLOAT)); @@ -136,12 +140,14 @@ public function scalars(bool $bool, float $float, int $int, string $string, int assertType('int|false', filter_var($float, FILTER_VALIDATE_INT)); assertType('17', filter_var(17.0, FILTER_VALIDATE_INT)); assertType('false', filter_var(17.1, FILTER_VALIDATE_INT)); + assertType('false', filter_var(1e-50, FILTER_VALIDATE_INT)); assertType('int', filter_var($int, FILTER_VALIDATE_INT)); assertType('int<0, 9>', filter_var($intRange, FILTER_VALIDATE_INT)); assertType('17', filter_var(17, FILTER_VALIDATE_INT)); assertType('int|false', filter_var($string, FILTER_VALIDATE_INT)); assertType('int|false', filter_var($nonEmptyString, FILTER_VALIDATE_INT)); assertType('17', filter_var('17', FILTER_VALIDATE_INT)); + assertType('false', filter_var('17.0', FILTER_VALIDATE_INT)); assertType('false', filter_var('17.1', FILTER_VALIDATE_INT)); assertType('false', filter_var(null, FILTER_VALIDATE_INT)); @@ -151,12 +157,14 @@ public function scalars(bool $bool, float $float, int $int, string $string, int assertType('numeric-string', filter_var($float)); assertType("'17'", filter_var(17.0)); assertType("'17.1'", filter_var(17.1)); + assertType("'1.0E-50'", filter_var(1e-50)); assertType('numeric-string', filter_var($int)); assertType('numeric-string', filter_var($intRange)); assertType("'17'", filter_var(17)); assertType('string', filter_var($string)); assertType('non-empty-string', filter_var($nonEmptyString)); assertType("'17'", filter_var('17')); + assertType("'17.0'", filter_var('17.0')); assertType("'17.1'", filter_var('17.1')); assertType("''", filter_var(null)); }