]> granicus.if.org Git - php/commitdiff
Fix over-eager named params optimization
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 26 Aug 2020 09:01:15 +0000 (11:01 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 26 Aug 2020 09:01:15 +0000 (11:01 +0200)
We can't relax a named param to a positional param if we encountered
any unknown parameters in the meantime.

Zend/tests/named_params/unknown_named_param.phpt
Zend/zend_compile.c

index f43a40c69ca626c40f8e881b89417f24fcea042d..9e299dc953b915bda32ae1dd2a1d7009c3df05ea 100644 (file)
@@ -15,6 +15,12 @@ try {
     echo $e->getMessage(), "\n";
 }
 
+try {
+    test(b: 2, a: 1);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
 try {
     test2(a: 42);
 } catch (Error $e) {
@@ -24,3 +30,4 @@ try {
 ?>
 --EXPECT--
 Unknown named parameter $b
+Unknown named parameter $b
index 9c4853ae4eb1149e50c8fd5d23359992f2a88620..11d7418b7ef21b632968445bf0dddf2a0d01d699 100644 (file)
@@ -3369,7 +3369,7 @@ uint32_t zend_compile_args(
 
                        if (fbc) {
                                arg_num = zend_get_arg_num(fbc, arg_name);
-                               if (arg_num == arg_count + 1) {
+                               if (arg_num == arg_count + 1 && !may_have_undef) {
                                        /* Using named arguments, but passing in order. */
                                        arg_name = NULL;
                                        arg_count++;