Skip to content

Commit 1f421d4

Browse files
herndlmondrejmirtes
authored andcommitted
Retain list type via array_push() and array_unshift()
1 parent 92deb3f commit 1f421d4

File tree

5 files changed

+39
-3
lines changed

5 files changed

+39
-3
lines changed

src/Analyser/NodeScopeResolver.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -2928,7 +2928,7 @@ static function (?Type $offsetType, Type $valueType, bool $optional) use (&$arra
29282928
return;
29292929
}
29302930

2931-
$arrayType = new ArrayType($arrayType->getIterableKeyType(), $arrayType->getIterableValueType());
2931+
$arrayType = TypeCombinator::union($arrayType, new ConstantArrayType([], []));
29322932
},
29332933
);
29342934

tests/PHPStan/Analyser/data/array-push.php

+7-1
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
* @param int[] $b
1313
* @param non-empty-array<int> $c
1414
* @param array<int|string> $d
15+
* @param list<string> $e
1516
*/
16-
function arrayPush(array $a, array $b, array $c, array $d, array $arr): void
17+
function arrayPush(array $a, array $b, array $c, array $d, array $e, array $arr): void
1718
{
1819
array_push($a, ...$b);
1920
assertType('array<int|string>', $a);
@@ -32,6 +33,11 @@ function arrayPush(array $a, array $b, array $c, array $d, array $arr): void
3233
$d1 = [];
3334
array_push($d, ...$d1);
3435
assertType('array<bool|int|string|null>', $d);
36+
37+
/** @var list<bool> $e1 */
38+
$e1 = [];
39+
array_push($e, ...$e1);
40+
assertType('list<bool|string>', $e);
3541
}
3642

3743
function arrayPushConstantArray(): void

tests/PHPStan/Analyser/data/array-unshift.php

+7-1
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
* @param int[] $b
1313
* @param non-empty-array<int> $c
1414
* @param array<int|string> $d
15+
* @param list<string> $e
1516
*/
16-
function arrayUnshift(array $a, array $b, array $c, array $d, array $arr): void
17+
function arrayUnshift(array $a, array $b, array $c, array $d, array $e, array $arr): void
1718
{
1819
array_unshift($a, ...$b);
1920
assertType('array<int|string>', $a);
@@ -32,6 +33,11 @@ function arrayUnshift(array $a, array $b, array $c, array $d, array $arr): void
3233
$d1 = [];
3334
array_unshift($d, ...$d1);
3435
assertType('array<bool|int|string|null>', $d);
36+
37+
/** @var list<bool> $e1 */
38+
$e1 = [];
39+
array_unshift($e, ...$e1);
40+
assertType('list<bool|string>', $e);
3541
}
3642

3743
function arrayUnshiftConstantArray(): void

tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php

+5
Original file line numberDiff line numberDiff line change
@@ -1252,6 +1252,11 @@ public function testBug8389(): void
12521252
$this->analyse([__DIR__ . '/data/bug-8389.php'], []);
12531253
}
12541254

1255+
public function testBug8449(): void
1256+
{
1257+
$this->analyse([__DIR__ . '/data/bug-8449.php'], []);
1258+
}
1259+
12551260
public function testBug5288(): void
12561261
{
12571262
$this->analyse([__DIR__ . '/data/bug-5288.php'], []);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Bug8449;
4+
5+
/** @var list<int> $a */
6+
$a = [1];
7+
/** @var list<int> $b */
8+
$b = [2];
9+
10+
array_push($a, ...$b);
11+
12+
/**
13+
* @param list<int> $parameter
14+
*/
15+
function test(array $parameter): void
16+
{
17+
}
18+
19+
test($a);

0 commit comments

Comments
 (0)