]> granicus.if.org Git - php/commitdiff
Partial fix for bug #75426
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 2 Jan 2019 10:32:48 +0000 (11:32 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 2 Jan 2019 10:32:48 +0000 (11:32 +0100)
This does not print the exact line of the comma, but rather the line
of the previous element. This should generally be "good enough", as
the line number is close (off by one) to the actual issue now.
Previously it would point to the start of the array, which may be
very far away.

Zend/tests/bug75426.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/bug75426.phpt b/Zend/tests/bug75426.phpt
new file mode 100644 (file)
index 0000000..69e3f19
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Bug #75426: "Cannot use empty array elements" reports wrong position
+--FILE--
+<?php
+$a = [
+    1,
+    2,
+    3,
+    ,
+    5,
+    6,
+];
+?>
+--EXPECTF--
+Fatal error: Cannot use empty array elements in arrays in %s on line 5
index 77702b3facfe018f46f7e74a8ec8451df0d22c3e..23c3b999680c0a595640c11a247e430759017af9 100644 (file)
@@ -6920,6 +6920,7 @@ static inline void zend_ct_eval_greater(zval *result, zend_ast_kind kind, zval *
 static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
 {
        zend_ast_list *list = zend_ast_get_list(ast);
+       zend_ast *last_elem_ast = NULL;
        uint32_t i;
        zend_bool is_constant = 1;
 
@@ -6932,6 +6933,10 @@ static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
                zend_ast *elem_ast = list->child[i];
 
                if (elem_ast == NULL) {
+                       /* Report error at line of last non-empty element */
+                       if (last_elem_ast) {
+                               CG(zend_lineno) = zend_ast_get_lineno(last_elem_ast);
+                       }
                        zend_error(E_COMPILE_ERROR, "Cannot use empty array elements in arrays");
                }
 
@@ -6943,6 +6948,8 @@ static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
                ) {
                        is_constant = 0;
                }
+
+               last_elem_ast = elem_ast;
        }
 
        if (!is_constant) {