summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--Zend/tests/constant_expressions.phpt5
-rw-r--r--Zend/zend_ast.c7
-rw-r--r--Zend/zend_language_parser.y1
4 files changed, 14 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index c300e8ade4..d81b1fbacd 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@ PHP NEWS
- Core:
. Allow zero length comparison in substr_compare() (Tjerk)
. Fixed bug #60602 (proc_open() changes environment array) (Tjerk)
+ . Fixed bug #66822 (Cannot use T_POW in const expression) (Tjerk)
- cURL:
. Fixed bug #66109 (Can't reset CURLOPT_CUSTOMREQUEST to default behaviour)
diff --git a/Zend/tests/constant_expressions.phpt b/Zend/tests/constant_expressions.phpt
index 7dea0d83f7..cf6474bd63 100644
--- a/Zend/tests/constant_expressions.phpt
+++ b/Zend/tests/constant_expressions.phpt
@@ -35,6 +35,9 @@ const T_25 = 1 + 2 * 3;
// Test for memory leaks
const T_26 = "1" + 2 + "3";
+// Allow T_POW
+const T_27 = 2 ** 3;
+
var_dump(T_1);
var_dump(T_2);
var_dump(T_3);
@@ -61,6 +64,7 @@ var_dump(T_23);
var_dump(T_24);
var_dump(T_25);
var_dump(T_26);
+var_dump(T_27);
?>
--EXPECT--
int(2)
@@ -89,3 +93,4 @@ bool(false)
bool(true)
int(7)
int(6)
+int(8)
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index cf595b4d58..9a0808db9d 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -107,6 +107,13 @@ ZEND_API void zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *s
zval_dtor(&op1);
zval_dtor(&op2);
break;
+ case ZEND_POW:
+ zend_ast_evaluate(&op1, (&ast->u.child)[0], scope TSRMLS_CC);
+ zend_ast_evaluate(&op2, (&ast->u.child)[1], scope TSRMLS_CC);
+ pow_function(result, &op1, &op2 TSRMLS_CC);
+ zval_dtor(&op1);
+ zval_dtor(&op2);
+ break;
case ZEND_DIV:
zend_ast_evaluate(&op1, (&ast->u.child)[0], scope TSRMLS_CC);
zend_ast_evaluate(&op2, (&ast->u.child)[1], scope TSRMLS_CC);
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index d3844540cf..b7467b7552 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -1006,6 +1006,7 @@ static_operation:
static_scalar_value '+' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_ADD, $1.u.ast, $3.u.ast); }
| static_scalar_value '-' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_SUB, $1.u.ast, $3.u.ast); }
| static_scalar_value '*' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_MUL, $1.u.ast, $3.u.ast); }
+ | static_scalar_value T_POW static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_POW, $1.u.ast, $3.u.ast); }
| static_scalar_value '/' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_DIV, $1.u.ast, $3.u.ast); }
| static_scalar_value '%' static_scalar_value { $$.u.ast = zend_ast_create_binary(ZEND_MOD, $1.u.ast, $3.u.ast); }
| '!' static_scalar_value { $$.u.ast = zend_ast_create_unary(ZEND_BOOL_NOT, $2.u.ast); }