Skip to content

Commit 6c5bdf7

Browse files
committed
Variadic placeholder should be last (including after named args)
1 parent af3ee05 commit 6c5bdf7

22 files changed

+98
-101
lines changed

Zend/Optimizer/zend_call_graph.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ ZEND_API void zend_analyze_calls(zend_arena **arena, zend_script *script, uint32
151151
call_info->named_args = true;
152152
break;
153153
}
154+
if (opline->opcode == ZEND_SEND_PLACEHOLDER && opline->op1.num == _IS_PLACEHOLDER_VARIADIC) {
155+
break;
156+
}
154157

155158
uint32_t num = opline->op2.num;
156159
if (num > 0) {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
--TEST--
2-
Closure application compile errors: only named arguments after ...
2+
Closure application compile errors: ... must be last
33
--FILE--
44
<?php
55
foo(..., ?);
66
?>
77
--EXPECTF--
8-
Fatal error: Only named arguments may follow variadic placeholder in %s on line %d
8+
Fatal error: Variadic placeholder must be last in %s on line %d
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
--TEST--
2-
Closure application compile errors: named arguments must come after variadic placeholder
2+
Closure application compile errors: named arguments must come before variadic placeholder
33
--FILE--
44
<?php
5-
foo(n: 5, ...);
5+
foo(..., n: 5);
66
?>
77
--EXPECTF--
8-
Fatal error: Cannot use positional argument after named argument in %s on line %d
8+
Fatal error: Variadic placeholder must be last in %s on line %d

Zend/tests/partial_application/compile_errors_005.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ Closure application compile errors: follow variadic with un-named arg
55
foo(..., $a);
66
?>
77
--EXPECTF--
8-
Fatal error: Only named arguments may follow variadic placeholder in %s on line %d
8+
Fatal error: Variadic placeholder must be last in %s on line %d
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
--TEST--
2-
Closure application compile errors: mix application with unpack (placeholder before)
2+
Closure application compile errors: mix application with unpack
33
--FILE--
44
<?php
5-
foo(..., ...["foo" => "bar"]);
5+
foo(...["foo" => "bar"], ...);
66
?>
77
--EXPECTF--
88
Fatal error: Cannot combine partial application and unpacking %s on line %d

Zend/tests/partial_application/extra_collect_001.phpt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,23 @@ function foo(...$args) {
66
var_dump($args);
77
}
88

9-
$foo = foo(..., foo: "foo");
9+
$foo = foo(foo: "foo", ...);
1010

11-
$bar = $foo(..., bar: "bar");
11+
$bar = $foo(bar: "bar", ...);
1212

13-
$baz = $bar(..., baz: "baz");
13+
$baz = $bar(baz: "baz", ...);
1414

1515
$baz();
1616

1717
$foo = foo(...);
1818

19-
$bar = $foo(..., bar: "bar");
19+
$bar = $foo(bar: "bar", ...);
2020

21-
$baz = $bar(..., baz: "baz");
21+
$baz = $bar(baz: "baz", ...);
2222

2323
$baz();
2424

25-
$foo = foo(..., foo: "foo");
25+
$foo = foo(foo: "foo", ...);
2626

2727
$foo(bar: "bar");
2828
?>

Zend/tests/partial_application/fuzz_004.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ function foo($a, $b) {
66
return $a + $b;
77
}
88

9-
$foo = foo(..., b: 10);
9+
$foo = foo(b: 10, ...);
1010

1111
try {
1212
$foo->__invoke(UNDEFINED);

Zend/tests/partial_application/fuzz_005.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ Closure application fuzz 005
66
function foo(int $day = 1, int $month = 1, int $yearh = 1, int $year = 2005) {
77
}
88

9-
$foo = foo(..., month: 12);
9+
$foo = foo(month: 12, ...);
1010

11-
$bar = $foo(..., year: 2016);
11+
$bar = $foo(year: 2016, ...);
1212

1313
?>
1414
==DONE==

Zend/tests/partial_application/fuzz_006.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function foo(int $day = 1, int $month = 1, int $year = 2005) {
77
var_dump($day);
88
}
99

10-
$foo = foo(..., month: 12);
10+
$foo = foo(month: 12, ...);
1111

1212
$foo(year: 2025);
1313

Zend/tests/partial_application/fuzz_007.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Closure application fuzz 007
66
function foo(int $day = 1, int $month = UNDEFINED, int $year = 2005) {
77
}
88

9-
$foo = foo(..., year: 2006);
9+
$foo = foo(year: 2006, ...);
1010

1111
try {
1212
$foo(2);

0 commit comments

Comments
 (0)