Skip to content

Commit 9695087

Browse files
committed
False positive "non-empty-array<int, int> might not be a list" when change existing list key
1 parent 7776279 commit 9695087

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

src/Analyser/NodeScopeResolver.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5697,11 +5697,20 @@ private function processAssignVar(
56975697
} else {
56985698
$varForSetOffsetValue = $var->var;
56995699
}
5700-
$assignedPropertyExpr = new SetOffsetValueTypeExpr(
5701-
$varForSetOffsetValue,
5702-
$var->dim,
5703-
$assignedPropertyExpr,
5704-
);
5700+
5701+
if ($scope->hasExpressionType($var)->yes()) {
5702+
$assignedPropertyExpr = new SetExistingOffsetValueTypeExpr(
5703+
$varForSetOffsetValue,
5704+
$var->dim,
5705+
$assignedPropertyExpr,
5706+
);
5707+
} else {
5708+
$assignedPropertyExpr = new SetOffsetValueTypeExpr(
5709+
$varForSetOffsetValue,
5710+
$var->dim,
5711+
$assignedPropertyExpr,
5712+
);
5713+
}
57055714
$dimFetchStack[] = $var;
57065715
$var = $var->var;
57075716
}

tests/PHPStan/Rules/Properties/TypesAssignedToPropertiesRuleTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,4 +935,11 @@ public function testBug11777(): void
935935
$this->analyse([__DIR__ . '/data/bug-11777.php'], []);
936936
}
937937

938+
public function testBug13035(): void
939+
{
940+
$this->checkExplicitMixed = true;
941+
$this->checkImplicitMixed = true;
942+
$this->analyse([__DIR__ . '/data/bug-13035.php'], []);
943+
}
944+
938945
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Bug13035;
4+
5+
use function PHPStan\debugScope;
6+
use function PHPStan\Testing\assertType;
7+
8+
class HelloWorld
9+
{
10+
/**
11+
* @var list<int>
12+
*/
13+
public array $list = [];
14+
15+
public function bug(int $offset): void
16+
{
17+
if (isset($this->list[$offset])) {
18+
$this->list[$offset] = 123;
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)