diff --git a/bin/functionMetadata_original.php b/bin/functionMetadata_original.php index a57224a0bb..d429d11b59 100644 --- a/bin/functionMetadata_original.php +++ b/bin/functionMetadata_original.php @@ -170,6 +170,9 @@ 'DateTimeImmutable::getTimestamp' => ['hasSideEffects' => false], 'DateTimeImmutable::getTimezone' => ['hasSideEffects' => false], + 'SplDoublyLinkedList::pop' => ['hasSideEffects' => true], + 'SplDoublyLinkedList::shift' => ['hasSideEffects' => true], + 'SplFileObject::fflush' => ['hasSideEffects' => true], 'SplFileObject::fgetc' => ['hasSideEffects' => true], 'SplFileObject::fgetcsv' => ['hasSideEffects' => true], @@ -183,6 +186,24 @@ 'SplFileObject::ftruncate' => ['hasSideEffects' => true], 'SplFileObject::fwrite' => ['hasSideEffects' => true], + 'SplFixedArray::extract' => ['hasSideEffects' => true], + + 'SplHead::extract' => ['hasSideEffects' => true], + 'SplHead::insert' => ['hasSideEffects' => true], + 'SplHead::recoverFromCorruption' => ['hasSideEffects' => true], + + 'SplObjectStorage::addAll' => ['hasSideEffects' => true], + 'SplObjectStorage::attach' => ['hasSideEffects' => true], + 'SplObjectStorage::detach' => ['hasSideEffects' => true], + 'SplObjectStorage::removeAll' => ['hasSideEffects' => true], + 'SplObjectStorage::removeAllExcept' => ['hasSideEffects' => true], + + 'SplPriorityQueue::extract' => ['hasSideEffects' => true], + 'SplPriorityQueue::insert' => ['hasSideEffects' => true], + 'SplPriorityQueue::recoverFromCorruption' => ['hasSideEffects' => true], + + 'SplQueue::dequeue' => ['hasSideEffects' => true], + 'XmlReader::next' => ['hasSideEffects' => true], 'XmlReader::read' => ['hasSideEffects' => true], ]; diff --git a/resources/functionMetadata.php b/resources/functionMetadata.php index fd7076124f..97f858cc49 100644 --- a/resources/functionMetadata.php +++ b/resources/functionMetadata.php @@ -639,6 +639,8 @@ 'SimpleXMLIterator::hasChildren' => ['hasSideEffects' => false], 'SimpleXMLIterator::valid' => ['hasSideEffects' => false], 'SoapFault::__construct' => ['hasSideEffects' => false], + 'SplDoublyLinkedList::pop' => ['hasSideEffects' => true], + 'SplDoublyLinkedList::shift' => ['hasSideEffects' => true], 'SplFileObject::fflush' => ['hasSideEffects' => true], 'SplFileObject::fgetc' => ['hasSideEffects' => true], 'SplFileObject::fgetcsv' => ['hasSideEffects' => true], @@ -651,6 +653,19 @@ 'SplFileObject::fseek' => ['hasSideEffects' => true], 'SplFileObject::ftruncate' => ['hasSideEffects' => true], 'SplFileObject::fwrite' => ['hasSideEffects' => true], + 'SplFixedArray::extract' => ['hasSideEffects' => true], + 'SplHead::extract' => ['hasSideEffects' => true], + 'SplHead::insert' => ['hasSideEffects' => true], + 'SplHead::recoverFromCorruption' => ['hasSideEffects' => true], + 'SplObjectStorage::addAll' => ['hasSideEffects' => true], + 'SplObjectStorage::attach' => ['hasSideEffects' => true], + 'SplObjectStorage::detach' => ['hasSideEffects' => true], + 'SplObjectStorage::removeAll' => ['hasSideEffects' => true], + 'SplObjectStorage::removeAllExcept' => ['hasSideEffects' => true], + 'SplPriorityQueue::extract' => ['hasSideEffects' => true], + 'SplPriorityQueue::insert' => ['hasSideEffects' => true], + 'SplPriorityQueue::recoverFromCorruption' => ['hasSideEffects' => true], + 'SplQueue::dequeue' => ['hasSideEffects' => true], 'Spoofchecker::__construct' => ['hasSideEffects' => false], 'StringBackedEnum::from' => ['hasSideEffects' => false], 'StringBackedEnum::tryFrom' => ['hasSideEffects' => false], diff --git a/tests/PHPStan/Rules/Comparison/NumberComparisonOperatorsConstantConditionRuleTest.php b/tests/PHPStan/Rules/Comparison/NumberComparisonOperatorsConstantConditionRuleTest.php index e6913ff669..f05edf6b3d 100644 --- a/tests/PHPStan/Rules/Comparison/NumberComparisonOperatorsConstantConditionRuleTest.php +++ b/tests/PHPStan/Rules/Comparison/NumberComparisonOperatorsConstantConditionRuleTest.php @@ -245,6 +245,12 @@ public function testBug9850(): void $this->analyse([__DIR__ . '/data/bug-9850.php'], []); } + public function testBug9180(): void + { + $this->treatPhpDocTypesAsCertain = true; + $this->analyse([__DIR__ . '/data/bug-9180.php'], []); + } + public function testBug12716(): void { $this->treatPhpDocTypesAsCertain = true; diff --git a/tests/PHPStan/Rules/Comparison/StrictComparisonOfDifferentTypesRuleTest.php b/tests/PHPStan/Rules/Comparison/StrictComparisonOfDifferentTypesRuleTest.php index 3e75e3bc52..a0efad16b4 100644 --- a/tests/PHPStan/Rules/Comparison/StrictComparisonOfDifferentTypesRuleTest.php +++ b/tests/PHPStan/Rules/Comparison/StrictComparisonOfDifferentTypesRuleTest.php @@ -996,6 +996,11 @@ public function testBug12946(): void $this->analyse([__DIR__ . '/data/bug-12946.php'], []); } + public function testBug10884(): void + { + $this->analyse([__DIR__ . '/data/bug-10884.php'], []); + } + public function testBug13208(): void { $this->analyse([__DIR__ . '/data/bug-13208.php'], []); diff --git a/tests/PHPStan/Rules/Comparison/data/bug-10884.php b/tests/PHPStan/Rules/Comparison/data/bug-10884.php new file mode 100644 index 0000000000..36845f3f47 --- /dev/null +++ b/tests/PHPStan/Rules/Comparison/data/bug-10884.php @@ -0,0 +1,49 @@ + $map */ +$map = new \SplObjectStorage(); +$map->attach(new Cat()); +$map->attach(new Cat()); + +class Manager +{ + /** + * @param SplObjectStorage $map + */ + public function doSomething(\SplObjectStorage $map): void + { + /** @var \SplObjectStorage $other */ + $other = new \SplObjectStorage(); + + if (count($map) === 0) { + return; + } + + foreach ($map as $cat) { + if (!$this->someCheck($cat)) { + continue; + } + + $other->attach($cat); + } + + $map->removeAll($other); + + if (count($map) === 0) { + return; + } + + // ok! + } + + private function someCheck(Cat $cat): bool { + // just some random + return $cat == true; + } +} + +(new Manager())->doSomething($map); diff --git a/tests/PHPStan/Rules/Comparison/data/bug-9180.php b/tests/PHPStan/Rules/Comparison/data/bug-9180.php new file mode 100644 index 0000000000..d92e3b213c --- /dev/null +++ b/tests/PHPStan/Rules/Comparison/data/bug-9180.php @@ -0,0 +1,15 @@ +push(1); + +if ($queue->count() > 0) { + for ($i=0;$i<5;$i++) { + while ($queue->count() > 0 && $value = $queue->shift()) { + //do something with $value + } + } +}