diff --git a/src/Type/Constant/ConstantArrayType.php b/src/Type/Constant/ConstantArrayType.php index 7d2d0c9bc1..88d120f7b1 100644 --- a/src/Type/Constant/ConstantArrayType.php +++ b/src/Type/Constant/ConstantArrayType.php @@ -303,7 +303,16 @@ public function acceptsWithReason(Type $type, bool $strictTypes): AcceptsResult return AcceptsResult::createFromBoolean(count($type->keyTypes) === 0); } - $result = AcceptsResult::createYes(); + if ($this->isList()->yes() && $type->isList()->no()) { + return AcceptsResult::createNo(); + } + + if ($this->isList()->yes() && $type->isList()->maybe()) { + $result = AcceptsResult::createMaybe(); + } else { + $result = AcceptsResult::createYes(); + } + foreach ($this->keyTypes as $i => $keyType) { $valueType = $this->valueTypes[$i]; $hasOffsetValueType = $type->hasOffsetValueType($keyType); diff --git a/tests/PHPStan/Rules/Comparison/ImpossibleCheckTypeFunctionCallRuleTest.php b/tests/PHPStan/Rules/Comparison/ImpossibleCheckTypeFunctionCallRuleTest.php index 16529f3a74..14f2482883 100644 --- a/tests/PHPStan/Rules/Comparison/ImpossibleCheckTypeFunctionCallRuleTest.php +++ b/tests/PHPStan/Rules/Comparison/ImpossibleCheckTypeFunctionCallRuleTest.php @@ -1017,7 +1017,7 @@ static function (array $i): array { unset($i[2]); } - return $i; + return array_values($i); }, self::getLooseComparisonAgainsEnumsIssues(), ); diff --git a/tests/PHPStan/Rules/Generators/YieldFromTypeRuleTest.php b/tests/PHPStan/Rules/Generators/YieldFromTypeRuleTest.php index 681d9abab1..23582b17ef 100644 --- a/tests/PHPStan/Rules/Generators/YieldFromTypeRuleTest.php +++ b/tests/PHPStan/Rules/Generators/YieldFromTypeRuleTest.php @@ -39,7 +39,6 @@ public function testRule(): void [ 'Generator expects value type array{DateTime, DateTime, stdClass, DateTimeImmutable}, array{0: DateTime, 1: DateTime, 2: stdClass, 4: DateTimeImmutable} given.', 74, - 'Array does not have offset 3.', ], [ 'Result of yield from (void) is used.', diff --git a/tests/PHPStan/Rules/Methods/CallStaticMethodsRuleTest.php b/tests/PHPStan/Rules/Methods/CallStaticMethodsRuleTest.php index 27718dc9c7..9bceb666a9 100644 --- a/tests/PHPStan/Rules/Methods/CallStaticMethodsRuleTest.php +++ b/tests/PHPStan/Rules/Methods/CallStaticMethodsRuleTest.php @@ -841,4 +841,15 @@ public function testClosureBind(): void ]); } + public function testBug11600(): void + { + $this->checkThisOnly = false; + $this->analyse([__DIR__ . '/data/bug-11600.php'], [ + [ + 'Parameter #1 $array of static method Bug10600\HelloWorld::sayHello() expects array{1, 2}, array{1: 2, 0: 1} given.', + 18, + ], + ]); + } + } diff --git a/tests/PHPStan/Rules/Methods/data/bug-11600.php b/tests/PHPStan/Rules/Methods/data/bug-11600.php new file mode 100644 index 0000000000..b398820a82 --- /dev/null +++ b/tests/PHPStan/Rules/Methods/data/bug-11600.php @@ -0,0 +1,18 @@ +<?php + +namespace Bug10600; + +class HelloWorld +{ + /** @param array{1, 2} $array */ + public static function sayHello(array $array): void + { + array_values($array)[0]; + } +} + +$a = [0 => 1, 1 => 2]; +$b = [1 => 2, 0 => 1]; + +HelloWorld::sayHello($a); +HelloWorld::sayHello($b);