diff --git a/src/Type/ArrayType.php b/src/Type/ArrayType.php index a951f13c24..2533267f6e 100644 --- a/src/Type/ArrayType.php +++ b/src/Type/ArrayType.php @@ -478,6 +478,12 @@ public function unsetOffset(Type $offsetType): Type public function fillKeysArray(Type $valueType): Type { $itemType = $this->getItemType(); + $arrayKeyType = $itemType->toArrayKey(); + + if ($arrayKeyType->isInteger()->yes()) { + return new ArrayType($arrayKeyType, $valueType); + } + if ($itemType->isInteger()->no()) { $stringKeyType = $itemType->toString(); if ($stringKeyType instanceof ErrorType) { diff --git a/tests/PHPStan/Analyser/nsrt/array-fill-keys.php b/tests/PHPStan/Analyser/nsrt/array-fill-keys.php index 231b2dcbe5..eab3ab5da2 100644 --- a/tests/PHPStan/Analyser/nsrt/array-fill-keys.php +++ b/tests/PHPStan/Analyser/nsrt/array-fill-keys.php @@ -85,16 +85,20 @@ function withOptionalKeys(): void * @param array $mixed * @param list $list * @param Baz[] $objectsWithoutToString + * @param array $decimalIntStringOrInt + * @param array $decimalIntString */ -function withNotConstantArray(array $foo, array $bar, array $baz, array $floats, array $mixed, array $list, array $objectsWithoutToString): void +function withNotConstantArray(array $foo, array $bar, array $baz, array $floats, array $mixed, array $list, array $objectsWithoutToString, array $decimalIntStringOrInt, array $decimalIntString): void { assertType("array", array_fill_keys($foo, null)); assertType("array", array_fill_keys($bar, null)); assertType("array<'foo', null>", array_fill_keys($baz, null)); - assertType("array", array_fill_keys($floats, null)); + assertType("array", array_fill_keys($floats, null)); assertType("array", array_fill_keys($mixed, null)); assertType('array', array_fill_keys($list, null)); assertType('*ERROR*', array_fill_keys($objectsWithoutToString, null)); + assertType('array', array_fill_keys($decimalIntStringOrInt, null)); + assertType('array', array_fill_keys($decimalIntString, null)); if (array_key_exists(17, $mixed)) { assertType('non-empty-array', array_fill_keys($mixed, null));