From 80aaeb969611ef5ed168366aa443e5ca1661cf78 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 5 Oct 2021 20:23:56 +0300 Subject: [PATCH] Fixed assign coalesce. "$a[0] ??= $a" should evaluate the right $a first. --- Zend/tests/assign_coalesce_007.phpt | 13 +++++++++++++ Zend/zend_compile.c | 15 ++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/assign_coalesce_007.phpt diff --git a/Zend/tests/assign_coalesce_007.phpt b/Zend/tests/assign_coalesce_007.phpt new file mode 100644 index 00000000000..f569aa5cbfb --- /dev/null +++ b/Zend/tests/assign_coalesce_007.phpt @@ -0,0 +1,13 @@ +--TEST-- +Assign coalesce: "$a[0] ??= $a" should evaluate the right $a first +--FILE-- + +--EXPECTF-- +Warning: Undefined variable $a in %sassign_coalesce_007.php on line 2 +array(1) { + [0]=> + NULL +} diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 4fc212d2a35..a900867ddfb 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -8961,7 +8961,20 @@ static void zend_compile_assign_coalesce(znode *result, zend_ast *ast) /* {{{ */ zend_emit_op_tmp(result, ZEND_COALESCE, &var_node_is, NULL); CG(memoize_mode) = ZEND_MEMOIZE_NONE; - zend_compile_expr(&default_node, default_ast); + if (var_ast->kind == ZEND_AST_DIM + && zend_is_assign_to_self(var_ast, default_ast) + && !is_this_fetch(default_ast)) { + /* $a[0] = $a should evaluate the right $a first */ + znode cv_node; + + if (zend_try_compile_cv(&cv_node, default_ast) == FAILURE) { + zend_compile_simple_var_no_cv(&default_node, default_ast, BP_VAR_R, 0); + } else { + zend_emit_op_tmp(&default_node, ZEND_QM_ASSIGN, &cv_node, NULL); + } + } else { + zend_compile_expr(&default_node, default_ast); + } CG(memoize_mode) = ZEND_MEMOIZE_FETCH; zend_compile_var(&var_node_w, var_ast, BP_VAR_W, 0);