Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions lib/BuiltinParamNames.php
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,11 @@ public static function forFunction(string $name): ?array
return ['filename', 'line'];
case 'number_format':
return ['num', 'decimals', 'decimal_separator', 'thousands_separator'];
// php-src ext/standard/basic_functions.stub.php — InternalArgInfo still says number (#23259)
case 'abs':
case 'floor':
case 'ceil':
return ['num'];
case 'round':
return ['num', 'precision', 'mode'];
case 'frexp':
Expand Down
30 changes: 30 additions & 0 deletions test/compliance/cases/stdlib/named_args_abs_floor_ceil.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
--TEST--
abs / floor / ceil named num argument (VM, issue #23259)
--FILE--
<?php
var_export(abs(num: -3));
echo PHP_EOL;
var_export(floor(num: 1.5));
echo PHP_EOL;
var_export(ceil(num: 1.2));
echo PHP_EOL;
foreach (['abs', 'floor', 'ceil'] as $fn) {
$rf = new ReflectionFunction($fn);
foreach ($rf->getParameters() as $p) {
echo $fn, ':', $p->getName(), PHP_EOL;
}
}
try {
abs(number: -3);
echo "number accepted\n";
} catch (Throwable $e) {
echo $e->getMessage(), PHP_EOL;
}
--EXPECT--
3
1.0
2.0
abs:num
floor:num
ceil:num
Unknown named parameter $number
31 changes: 31 additions & 0 deletions test/compliance/cases/stdlib/named_args_abs_floor_ceil_jit.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
--TEST--
abs / floor / ceil named num argument (JIT, issue #23259)
--JIT--
--FILE--
<?php
var_export(abs(num: -3));
echo PHP_EOL;
var_export(floor(num: 1.5));
echo PHP_EOL;
var_export(ceil(num: 1.2));
echo PHP_EOL;
foreach (['abs', 'floor', 'ceil'] as $fn) {
$rf = new ReflectionFunction($fn);
foreach ($rf->getParameters() as $p) {
echo $fn, ':', $p->getName(), PHP_EOL;
}
}
try {
abs(number: -3);
echo "number accepted\n";
} catch (Throwable $e) {
echo $e->getMessage(), PHP_EOL;
}
--EXPECT--
3
1.0
2.0
abs:num
floor:num
ceil:num
Unknown named parameter $number
11 changes: 11 additions & 0 deletions test/fixtures/aot/cases/abs_floor_ceil_named_params.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--TEST--
AOT: abs() named num: argument (#23259)
--FILE--
<?php
echo abs(num: -3), "\n";
echo abs(num: 0), "\n";
echo abs(-3), "\n";
--EXPECT--
3
0
3
35 changes: 35 additions & 0 deletions test/repro/issue_23259_abs_floor_ceil_named.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php
// Repro #23259 — abs/floor/ceil Zend stub named parameter (num)
$checks = [];
foreach (['abs', 'floor', 'ceil'] as $fn) {
$names = [];
foreach ((new ReflectionFunction($fn))->getParameters() as $p) {
$names[] = $p->getName();
}
$checks[] = ['num'] === $names;
try {
if ('abs' === $fn) {
$checks[] = 3 === abs(num: -3) && 3 === abs(-3);
} elseif ('floor' === $fn) {
$checks[] = 1.0 === floor(num: 1.5) && 1.0 === floor(1.5);
} else {
$checks[] = 2.0 === ceil(num: 1.2) && 2.0 === ceil(1.2);
}
} catch (Throwable $e) {
$checks[] = false;
}
try {
if ('abs' === $fn) {
abs(number: -3);
} elseif ('floor' === $fn) {
floor(number: 1.5);
} else {
ceil(number: 1.2);
}
$checks[] = false;
} catch (Error $e) {
$checks[] = str_contains($e->getMessage(), 'Unknown named parameter $number');
}
}

echo (!in_array(false, $checks, true)) ? "ok\n" : "fail\n";
4 changes: 4 additions & 0 deletions test/repro/issue_23259_abs_floor_ceil_named_aot.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?php
// AOT probe #23259 — abs named num: (floor/ceil AOT positional already return 0 on master)
echo abs(num: -3), "\n";
echo abs(-3), "\n";
11 changes: 11 additions & 0 deletions test/unit/BuiltinParamNamesAliasTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -896,6 +896,17 @@ public function testRoundNamedParameters(): void
self::assertSame(2, BuiltinParamNames::lookupNamedParamIndex($names, 'mode', 'round'));
}

/** @covers issue #23259 */
public function testAbsFloorCeilZendStubNamedParams(): void
{
foreach (['abs', 'floor', 'ceil'] as $fn) {
$names = BuiltinParamNames::forFunction($fn);
self::assertSame(['num'], $names, $fn);
self::assertSame(0, BuiltinParamNames::lookupNamedParamIndex($names, 'num', $fn), $fn);
self::assertFalse(BuiltinParamNames::lookupNamedParamIndex($names, 'number', $fn), $fn);
}
}

/** @covers issue #11785 / #25166 */
public function testDateTimeClassMethodNamedParameters(): void
{
Expand Down
Loading