@@ -2559,13 +2559,13 @@ static void zend_separate_if_call_and_write(znode *node, zend_ast *ast, uint32_t
25592559
25602560void zend_delayed_compile_var (znode * result , zend_ast * ast , uint32_t type );
25612561void zend_compile_assign (znode * result , zend_ast * ast );
2562- static void zend_compile_list_assign (znode * result , zend_ast * ast , znode * expr_node );
2562+ static void zend_compile_list_assign (znode * result , zend_ast * ast , znode * expr_node , zend_bool old_style );
25632563
25642564static inline void zend_emit_assign_znode (zend_ast * var_ast , znode * value_node ) /* {{{ */
25652565{
25662566 znode dummy_node ;
25672567 if (var_ast -> kind == ZEND_AST_ARRAY ) {
2568- zend_compile_list_assign (& dummy_node , var_ast , value_node );
2568+ zend_compile_list_assign (& dummy_node , var_ast , value_node , var_ast -> attr );
25692569 } else {
25702570 zend_ast * assign_ast = zend_ast_create (ZEND_AST_ASSIGN , var_ast ,
25712571 zend_ast_create_znode (value_node ));
@@ -2709,14 +2709,18 @@ void zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, int d
27092709}
27102710/* }}} */
27112711
2712- static void zend_verify_list_assign_target (zend_ast * var_ast ) /* {{{ */ {
2713- if (!zend_can_write_to_variable (var_ast ) && var_ast -> kind != ZEND_AST_ARRAY ) {
2712+ static void zend_verify_list_assign_target (zend_ast * var_ast , zend_bool old_style ) /* {{{ */ {
2713+ if (var_ast -> kind == ZEND_AST_ARRAY ) {
2714+ if (old_style != var_ast -> attr ) {
2715+ zend_error (E_COMPILE_ERROR , "Cannot mix [] and list()" );
2716+ }
2717+ } else if (!zend_can_write_to_variable (var_ast )) {
27142718 zend_error (E_COMPILE_ERROR , "Assignments can only happen to writable values" );
27152719 }
27162720}
27172721/* }}} */
27182722
2719- static void zend_compile_unkeyed_list_assign (zend_ast_list * list , znode * expr_node ) /* {{{ */
2723+ static void zend_compile_unkeyed_list_assign (zend_ast_list * list , znode * expr_node , zend_bool old_style ) /* {{{ */
27202724{
27212725 uint32_t i ;
27222726 zend_bool has_elems = 0 ;
@@ -2744,7 +2748,7 @@ static void zend_compile_unkeyed_list_assign(zend_ast_list *list, znode *expr_no
27442748 zend_error (E_COMPILE_ERROR , "Cannot mix keyed and unkeyed array entries in assignments" );
27452749 }
27462750
2747- zend_verify_list_assign_target (var_ast );
2751+ zend_verify_list_assign_target (var_ast , old_style );
27482752
27492753 zend_emit_op (& fetch_result , ZEND_FETCH_LIST , expr_node , & dim_node );
27502754 zend_emit_assign_znode (var_ast , & fetch_result );
@@ -2756,7 +2760,7 @@ static void zend_compile_unkeyed_list_assign(zend_ast_list *list, znode *expr_no
27562760}
27572761/* }}} */
27582762
2759- static void zend_compile_keyed_list_assign (zend_ast_list * list , znode * expr_node ) /* {{{ */
2763+ static void zend_compile_keyed_list_assign (zend_ast_list * list , znode * expr_node , zend_bool old_style ) /* {{{ */
27602764{
27612765 uint32_t i ;
27622766
@@ -2780,22 +2784,22 @@ static void zend_compile_keyed_list_assign(zend_ast_list *list, znode *expr_node
27802784 zend_error (E_COMPILE_ERROR , "Cannot mix keyed and unkeyed array entries in assignments" );
27812785 }
27822786
2783- zend_verify_list_assign_target (var_ast );
2787+ zend_verify_list_assign_target (var_ast , old_style );
27842788
27852789 zend_emit_op (& fetch_result , ZEND_FETCH_LIST , expr_node , & dim_node );
27862790 zend_emit_assign_znode (var_ast , & fetch_result );
27872791 }
27882792}
27892793/* }}} */
27902794
2791- static void zend_compile_list_assign (znode * result , zend_ast * ast , znode * expr_node ) /* {{{ */
2795+ static void zend_compile_list_assign (znode * result , zend_ast * ast , znode * expr_node , zend_bool old_style ) /* {{{ */
27922796{
27932797 zend_ast_list * list = zend_ast_get_list (ast );
27942798
27952799 if (list -> children > 0 && list -> child [0 ] != NULL && list -> child [0 ]-> child [1 ] != NULL /* has key */ ) {
2796- zend_compile_keyed_list_assign (list , expr_node );
2800+ zend_compile_keyed_list_assign (list , expr_node , old_style );
27972801 } else {
2798- zend_compile_unkeyed_list_assign (list , expr_node );
2802+ zend_compile_unkeyed_list_assign (list , expr_node , old_style );
27992803 }
28002804
28012805 * result = * expr_node ;
@@ -2944,7 +2948,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */
29442948 zend_compile_expr (& expr_node , expr_ast );
29452949 }
29462950
2947- zend_compile_list_assign (result , var_ast , & expr_node );
2951+ zend_compile_list_assign (result , var_ast , & expr_node , var_ast -> attr );
29482952 return ;
29492953 EMPTY_SWITCH_DEFAULT_CASE ();
29502954 }
@@ -6347,6 +6351,10 @@ static zend_bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
63476351 uint32_t i ;
63486352 zend_bool is_constant = 1 ;
63496353
6354+ if (ast -> attr ) {
6355+ zend_error (E_COMPILE_ERROR , "Cannot use list() as standalone expression" );
6356+ }
6357+
63506358 /* First ensure that *all* child nodes are constant and by-val */
63516359 for (i = 0 ; i < list -> children ; ++ i ) {
63526360 zend_ast * elem_ast = list -> child [i ];
0 commit comments