diff --git a/src/Psalm/Internal/Codebase/Functions.php b/src/Psalm/Internal/Codebase/Functions.php index 50e3f60fba5..a86d9aec9e0 100644 --- a/src/Psalm/Internal/Codebase/Functions.php +++ b/src/Psalm/Internal/Codebase/Functions.php @@ -476,6 +476,7 @@ public function isCallMapFunctionPure( 'date_default_timezone_set', 'assert_options', 'setlocale', 'set_exception_handler', 'set_time_limit', 'putenv', 'spl_autoload_register', 'spl_autoload_unregister', 'microtime', 'array_rand', 'set_include_path', + 'array_pop', // logging 'openlog', 'syslog', 'error_log', 'define_syslog_variables', diff --git a/tests/PureAnnotationTest.php b/tests/PureAnnotationTest.php index 11f3a99422c..954173abbc8 100644 --- a/tests/PureAnnotationTest.php +++ b/tests/PureAnnotationTest.php @@ -902,6 +902,30 @@ function (): void {} ', 'error_message' => 'ImpureFunctionCall', ], + 'array_popIsNotMutationFree' => [ + 'code' => <<<'PHP' + */ + private array $stack = []; + + public function push(string $item): void + { + $this->stack[] = $item; + } + + /** @psalm-mutation-free */ + public function next(): string|null + { + return array_pop($this->stack); + } + } + PHP, + 'error_message' => 'ImpureFunctionCall', + 'ignored_issues' => [], + 'php_version' => '8.0', + ], ]; } }