Skip to content

Commit 69fb20f

Browse files
committed
Fixed assign coalesce. "$a[0] ??= $a" should evaluate the right $a first.
1 parent 0eb7a15 commit 69fb20f

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

Zend/tests/assign_coalesce_007.phpt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--TEST--
2+
Assign coalesce: "$a[0] ??= $a" should evaluate the right $a first
3+
--FILE--
4+
<?php
5+
$a[0] ??= $a;
6+
var_dump($a);
7+
?>
8+
--EXPECTF--
9+
Warning: Undefined variable $a in %sassign_coalesce_007.php on line 2
10+
array(1) {
11+
[0]=>
12+
NULL
13+
}

Zend/zend_compile.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8510,7 +8510,20 @@ void zend_compile_assign_coalesce(znode *result, zend_ast *ast) /* {{{ */
85108510
zend_emit_op_tmp(result, ZEND_COALESCE, &var_node_is, NULL);
85118511

85128512
CG(memoize_mode) = ZEND_MEMOIZE_NONE;
8513-
zend_compile_expr(&default_node, default_ast);
8513+
if (var_ast->kind == ZEND_AST_DIM
8514+
&& zend_is_assign_to_self(var_ast, default_ast)
8515+
&& !is_this_fetch(default_ast)) {
8516+
/* $a[0] = $a should evaluate the right $a first */
8517+
znode cv_node;
8518+
8519+
if (zend_try_compile_cv(&cv_node, default_ast) == FAILURE) {
8520+
zend_compile_simple_var_no_cv(&default_node, default_ast, BP_VAR_R, 0);
8521+
} else {
8522+
zend_emit_op_tmp(&default_node, ZEND_QM_ASSIGN, &cv_node, NULL);
8523+
}
8524+
} else {
8525+
zend_compile_expr(&default_node, default_ast);
8526+
}
85148527

85158528
CG(memoize_mode) = ZEND_MEMOIZE_FETCH;
85168529
zend_compile_var(&var_node_w, var_ast, BP_VAR_W, 0);

0 commit comments

Comments
 (0)