diff --git a/NEWS b/NEWS index 64d41569809ec..f1ef2bd35efe8 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,8 @@ PHP NEWS - Core: . Fixed bug #81216 (Nullsafe operator leaks dynamic property name). (Dmitry) + . Fixed bug #81684 (Using null coalesce assignment with $GLOBALS["x"] produces + opcode error). (ilutov) - MBString: . Fixed bug #81693 (mb_check_encoding(7bit) segfaults). (cmb) diff --git a/Zend/tests/bug81684.phpt b/Zend/tests/bug81684.phpt new file mode 100644 index 0000000000000..e47056187a765 --- /dev/null +++ b/Zend/tests/bug81684.phpt @@ -0,0 +1,11 @@ +--TEST-- +Bug #81684: ??= on $GLOBALS produces an invalid opcode +--FILE-- + +--EXPECT-- +string(1) "x" +Done. diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 63fb6314c1a7d..c136d226e3c2d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -8986,7 +8986,9 @@ static void zend_compile_assign_coalesce(znode *result, zend_ast *ast) /* {{{ */ /* Reproduce some of the zend_compile_assign() opcode fixup logic here. */ opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1]; - switch (var_ast->kind) { + /* Treat $GLOBALS['x'] assignment like assignment to variable. */ + zend_ast_kind kind = is_global_var_fetch(var_ast) ? ZEND_AST_VAR : var_ast->kind; + switch (kind) { case ZEND_AST_VAR: zend_emit_op_tmp(&assign_node, ZEND_ASSIGN, &var_node_w, &default_node); break;