diff options
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/tests/bug69825.phpt | 30 | ||||
-rw-r--r-- | Zend/zend_compile.c | 5 |
2 files changed, 34 insertions, 1 deletions
diff --git a/Zend/tests/bug69825.phpt b/Zend/tests/bug69825.phpt new file mode 100644 index 0000000000..1349dee5ae --- /dev/null +++ b/Zend/tests/bug69825.phpt @@ -0,0 +1,30 @@ +--TEST-- +Bug #69825 (Short-circuiting failure) +--FILE-- +<?php + +print "AND\n"; +var_dump(0 && 1); +var_dump(0 && 0); +var_dump(1 && 0); +var_dump(1 && 1); + +print "OR\n"; +var_dump(0 || 1); +var_dump(0 || 0); +var_dump(1 || 0); +var_dump(1 || 1); + +?> +--EXPECT-- +AND +bool(false) +bool(false) +bool(false) +bool(true) +OR +bool(true) +bool(false) +bool(true) +bool(true) + diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 7e25c89781..f753af4483 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5854,7 +5854,10 @@ void zend_compile_short_circuiting(znode *result, zend_ast *ast) /* {{{ */ zend_compile_expr(&right_node, right_ast); - if (right_node.op_type == IS_CONST) { + if (right_node.op_type == IS_CONST && ( + (ast->kind == ZEND_AST_AND && !zend_is_true(&right_node.u.constant)) + || (ast->kind == ZEND_AST_OR && zend_is_true(&right_node.u.constant)) + )) { result->op_type = IS_CONST; ZVAL_BOOL(&result->u.constant, zend_is_true(&right_node.u.constant)); zval_ptr_dtor(&right_node.u.constant); |