diff --git a/src/Analyser/TypeSpecifier.php b/src/Analyser/TypeSpecifier.php index 397d9578fe..8965b6a7eb 100644 --- a/src/Analyser/TypeSpecifier.php +++ b/src/Analyser/TypeSpecifier.php @@ -316,7 +316,8 @@ public function specifyTypesInCondition( $argType = $scope->getType($expr->right->getArgs()[0]->value); if ($argType->isString()->yes()) { $accessory = new AccessoryNonEmptyStringType(); - if ($leftType instanceof ConstantIntegerType && $leftType->getValue() >= 2) { + + if (IntegerRangeType::createAllGreaterThanOrEqualTo(2 - $offset)->isSuperTypeOf($leftType)->yes()) { $accessory = new AccessoryNonFalsyStringType(); } diff --git a/tests/PHPStan/Analyser/nsrt/bug-10952b.php b/tests/PHPStan/Analyser/nsrt/bug-10952b.php index b02b89ac50..f8f70e07d0 100644 --- a/tests/PHPStan/Analyser/nsrt/bug-10952b.php +++ b/tests/PHPStan/Analyser/nsrt/bug-10952b.php @@ -16,13 +16,13 @@ public function test(): void $string = $this->getString(); if (1 < mb_strlen($string)) { - assertType('non-empty-string', $string); + assertType('non-falsy-string', $string); } else { assertType("string", $string); } if (mb_strlen($string) > 1) { - assertType('non-empty-string', $string); + assertType('non-falsy-string', $string); } else { assertType("string", $string); } diff --git a/tests/PHPStan/Analyser/nsrt/strlen-int-range.php b/tests/PHPStan/Analyser/nsrt/strlen-int-range.php new file mode 100644 index 0000000000..540b932531 --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/strlen-int-range.php @@ -0,0 +1,54 @@ += 7.2 + +namespace StrlenIntRange; + +use function PHPStan\Testing\assertType; + +/** + * @param int<0, 3> $zeroToThree + * @param int<2, 3> $twoOrThree + * @param int<2, max> $twoOrMore + * @param int $maxThree + * @param int<10, 11> $tenOrEleven + */ +function doFoo(string $s, $zeroToThree, $twoOrThree, $twoOrMore, int $maxThree, $tenOrEleven): void +{ + if (strlen($s) >= $zeroToThree) { + assertType('string', $s); + } + if (strlen($s) > $zeroToThree) { + assertType('non-empty-string', $s); + } + + if (strlen($s) >= $twoOrThree) { + assertType('non-falsy-string', $s); + } + if (strlen($s) > $twoOrThree) { + assertType('non-falsy-string', $s); + } + + if (strlen($s) > $twoOrMore) { + assertType('non-falsy-string', $s); + } + + $oneOrMore = $twoOrMore-1; + if (strlen($s) > $oneOrMore) { + assertType('non-falsy-string', $s); + } + if (strlen($s) >= $oneOrMore) { + assertType('non-empty-string', $s); + } + if (strlen($s) <= $oneOrMore) { + assertType('string', $s); + } else { + assertType('non-falsy-string', $s); + } + + if (strlen($s) > $maxThree) { + assertType('string', $s); + } + + if (strlen($s) > $tenOrEleven) { + assertType('non-falsy-string', $s); + } +}