Skip to content

Commit a6484d9

Browse files
committed
Allow named args after unpack
1 parent 446471b commit a6484d9

File tree

3 files changed

+50
-13
lines changed

3 files changed

+50
-13
lines changed
Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,52 @@
11
--TEST--
2-
Mixing unpacking and named params (1)
2+
Named args after unpacking (supported)
33
--FILE--
44
<?php
55

6-
test(...[], a: 42);
6+
function test(...$args) {
7+
var_dump($args);
8+
}
9+
10+
test(...[1, 2], a: 3);
11+
test(...[1, 'a' => 2], b: 3);
12+
13+
function test2($a, $b, $c = 3, $d = 4) {
14+
var_dump($a, $b, $c, $d);
15+
}
16+
17+
test2(...[1, 2], d: 40);
18+
test2(...['b' => 2, 'a' => 1], d: 40);
19+
20+
try {
21+
test2(...[1, 2], b: 20);
22+
} catch (Error $e) {
23+
echo $e->getMessage(), "\n";
24+
}
725

826
?>
9-
--EXPECTF--
10-
Fatal error: Cannot combine named arguments and argument unpacking in %s on line %d
27+
--EXPECT--
28+
array(3) {
29+
[0]=>
30+
int(1)
31+
[1]=>
32+
int(2)
33+
["a"]=>
34+
int(3)
35+
}
36+
array(3) {
37+
[0]=>
38+
int(1)
39+
["a"]=>
40+
int(2)
41+
["b"]=>
42+
int(3)
43+
}
44+
int(1)
45+
int(2)
46+
int(3)
47+
int(40)
48+
int(1)
49+
int(2)
50+
int(3)
51+
int(40)
52+
Named parameter $b overwrites previous argument
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
--TEST--
2-
Mixing unpacking and named params (2)
2+
Named args before unpacking (not supported)
33
--FILE--
44
<?php
55

66
test(a: 42, ...[]);
77

88
?>
99
--EXPECTF--
10-
Fatal error: Cannot combine named arguments and argument unpacking in %s on line %d
10+
Fatal error: Cannot use argument unpacking after named arguments in %s on line %d

Zend/zend_compile.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3472,7 +3472,7 @@ uint32_t zend_compile_args(
34723472
if (arg->kind == ZEND_AST_UNPACK) {
34733473
if (uses_named_args) {
34743474
zend_error_noreturn(E_COMPILE_ERROR,
3475-
"Cannot combine named arguments and argument unpacking");
3475+
"Cannot use argument unpacking after named arguments");
34763476
}
34773477

34783478
uses_arg_unpack = 1;
@@ -3492,16 +3492,11 @@ uint32_t zend_compile_args(
34923492
}
34933493

34943494
if (arg->kind == ZEND_AST_NAMED_ARG) {
3495-
if (uses_arg_unpack) {
3496-
zend_error_noreturn(E_COMPILE_ERROR,
3497-
"Cannot combine named arguments and argument unpacking");
3498-
}
3499-
35003495
uses_named_args = 1;
35013496
arg_name = zval_make_interned_string(zend_ast_get_zval(arg->child[0]));
35023497
arg = arg->child[1];
35033498

3504-
if (fbc) {
3499+
if (fbc && !uses_arg_unpack) {
35053500
arg_num = zend_get_arg_num(fbc, arg_name);
35063501
if (arg_num == arg_count + 1 && !may_have_undef) {
35073502
/* Using named arguments, but passing in order. */

0 commit comments

Comments
 (0)