From 94e6e466f44a0dbbcb6182b32628d97a80109305 Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Tue, 10 Jan 2023 15:09:16 +0100 Subject: [PATCH] Last elseif can be exhaustive and no else branch is not needed --- src/Analyser/NodeScopeResolver.php | 2 +- .../Analyser/NodeScopeResolverTest.php | 1 + .../Analyser/data/always-true-elseif.php | 28 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/PHPStan/Analyser/data/always-true-elseif.php diff --git a/src/Analyser/NodeScopeResolver.php b/src/Analyser/NodeScopeResolver.php index 739fe702a1..172fce03d8 100644 --- a/src/Analyser/NodeScopeResolver.php +++ b/src/Analyser/NodeScopeResolver.php @@ -784,7 +784,7 @@ private function processStmtNode( } if ($stmt->else === null) { - if (!$ifAlwaysTrue) { + if (!$ifAlwaysTrue && !$lastElseIfConditionIsTrue) { $finalScope = $scope->mergeWith($finalScope); $alwaysTerminating = false; } diff --git a/tests/PHPStan/Analyser/NodeScopeResolverTest.php b/tests/PHPStan/Analyser/NodeScopeResolverTest.php index 34798c2deb..6fb2ec882e 100644 --- a/tests/PHPStan/Analyser/NodeScopeResolverTest.php +++ b/tests/PHPStan/Analyser/NodeScopeResolverTest.php @@ -1165,6 +1165,7 @@ public function dataFileAsserts(): iterable if (PHP_VERSION_ID >= 80000) { yield from $this->gatherAssertTypes(__DIR__ . '/data/pathinfo-php8.php'); } + yield from $this->gatherAssertTypes(__DIR__ . '/data/always-true-elseif.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/pathinfo.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/bug-8568.php'); yield from $this->gatherAssertTypes(__DIR__ . '/../Rules/DeadCode/data/bug-8620.php'); diff --git a/tests/PHPStan/Analyser/data/always-true-elseif.php b/tests/PHPStan/Analyser/data/always-true-elseif.php new file mode 100644 index 0000000000..66b0788bf6 --- /dev/null +++ b/tests/PHPStan/Analyser/data/always-true-elseif.php @@ -0,0 +1,28 @@ +