From 1e207f01ec347d33081d9d39b99e714b4037cbf9 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 20 Sep 2025 20:20:32 +0200 Subject: [PATCH 1/3] False positive "non-empty-array might not be a list" when change existing list key --- src/Analyser/NodeScopeResolver.php | 19 ++++++++++++----- .../TypesAssignedToPropertiesRuleTest.php | 7 +++++++ .../Rules/Properties/data/bug-13035.php | 21 +++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 tests/PHPStan/Rules/Properties/data/bug-13035.php diff --git a/src/Analyser/NodeScopeResolver.php b/src/Analyser/NodeScopeResolver.php index aedf59ea20..8d23976a32 100644 --- a/src/Analyser/NodeScopeResolver.php +++ b/src/Analyser/NodeScopeResolver.php @@ -5609,11 +5609,20 @@ private function processAssignVar( } else { $varForSetOffsetValue = $var->var; } - $assignedPropertyExpr = new SetOffsetValueTypeExpr( - $varForSetOffsetValue, - $var->dim, - $assignedPropertyExpr, - ); + + if ($scope->hasExpressionType($var)->yes()) { + $assignedPropertyExpr = new SetExistingOffsetValueTypeExpr( + $varForSetOffsetValue, + $var->dim, + $assignedPropertyExpr, + ); + } else { + $assignedPropertyExpr = new SetOffsetValueTypeExpr( + $varForSetOffsetValue, + $var->dim, + $assignedPropertyExpr, + ); + } $dimFetchStack[] = $var; $var = $var->var; } diff --git a/tests/PHPStan/Rules/Properties/TypesAssignedToPropertiesRuleTest.php b/tests/PHPStan/Rules/Properties/TypesAssignedToPropertiesRuleTest.php index 300a8a9858..4a12d0636a 100644 --- a/tests/PHPStan/Rules/Properties/TypesAssignedToPropertiesRuleTest.php +++ b/tests/PHPStan/Rules/Properties/TypesAssignedToPropertiesRuleTest.php @@ -935,4 +935,11 @@ public function testBug11777(): void $this->analyse([__DIR__ . '/data/bug-11777.php'], []); } + public function testBug13035(): void + { + $this->checkExplicitMixed = true; + $this->checkImplicitMixed = true; + $this->analyse([__DIR__ . '/data/bug-13035.php'], []); + } + } diff --git a/tests/PHPStan/Rules/Properties/data/bug-13035.php b/tests/PHPStan/Rules/Properties/data/bug-13035.php new file mode 100644 index 0000000000..ccf048e704 --- /dev/null +++ b/tests/PHPStan/Rules/Properties/data/bug-13035.php @@ -0,0 +1,21 @@ + + */ + public array $list = []; + + public function bug(int $offset): void + { + if (isset($this->list[$offset])) { + $this->list[$offset] = 123; + } + } +} From dc76ac697d83af50460be76f606d3749f78733e2 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 21 Sep 2025 08:08:20 +0200 Subject: [PATCH 2/3] Update NodeScopeResolver.php --- src/Analyser/NodeScopeResolver.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Analyser/NodeScopeResolver.php b/src/Analyser/NodeScopeResolver.php index 8d23976a32..10fa97456a 100644 --- a/src/Analyser/NodeScopeResolver.php +++ b/src/Analyser/NodeScopeResolver.php @@ -5610,7 +5610,10 @@ private function processAssignVar( $varForSetOffsetValue = $var->var; } - if ($scope->hasExpressionType($var)->yes()) { + if ( + $var === $originalVar + && $scope->hasExpressionType($var)->yes() + ) { $assignedPropertyExpr = new SetExistingOffsetValueTypeExpr( $varForSetOffsetValue, $var->dim, From 87343693c1486e2d0986fc792669dabbb104a298 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 21 Sep 2025 08:11:28 +0200 Subject: [PATCH 3/3] Update NodeScopeResolver.php --- src/Analyser/NodeScopeResolver.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Analyser/NodeScopeResolver.php b/src/Analyser/NodeScopeResolver.php index 10fa97456a..c952da2e95 100644 --- a/src/Analyser/NodeScopeResolver.php +++ b/src/Analyser/NodeScopeResolver.php @@ -5612,6 +5612,7 @@ private function processAssignVar( if ( $var === $originalVar + && $var->dim !== null && $scope->hasExpressionType($var)->yes() ) { $assignedPropertyExpr = new SetExistingOffsetValueTypeExpr(