From c4ba43462cecb03ef57805ffd683f77d57b79a4a Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Mon, 7 Oct 2024 17:57:03 +0200 Subject: [PATCH] Fix nextAutoIndexes in array coming from ArrayCombineFunctionReturnTypeExtension --- .github/workflows/e2e-tests.yml | 3 +++ e2e/bug-11819/phpstan.neon | 4 ++++ e2e/bug-11819/test.php | 11 +++++++++++ .../Php/ArrayCombineFunctionReturnTypeExtension.php | 13 ++++++++----- tests/PHPStan/Analyser/nsrt/array-combine-php8.php | 8 ++++++++ 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 e2e/bug-11819/phpstan.neon create mode 100644 e2e/bug-11819/test.php diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index c9357fa047c..51891fb45ca 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -308,6 +308,9 @@ jobs: cd e2e/discussion-11362 composer install ../../bin/phpstan + - script: | + cd e2e/bug-11819 + ../../bin/phpstan steps: - name: "Checkout" diff --git a/e2e/bug-11819/phpstan.neon b/e2e/bug-11819/phpstan.neon new file mode 100644 index 00000000000..5fbd64483ab --- /dev/null +++ b/e2e/bug-11819/phpstan.neon @@ -0,0 +1,4 @@ +parameters: + level: 5 + paths: + - test.php diff --git a/e2e/bug-11819/test.php b/e2e/bug-11819/test.php new file mode 100644 index 00000000000..267e1647ad2 --- /dev/null +++ b/e2e/bug-11819/test.php @@ -0,0 +1,11 @@ +sanitizeConstantArrayKeyTypes($keyTypes); if ($keyTypes !== null) { - return new ConstantArrayType( - $keyTypes, - $valueTypes, - $keysParamType->getNextAutoIndexes(), - ); + $builder = ConstantArrayTypeBuilder::createEmpty(); + foreach ($keyTypes as $i => $keyType) { + $valueType = $valueTypes[$i]; + $builder->setOffsetValueType($keyType, $valueType); + } + + return $builder->getArray(); } } diff --git a/tests/PHPStan/Analyser/nsrt/array-combine-php8.php b/tests/PHPStan/Analyser/nsrt/array-combine-php8.php index 073fb23770d..1e02759b5e3 100644 --- a/tests/PHPStan/Analyser/nsrt/array-combine-php8.php +++ b/tests/PHPStan/Analyser/nsrt/array-combine-php8.php @@ -83,3 +83,11 @@ function withDifferentNumberOfElements(): void { assertType('*NEVER*', array_combine(['foo'], ['bar', 'baz'])); } + +function bug11819(): void +{ + $keys = [1, 2, 3]; + $types = array_combine($keys, array_fill(0, \count($keys), false)); + $types[] = 'foo'; + assertType('array{1: false, 2: false, 3: false, 4: \'foo\'}', $types); +}