Skip to content

Commit 13841eb

Browse files
committed
infinite loop in never returning function is allowed
1 parent d1f76fc commit 13841eb

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

src/Rules/Comparison/WhileLoopAlwaysTrueConditionRule.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use PHPStan\Rules\Rule;
1414
use PHPStan\Rules\RuleErrorBuilder;
1515
use PHPStan\Type\Constant\ConstantBooleanType;
16+
use PHPStan\Type\NeverType;
1617

1718
/**
1819
* @implements Rule<BreaklessWhileLoopNode>
@@ -67,6 +68,12 @@ public function processNode(
6768
$originalNode = $node->getOriginalNode();
6869
$exprType = $this->helper->getBooleanType($scope, $originalNode->cond);
6970
if ($exprType->isTrue()->yes()) {
71+
$ref = $scope->getFunction() ?? $scope->getAnonymousFunctionReflection();
72+
73+
if ($ref !== null && $ref->getReturnType() instanceof NeverType) {
74+
return [];
75+
}
76+
7077
$addTip = function (RuleErrorBuilder $ruleErrorBuilder) use ($scope, $originalNode): RuleErrorBuilder {
7178
if (!$this->treatPhpDocTypesAsCertain) {
7279
return $ruleErrorBuilder;

tests/PHPStan/Rules/Comparison/WhileLoopAlwaysTrueConditionRuleTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use PHPStan\Rules\Rule;
66
use PHPStan\Testing\RuleTestCase;
7+
use PHPUnit\Framework\Attributes\RequiresPhp;
78

89
/**
910
* @extends RuleTestCase<WhileLoopAlwaysTrueConditionRule>
@@ -47,4 +48,10 @@ public function testRule(): void
4748
]);
4849
}
4950

51+
#[RequiresPhp('>= 8.1')]
52+
public function testRulePHP81(): void
53+
{
54+
$this->analyse([__DIR__ . '/data/while-loop-true-php81.php'], []);
55+
}
56+
5057
}

0 commit comments

Comments
 (0)