fix(optimizer): preserve array_keys strict type errors

master^2
hafung 15 hours ago committed by tianfenghan
parent 61d53179d1
commit 0f430e85a6
  1. 5
      src/Optimizer/FuncCallOptimizer.php
  2. 52
      tests/compiler/stdlib/array-keys-dynamic-arguments.phpt

@ -766,10 +766,13 @@ trait FuncCallOptimizer
return 'php::fn::get_parent_class(' . $this->parseIdentifier($arg) . ')';
}
protected function genArrayKeys(string $n, Node\Expr\FuncCall $e, array $c): string
protected function genArrayKeys(string $n, Node\Expr\FuncCall $e, array $c): string|false
{
$cnt = count($e->args);
if ($cnt >= 3) {
if ($this->detectTypeOfExpr($e->args[2]->value) !== Type::BOOL) {
return false;
}
return 'php::fn::array_keys_filter(' . $this->getArg($e, 0) . ', ' . $this->getArg($e, 1) . ', '
. $this->resolveArg($e, 2, self::ARG_TYPE_BOOL) . ')';
}

@ -1,5 +1,5 @@
--TEST--
array_keys optimized calls convert dynamic arguments and preserve evaluation order
array_keys optimized calls preserve dynamic arguments, strict types, and evaluation order
--FILE--
<?php
declare(strict_types=1);
@ -27,6 +27,26 @@ function arrayKeysDynamicFilter(array &$events): mixed
return '1';
}
function arrayKeysMixedBool(): mixed
{
return true;
}
function arrayKeysMixedInt(): mixed
{
return 1;
}
function arrayKeysMixedArray(): mixed
{
return [];
}
function arrayKeysUnionInt(): bool|int
{
return 1;
}
function main()
{
$values = ['integer' => 1, 'string' => '1'];
@ -48,6 +68,29 @@ function main()
arrayKeysDynamicStrict($events)
));
var_dump($events);
var_dump(array_keys($values, '1', arrayKeysMixedBool()));
try {
array_keys($values, '1', arrayKeysMixedInt());
echo "mixed-int=missing TypeError\n";
} catch (TypeError $error) {
echo "mixed-int=TypeError\n";
}
try {
array_keys($values, '1', arrayKeysMixedArray());
echo "mixed-array=missing TypeError\n";
} catch (TypeError $error) {
echo "mixed-array=TypeError\n";
}
try {
array_keys($values, '1', arrayKeysUnionInt());
echo "union-int=missing TypeError\n";
} catch (TypeError $error) {
echo "union-int=TypeError\n";
}
}
?>
--EXPECT--
@ -87,3 +130,10 @@ array(3) {
[2]=>
string(6) "strict"
}
array(1) {
[0]=>
string(6) "string"
}
mixed-int=TypeError
mixed-array=TypeError
union-int=TypeError

Loading…
Cancel
Save