From 9f003c87da54285dba4b1a584f659809863df775 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Sat, 23 Dec 2023 14:19:41 +0100 Subject: [PATCH 01/18] Added deprecation Division by zero when using power with zero as base and negative exponent --- .../runtime_compile_time_binary_operands.phpt | 711 +++++++++++++++++- Zend/zend_compile.c | 4 + Zend/zend_operators.c | 41 +- ext/standard/tests/math/bug45712.phpt | 4 +- ext/standard/tests/math/is_finite_basic.phpt | 33 +- .../tests/math/is_infinite_basic.phpt | 3 +- ext/standard/tests/math/is_nan_basic.phpt | 32 +- ext/standard/tests/math/pow.phpt | 24 +- 8 files changed, 811 insertions(+), 41 deletions(-) diff --git a/Zend/tests/runtime_compile_time_binary_operands.phpt b/Zend/tests/runtime_compile_time_binary_operands.phpt index ef4141cd3568d..b1585c416e290 100644 --- a/Zend/tests/runtime_compile_time_binary_operands.phpt +++ b/Zend/tests/runtime_compile_time_binary_operands.phpt @@ -184,5 +184,714 @@ if($c === 0) { $fl = __DIR__ . DIRECTORY_SEPARATOR . 'compare_binary_operands_temp.php'; @unlink($fl); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d Failed: 0 diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index ae2247b29e30d..8547fa1160902 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -8980,6 +8980,10 @@ ZEND_API bool zend_binary_op_produces_error(uint32_t opcode, const zval *op1, co /* Division by zero throws an error. */ return 1; } + if ((opcode == ZEND_POW) && zval_get_long(op1) == 0 && zval_get_long(op2) <= 0) { + /* 0 ** (<=0) throws a division by zero error. */ + zend_error(E_DEPRECATED, "Power of base 0 and negative exponent is deprecated"); + } if ((opcode == ZEND_SL || opcode == ZEND_SR) && zval_get_long(op2) < 0) { /* Shift by negative number throws an error. */ return 1; diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 890c19c0ab223..d2f4d62fa57db 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1287,6 +1287,21 @@ ZEND_API zend_result ZEND_FASTCALL mul_function(zval *result, zval *op1, zval *o } /* }}} */ +static void ZEND_COLD zend_power_base_0_exponent_lt_eq_0_error(void) +{ + zend_error(E_DEPRECATED, "Power of base 0 and negative exponent is deprecated"); +} + +static zend_result safe_pow(double *result, double base, double exponent) +{ + if (base == 0.0 && exponent <= 0.0) { + zend_power_base_0_exponent_lt_eq_0_error(); + } + + *result = pow(base, exponent); + return SUCCESS; +} + static zend_result ZEND_FASTCALL pow_function_base(zval *result, zval *op1, zval *op2) /* {{{ */ { uint8_t type_pair = TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2)); @@ -1311,14 +1326,18 @@ static zend_result ZEND_FASTCALL pow_function_base(zval *result, zval *op1, zval --i; ZEND_SIGNED_MULTIPLY_LONG(l1, l2, l1, dval, overflow); if (overflow) { - ZVAL_DOUBLE(result, dval * pow(l2, i)); + double pow_result; + safe_pow(&pow_result, l2, i); + ZVAL_DOUBLE(result, dval * pow_result); return SUCCESS; } } else { i /= 2; ZEND_SIGNED_MULTIPLY_LONG(l2, l2, l2, dval, overflow); if (overflow) { - ZVAL_DOUBLE(result, (double)l1 * pow(dval, i)); + double pow_result; + safe_pow(&pow_result, dval, i); + ZVAL_DOUBLE(result, (double)l1 * pow_result); return SUCCESS; } } @@ -1326,17 +1345,25 @@ static zend_result ZEND_FASTCALL pow_function_base(zval *result, zval *op1, zval /* i == 0 */ ZVAL_LONG(result, l1); } else { - ZVAL_DOUBLE(result, pow((double)Z_LVAL_P(op1), (double)Z_LVAL_P(op2))); + double pow_result; + safe_pow(&pow_result, (double)Z_LVAL_P(op1), (double)Z_LVAL_P(op2)); + ZVAL_DOUBLE(result, pow_result); } return SUCCESS; } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) { - ZVAL_DOUBLE(result, pow(Z_DVAL_P(op1), Z_DVAL_P(op2))); + double pow_result; + safe_pow(&pow_result, Z_DVAL_P(op1), Z_DVAL_P(op2)); + ZVAL_DOUBLE(result, pow_result); return SUCCESS; } else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) { - ZVAL_DOUBLE(result, pow((double)Z_LVAL_P(op1), Z_DVAL_P(op2))); + double pow_result; + safe_pow(&pow_result, (double)Z_LVAL_P(op1), Z_DVAL_P(op2)); + ZVAL_DOUBLE(result, pow_result); return SUCCESS; } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) { - ZVAL_DOUBLE(result, pow(Z_DVAL_P(op1), (double)Z_LVAL_P(op2))); + double pow_result; + safe_pow(&pow_result, Z_DVAL_P(op1), (double)Z_LVAL_P(op2)); + ZVAL_DOUBLE(result, pow_result); return SUCCESS; } else { return FAILURE; @@ -1372,7 +1399,7 @@ ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *o return SUCCESS; } - ZEND_ASSERT(0 && "Operation must succeed"); + ZVAL_UNDEF(result); return FAILURE; } /* }}} */ diff --git a/ext/standard/tests/math/bug45712.phpt b/ext/standard/tests/math/bug45712.phpt index 23c3b6ddd3683..4872e385582ea 100644 --- a/ext/standard/tests/math/bug45712.phpt +++ b/ext/standard/tests/math/bug45712.phpt @@ -42,7 +42,7 @@ var_dump($inf==='abc'); var_dump($inf===$inf); ?> ---EXPECT-- +--EXPECTF-- float(NAN) bool(true) bool(false) @@ -57,6 +57,8 @@ bool(false) bool(false) bool(false) bool(false) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d float(INF) bool(true) bool(false) diff --git a/ext/standard/tests/math/is_finite_basic.phpt b/ext/standard/tests/math/is_finite_basic.phpt index bc044e69eacdc..21f4549ece141 100644 --- a/ext/standard/tests/math/is_finite_basic.phpt +++ b/ext/standard/tests/math/is_finite_basic.phpt @@ -2,26 +2,29 @@ Test is_finite() - basic function test is_finite() --FILE-- ---EXPECT-- +--EXPECTF-- + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) bool(true) bool(true) diff --git a/ext/standard/tests/math/is_infinite_basic.phpt b/ext/standard/tests/math/is_infinite_basic.phpt index 0c7b07611867b..599bdd635fba1 100644 --- a/ext/standard/tests/math/is_infinite_basic.phpt +++ b/ext/standard/tests/math/is_infinite_basic.phpt @@ -21,7 +21,8 @@ for ($i = 0; $i < count($values); $i++) { var_dump($res); } ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(false) bool(false) bool(false) diff --git a/ext/standard/tests/math/is_nan_basic.phpt b/ext/standard/tests/math/is_nan_basic.phpt index 65555e25ae95a..06c52c3e909bd 100644 --- a/ext/standard/tests/math/is_nan_basic.phpt +++ b/ext/standard/tests/math/is_nan_basic.phpt @@ -2,20 +2,21 @@ Test is_nan() - basic function test is_nan() --FILE-- ---EXPECT-- +--EXPECTF-- +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(false) bool(false) bool(false) diff --git a/ext/standard/tests/math/pow.phpt b/ext/standard/tests/math/pow.phpt index 4b515ad882daf..ac546af2683b3 100644 --- a/ext/standard/tests/math/pow.phpt +++ b/ext/standard/tests/math/pow.phpt @@ -143,7 +143,7 @@ var_dump(epsilon_equal( LONG_MAX*LONG_MAX , pow(LONG_MAX,2.0) )); var_dump(epsilon_equal( LONG_MIN*LONG_MIN , pow(LONG_MIN,2.0) )); ?> ---EXPECT-- +--EXPECTF-- 1,1,0,0 bool(true) bool(true) @@ -155,7 +155,11 @@ bool(true) bool(true) bool(true) bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) bool(true) bool(true) @@ -180,8 +184,14 @@ bool(true) bool(true) bool(true) bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) bool(true) bool(true) @@ -212,8 +222,14 @@ bool(true) bool(true) bool(true) bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) bool(true) bool(true) @@ -237,8 +253,14 @@ bool(true) bool(true) bool(true) bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) bool(true) bool(true) From fb6f6123130107a8dd4d91885daaf05a9d60dd6f Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Thu, 28 Dec 2023 00:53:22 +0100 Subject: [PATCH 02/18] Added tests pow() for divisionbyzero error --- .../tests/math/pow_divisionbyzero.phpt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 ext/standard/tests/math/pow_divisionbyzero.phpt diff --git a/ext/standard/tests/math/pow_divisionbyzero.phpt b/ext/standard/tests/math/pow_divisionbyzero.phpt new file mode 100644 index 0000000000000..eaf098ad1847a --- /dev/null +++ b/ext/standard/tests/math/pow_divisionbyzero.phpt @@ -0,0 +1,28 @@ +--TEST-- +pow() division by zero error +--FILE-- + +--EXPECTF-- +int(1) +int(1) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d +float(INF) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d +float(INF) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d +float(INF) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d +float(INF) From 5cd763660957d387a69919c46d892bd19fbea2dd Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Thu, 28 Dec 2023 00:59:27 +0100 Subject: [PATCH 03/18] Fix behaviour for division by zero --- Zend/zend_compile.c | 2 +- Zend/zend_operators.c | 2 +- ext/standard/tests/math/pow.phpt | 6 ------ ext/standard/tests/math/pow_divisionbyzero.phpt | 14 +++++++++++++- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 8547fa1160902..80bc173a432fc 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -8980,7 +8980,7 @@ ZEND_API bool zend_binary_op_produces_error(uint32_t opcode, const zval *op1, co /* Division by zero throws an error. */ return 1; } - if ((opcode == ZEND_POW) && zval_get_long(op1) == 0 && zval_get_long(op2) <= 0) { + if ((opcode == ZEND_POW) && zval_get_long(op1) == 0 && zval_get_long(op2) < 0) { /* 0 ** (<=0) throws a division by zero error. */ zend_error(E_DEPRECATED, "Power of base 0 and negative exponent is deprecated"); } diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index d2f4d62fa57db..f79708a7f5ebd 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1294,7 +1294,7 @@ static void ZEND_COLD zend_power_base_0_exponent_lt_eq_0_error(void) static zend_result safe_pow(double *result, double base, double exponent) { - if (base == 0.0 && exponent <= 0.0) { + if (base == 0.0 && exponent < 0.0) { zend_power_base_0_exponent_lt_eq_0_error(); } diff --git a/ext/standard/tests/math/pow.phpt b/ext/standard/tests/math/pow.phpt index ac546af2683b3..dfe4485cacf41 100644 --- a/ext/standard/tests/math/pow.phpt +++ b/ext/standard/tests/math/pow.phpt @@ -190,8 +190,6 @@ bool(true) Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) bool(true) bool(true) @@ -228,8 +226,6 @@ bool(true) Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) bool(true) bool(true) @@ -259,8 +255,6 @@ bool(true) Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) bool(true) bool(true) diff --git a/ext/standard/tests/math/pow_divisionbyzero.phpt b/ext/standard/tests/math/pow_divisionbyzero.phpt index eaf098ad1847a..0a3eed04107c6 100644 --- a/ext/standard/tests/math/pow_divisionbyzero.phpt +++ b/ext/standard/tests/math/pow_divisionbyzero.phpt @@ -5,15 +5,27 @@ pow() division by zero error var_dump(pow(0, -0)); var_dump(pow(0.0, -0)); +var_dump(pow(0, -0.0)); +var_dump(pow(0.0, -0.0)); var_dump(pow(0, -0.01)); var_dump(pow(0.0, -0.01)); var_dump(pow(0, -1)); var_dump(pow(0.0, -1)); +var_dump(pow(0, -1.1)); +var_dump(pow(0.0, -1.1)); ?> --EXPECTF-- int(1) -int(1) +float(1) +float(1) +float(1) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d +float(INF) + +Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d +float(INF) Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d float(INF) From b4dc60451ebdf7633cc5773efa007c6a050215ec Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Sat, 24 Feb 2024 23:29:54 +0100 Subject: [PATCH 04/18] Updated test runtime_compile_time_binary_operands.phpt --- .../runtime_compile_time_binary_operands.phpt | 728 +----------------- 1 file changed, 16 insertions(+), 712 deletions(-) diff --git a/Zend/tests/runtime_compile_time_binary_operands.phpt b/Zend/tests/runtime_compile_time_binary_operands.phpt index b1585c416e290..e8a6305afb022 100644 --- a/Zend/tests/runtime_compile_time_binary_operands.phpt +++ b/Zend/tests/runtime_compile_time_binary_operands.phpt @@ -8,6 +8,16 @@ if (getenv("SKIP_SLOW_TESTS")) die('skip slow test'); ?> --FILE-- getMessage()); $line .= "try { $compare; $error } catch (Error \$e) { if (\$e->getMessage() !== $msg) { $error } }"; } @@ -138,7 +148,7 @@ function prepareUnaryLine($op, $cmp, $operator) { try { $result = makeParam($cmp()); $line .= "if (" . ($result === "(NAN)" ? "!is_nan($compare)" : "$compare !== $result") . ") { $error }"; - } catch (Error $e) { + } catch (Throwable $e) { $msg = makeParam($e->getMessage()); $line .= "try { $compare; $error } catch (Error \$e) { if (\$e->getMessage() !== $msg) { $error } }"; } @@ -178,720 +188,14 @@ if($c === 0) { } else { echo "Failed: $f\n"; } + +echo "Deprecated: $deprecated\n"; ?> --CLEAN-- ---EXPECTF-- -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d - -Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d +--EXPECT-- Failed: 0 +Deprecated: 8532 From c4edbf6caea8b838ece0e1b594af1019bbc98572 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Sun, 17 Mar 2024 08:51:39 +0100 Subject: [PATCH 05/18] Updated test for operands --- .../runtime_compile_time_binary_operands.phpt | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/Zend/tests/runtime_compile_time_binary_operands.phpt b/Zend/tests/runtime_compile_time_binary_operands.phpt index e8a6305afb022..e18134283e83d 100644 --- a/Zend/tests/runtime_compile_time_binary_operands.phpt +++ b/Zend/tests/runtime_compile_time_binary_operands.phpt @@ -8,16 +8,7 @@ if (getenv("SKIP_SLOW_TESTS")) die('skip slow test'); ?> --FILE-- --CLEAN-- --EXPECT-- Failed: 0 -Deprecated: 8532 From b10a2b8ceb7e4f27fda22b36d70b5dde8eac10f9 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Thu, 25 Apr 2024 22:08:10 +0200 Subject: [PATCH 06/18] Reverted mistaken change --- Zend/zend_operators.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index f79708a7f5ebd..6d12483e9de27 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1399,7 +1399,7 @@ ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *o return SUCCESS; } - ZVAL_UNDEF(result); + ZEND_ASSERT(0 && "Operation must succeed"); return FAILURE; } /* }}} */ From a61998d9585dfa2e1fd9098bd95cbb043abb4500 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Thu, 25 Apr 2024 22:09:37 +0200 Subject: [PATCH 07/18] Return 1 instead of error in zend_compile.c --- Zend/zend_compile.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 80bc173a432fc..12fb1b14ce5a0 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7714,7 +7714,7 @@ static zend_string *zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_string *separator = zend_empty_string; zend_string *function = filename; char *parens = ""; - + if (CG(active_op_array) && CG(active_op_array)->function_name) { if (CG(active_op_array)->fn_flags & ZEND_ACC_CLOSURE) { /* If the parent function is a closure, don't redundantly @@ -8982,7 +8982,7 @@ ZEND_API bool zend_binary_op_produces_error(uint32_t opcode, const zval *op1, co } if ((opcode == ZEND_POW) && zval_get_long(op1) == 0 && zval_get_long(op2) < 0) { /* 0 ** (<=0) throws a division by zero error. */ - zend_error(E_DEPRECATED, "Power of base 0 and negative exponent is deprecated"); + return 1; } if ((opcode == ZEND_SL || opcode == ZEND_SR) && zval_get_long(op2) < 0) { /* Shift by negative number throws an error. */ From 06113c26abc86f8c3026a1fac9830ee141d2409f Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Tue, 7 May 2024 01:36:54 +0200 Subject: [PATCH 08/18] Added function fpow --- ext/standard/basic_functions.stub.php | 5 + ext/standard/basic_functions_arginfo.h | 6 +- ext/standard/math.c | 14 ++ ext/standard/tests/math/fpow.phpt | 303 +++++++++++++++++++++++++ 4 files changed, 327 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/math/fpow.phpt diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index dabb9fc1434a5..dd1f59c64c005 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -3274,6 +3274,11 @@ function fmod(float $num1, float $num2): float {} */ function fdiv(float $num1, float $num2): float {} +/** + * @compile-time-eval + */ +function fpow(float $num1, float $num2): float {} + /* microtime.c */ #ifdef HAVE_GETTIMEOFDAY diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 4556e10ada82b..b7071f5970729 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 1ef54fdebc6a206c4af3438130db0cd12a62c8b6 */ + * Stub hash: 5d8e13990ce18bebc9c7e6a0a9a7ad8b7593d35b */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -1732,6 +1732,8 @@ ZEND_END_ARG_INFO() #define arginfo_fdiv arginfo_fmod +#define arginfo_fpow arginfo_fmod + #if defined(HAVE_GETTIMEOFDAY) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_microtime, 0, 0, MAY_BE_STRING|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, as_float, _IS_BOOL, 0, "false") @@ -2789,6 +2791,7 @@ ZEND_FUNCTION(base_convert); ZEND_FUNCTION(number_format); ZEND_FUNCTION(fmod); ZEND_FUNCTION(fdiv); +ZEND_FUNCTION(fpow); #if defined(HAVE_GETTIMEOFDAY) ZEND_FUNCTION(microtime); #endif @@ -3428,6 +3431,7 @@ static const zend_function_entry ext_functions[] = { ZEND_RAW_FENTRY("number_format", zif_number_format, arginfo_number_format, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("fmod", zif_fmod, arginfo_fmod, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("fdiv", zif_fdiv, arginfo_fdiv, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) + ZEND_RAW_FENTRY("fpow", zif_fpow, arginfo_fpow, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) #if defined(HAVE_GETTIMEOFDAY) ZEND_FE(microtime, arginfo_microtime) #endif diff --git a/ext/standard/math.c b/ext/standard/math.c index f5996adcfb152..666cdc4d5cf02 100644 --- a/ext/standard/math.c +++ b/ext/standard/math.c @@ -1389,6 +1389,20 @@ PHP_FUNCTION(fdiv) } /* }}} */ +/* {{{ Perform floating-point exponentiation with IEEE-754 semantics. */ +PHP_FUNCTION(fpow) +{ + double dividend, divisor; + + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_DOUBLE(dividend) + Z_PARAM_DOUBLE(divisor) + ZEND_PARSE_PARAMETERS_END(); + + RETURN_DOUBLE(pow(dividend, divisor)); +} +/* }}} */ + /* {{{ Returns the integer quotient of the division of dividend by divisor */ PHP_FUNCTION(intdiv) { diff --git a/ext/standard/tests/math/fpow.phpt b/ext/standard/tests/math/fpow.phpt new file mode 100644 index 0000000000000..55334b4c70c1b --- /dev/null +++ b/ext/standard/tests/math/fpow.phpt @@ -0,0 +1,303 @@ +--TEST-- +fpow() function +--FILE-- + +--EXPECT-- + 0 ** 0 = 1 + 0 ** 1 = 0 + 0 ** -1 = INF + 0 ** 1 = 0 + 0 ** -1 = INF + 0 ** 2 = 0 + 0 ** -2 = INF + 0 ** 2.1 = 0 + 0 ** -2.1 = INF + 0 ** 0.1 = 0 + 0 ** -0.1 = INF + 0 ** 0 = 1 + 0 ** 10 = 0 + 0 ** -10 = INF + 0 ** INF = 0 + 0 ** -INF = INF + 0 ** NAN = NAN + 1 ** 0 = 1 + 1 ** 1 = 1 + 1 ** -1 = 1 + 1 ** 1 = 1 + 1 ** -1 = 1 + 1 ** 2 = 1 + 1 ** -2 = 1 + 1 ** 2.1 = 1 + 1 ** -2.1 = 1 + 1 ** 0.1 = 1 + 1 ** -0.1 = 1 + 1 ** 0 = 1 + 1 ** 10 = 1 + 1 ** -10 = 1 + 1 ** INF = 1 + 1 ** -INF = 1 + 1 ** NAN = 1 + -1 ** 0 = 1 + -1 ** 1 = -1 + -1 ** -1 = -1 + -1 ** 1 = -1 + -1 ** -1 = -1 + -1 ** 2 = 1 + -1 ** -2 = 1 + -1 ** 2.1 = NAN + -1 ** -2.1 = NAN + -1 ** 0.1 = NAN + -1 ** -0.1 = NAN + -1 ** 0 = 1 + -1 ** 10 = 1 + -1 ** -10 = 1 + -1 ** INF = 1 + -1 ** -INF = 1 + -1 ** NAN = NAN + 1 ** 0 = 1 + 1 ** 1 = 1 + 1 ** -1 = 1 + 1 ** 1 = 1 + 1 ** -1 = 1 + 1 ** 2 = 1 + 1 ** -2 = 1 + 1 ** 2.1 = 1 + 1 ** -2.1 = 1 + 1 ** 0.1 = 1 + 1 ** -0.1 = 1 + 1 ** 0 = 1 + 1 ** 10 = 1 + 1 ** -10 = 1 + 1 ** INF = 1 + 1 ** -INF = 1 + 1 ** NAN = 1 + -1 ** 0 = 1 + -1 ** 1 = -1 + -1 ** -1 = -1 + -1 ** 1 = -1 + -1 ** -1 = -1 + -1 ** 2 = 1 + -1 ** -2 = 1 + -1 ** 2.1 = NAN + -1 ** -2.1 = NAN + -1 ** 0.1 = NAN + -1 ** -0.1 = NAN + -1 ** 0 = 1 + -1 ** 10 = 1 + -1 ** -10 = 1 + -1 ** INF = 1 + -1 ** -INF = 1 + -1 ** NAN = NAN + 2 ** 0 = 1 + 2 ** 1 = 2 + 2 ** -1 = 0.5 + 2 ** 1 = 2 + 2 ** -1 = 0.5 + 2 ** 2 = 4 + 2 ** -2 = 0.25 + 2 ** 2.1 = 4.2870938501452 + 2 ** -2.1 = 0.2332582478842 + 2 ** 0.1 = 1.0717734625363 + 2 ** -0.1 = 0.93303299153681 + 2 ** 0 = 1 + 2 ** 10 = 1024 + 2 ** -10 = 0.0009765625 + 2 ** INF = INF + 2 ** -INF = 0 + 2 ** NAN = NAN + -2 ** 0 = 1 + -2 ** 1 = -2 + -2 ** -1 = -0.5 + -2 ** 1 = -2 + -2 ** -1 = -0.5 + -2 ** 2 = 4 + -2 ** -2 = 0.25 + -2 ** 2.1 = NAN + -2 ** -2.1 = NAN + -2 ** 0.1 = NAN + -2 ** -0.1 = NAN + -2 ** 0 = 1 + -2 ** 10 = 1024 + -2 ** -10 = 0.0009765625 + -2 ** INF = INF + -2 ** -INF = 0 + -2 ** NAN = NAN + 2.1 ** 0 = 1 + 2.1 ** 1 = 2.1 + 2.1 ** -1 = 0.47619047619048 + 2.1 ** 1 = 2.1 + 2.1 ** -1 = 0.47619047619048 + 2.1 ** 2 = 4.41 + 2.1 ** -2 = 0.22675736961451 + 2.1 ** 2.1 = 4.7496380917422 + 2.1 ** -2.1 = 0.21054235726688 + 2.1 ** 0.1 = 1.0770154403044 + 2.1 ** -0.1 = 0.92849179554696 + 2.1 ** 0 = 1 + 2.1 ** 10 = 1667.9880978201 + 2.1 ** -10 = 0.0005995246616609 + 2.1 ** INF = INF + 2.1 ** -INF = 0 + 2.1 ** NAN = NAN +-2.1 ** 0 = 1 +-2.1 ** 1 = -2.1 +-2.1 ** -1 = -0.47619047619048 +-2.1 ** 1 = -2.1 +-2.1 ** -1 = -0.47619047619048 +-2.1 ** 2 = 4.41 +-2.1 ** -2 = 0.22675736961451 +-2.1 ** 2.1 = NAN +-2.1 ** -2.1 = NAN +-2.1 ** 0.1 = NAN +-2.1 ** -0.1 = NAN +-2.1 ** 0 = 1 +-2.1 ** 10 = 1667.9880978201 +-2.1 ** -10 = 0.0005995246616609 +-2.1 ** INF = INF +-2.1 ** -INF = 0 +-2.1 ** NAN = NAN + 0.1 ** 0 = 1 + 0.1 ** 1 = 0.1 + 0.1 ** -1 = 10 + 0.1 ** 1 = 0.1 + 0.1 ** -1 = 10 + 0.1 ** 2 = 0.01 + 0.1 ** -2 = 100 + 0.1 ** 2.1 = 0.0079432823472428 + 0.1 ** -2.1 = 125.89254117942 + 0.1 ** 0.1 = 0.79432823472428 + 0.1 ** -0.1 = 1.2589254117942 + 0.1 ** 0 = 1 + 0.1 ** 10 = 1.0E-10 + 0.1 ** -10 = 10000000000 + 0.1 ** INF = 0 + 0.1 ** -INF = INF + 0.1 ** NAN = NAN +-0.1 ** 0 = 1 +-0.1 ** 1 = -0.1 +-0.1 ** -1 = -10 +-0.1 ** 1 = -0.1 +-0.1 ** -1 = -10 +-0.1 ** 2 = 0.01 +-0.1 ** -2 = 100 +-0.1 ** 2.1 = NAN +-0.1 ** -2.1 = NAN +-0.1 ** 0.1 = NAN +-0.1 ** -0.1 = NAN +-0.1 ** 0 = 1 +-0.1 ** 10 = 1.0E-10 +-0.1 ** -10 = 10000000000 +-0.1 ** INF = 0 +-0.1 ** -INF = INF +-0.1 ** NAN = NAN + 0 ** 0 = 1 + 0 ** 1 = 0 + 0 ** -1 = INF + 0 ** 1 = 0 + 0 ** -1 = INF + 0 ** 2 = 0 + 0 ** -2 = INF + 0 ** 2.1 = 0 + 0 ** -2.1 = INF + 0 ** 0.1 = 0 + 0 ** -0.1 = INF + 0 ** 0 = 1 + 0 ** 10 = 0 + 0 ** -10 = INF + 0 ** INF = 0 + 0 ** -INF = INF + 0 ** NAN = NAN + 10 ** 0 = 1 + 10 ** 1 = 10 + 10 ** -1 = 0.1 + 10 ** 1 = 10 + 10 ** -1 = 0.1 + 10 ** 2 = 100 + 10 ** -2 = 0.01 + 10 ** 2.1 = 125.89254117942 + 10 ** -2.1 = 0.0079432823472428 + 10 ** 0.1 = 1.2589254117942 + 10 ** -0.1 = 0.79432823472428 + 10 ** 0 = 1 + 10 ** 10 = 10000000000 + 10 ** -10 = 1.0E-10 + 10 ** INF = INF + 10 ** -INF = 0 + 10 ** NAN = NAN + -10 ** 0 = 1 + -10 ** 1 = -10 + -10 ** -1 = -0.1 + -10 ** 1 = -10 + -10 ** -1 = -0.1 + -10 ** 2 = 100 + -10 ** -2 = 0.01 + -10 ** 2.1 = NAN + -10 ** -2.1 = NAN + -10 ** 0.1 = NAN + -10 ** -0.1 = NAN + -10 ** 0 = 1 + -10 ** 10 = 10000000000 + -10 ** -10 = 1.0E-10 + -10 ** INF = INF + -10 ** -INF = 0 + -10 ** NAN = NAN + INF ** 0 = 1 + INF ** 1 = INF + INF ** -1 = 0 + INF ** 1 = INF + INF ** -1 = 0 + INF ** 2 = INF + INF ** -2 = 0 + INF ** 2.1 = INF + INF ** -2.1 = 0 + INF ** 0.1 = INF + INF ** -0.1 = 0 + INF ** 0 = 1 + INF ** 10 = INF + INF ** -10 = 0 + INF ** INF = INF + INF ** -INF = 0 + INF ** NAN = NAN +-INF ** 0 = 1 +-INF ** 1 = -INF +-INF ** -1 = -0 +-INF ** 1 = -INF +-INF ** -1 = -0 +-INF ** 2 = INF +-INF ** -2 = 0 +-INF ** 2.1 = INF +-INF ** -2.1 = 0 +-INF ** 0.1 = INF +-INF ** -0.1 = 0 +-INF ** 0 = 1 +-INF ** 10 = INF +-INF ** -10 = 0 +-INF ** INF = INF +-INF ** -INF = 0 +-INF ** NAN = NAN + NAN ** 0 = 1 + NAN ** 1 = NAN + NAN ** -1 = NAN + NAN ** 1 = NAN + NAN ** -1 = NAN + NAN ** 2 = NAN + NAN ** -2 = NAN + NAN ** 2.1 = NAN + NAN ** -2.1 = NAN + NAN ** 0.1 = NAN + NAN ** -0.1 = NAN + NAN ** 0 = 1 + NAN ** 10 = NAN + NAN ** -10 = NAN + NAN ** INF = NAN + NAN ** -INF = NAN + NAN ** NAN = NAN From 14bcabe873e50c0c4c343f590a12fb4bf8f15d0f Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Tue, 7 May 2024 18:51:22 +0200 Subject: [PATCH 09/18] Adjusted comment and indentation --- Zend/zend_compile.c | 2 +- Zend/zend_operators.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 12fb1b14ce5a0..465c2420ad919 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -8981,7 +8981,7 @@ ZEND_API bool zend_binary_op_produces_error(uint32_t opcode, const zval *op1, co return 1; } if ((opcode == ZEND_POW) && zval_get_long(op1) == 0 && zval_get_long(op2) < 0) { - /* 0 ** (<=0) throws a division by zero error. */ + /* 0 ** (<0) throws a division by zero error. */ return 1; } if ((opcode == ZEND_SL || opcode == ZEND_SR) && zval_get_long(op2) < 0) { diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 6d12483e9de27..d118f7fc89d7b 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1399,7 +1399,7 @@ ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *o return SUCCESS; } - ZEND_ASSERT(0 && "Operation must succeed"); + ZEND_ASSERT(0 && "Operation must succeed"); return FAILURE; } /* }}} */ From 495de3c3a98c7c89b0a6b437fecd1791fb04e7a3 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Tue, 7 May 2024 18:52:10 +0200 Subject: [PATCH 10/18] Wrapped condition in UNEXPECTED --- Zend/zend_operators.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index d118f7fc89d7b..fc73568cf7d5c 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1294,7 +1294,7 @@ static void ZEND_COLD zend_power_base_0_exponent_lt_eq_0_error(void) static zend_result safe_pow(double *result, double base, double exponent) { - if (base == 0.0 && exponent < 0.0) { + if (UNEXPECTED(base == 0.0 && exponent < 0.0)) { zend_power_base_0_exponent_lt_eq_0_error(); } From b82299604dd35ea330d3436c8245c69ef4923536 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Tue, 7 May 2024 18:56:21 +0200 Subject: [PATCH 11/18] Improved name of variables in fpow definition --- ext/standard/math.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/math.c b/ext/standard/math.c index 666cdc4d5cf02..b546329259d8b 100644 --- a/ext/standard/math.c +++ b/ext/standard/math.c @@ -1392,14 +1392,14 @@ PHP_FUNCTION(fdiv) /* {{{ Perform floating-point exponentiation with IEEE-754 semantics. */ PHP_FUNCTION(fpow) { - double dividend, divisor; + double base, exponent; ZEND_PARSE_PARAMETERS_START(2, 2) - Z_PARAM_DOUBLE(dividend) - Z_PARAM_DOUBLE(divisor) + Z_PARAM_DOUBLE(base) + Z_PARAM_DOUBLE(exponent) ZEND_PARSE_PARAMETERS_END(); - RETURN_DOUBLE(pow(dividend, divisor)); + RETURN_DOUBLE(pow(base, exponent)); } /* }}} */ From d19abdfa7bc6151627e8736aa480f945337f232b Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Tue, 7 May 2024 19:05:23 +0200 Subject: [PATCH 12/18] Beautify test case and added case -0 --- ext/standard/tests/math/fpow.phpt | 67 +++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/ext/standard/tests/math/fpow.phpt b/ext/standard/tests/math/fpow.phpt index 55334b4c70c1b..6518ef10dbe8a 100644 --- a/ext/standard/tests/math/fpow.phpt +++ b/ext/standard/tests/math/fpow.phpt @@ -3,11 +3,35 @@ fpow() function --FILE-- @@ -24,6 +48,7 @@ foreach($numbers as $base) { 0 ** 0.1 = 0 0 ** -0.1 = INF 0 ** 0 = 1 + 0 ** -0 = 1 0 ** 10 = 0 0 ** -10 = INF 0 ** INF = 0 @@ -41,6 +66,7 @@ foreach($numbers as $base) { 1 ** 0.1 = 1 1 ** -0.1 = 1 1 ** 0 = 1 + 1 ** -0 = 1 1 ** 10 = 1 1 ** -10 = 1 1 ** INF = 1 @@ -58,6 +84,7 @@ foreach($numbers as $base) { -1 ** 0.1 = NAN -1 ** -0.1 = NAN -1 ** 0 = 1 + -1 ** -0 = 1 -1 ** 10 = 1 -1 ** -10 = 1 -1 ** INF = 1 @@ -75,6 +102,7 @@ foreach($numbers as $base) { 1 ** 0.1 = 1 1 ** -0.1 = 1 1 ** 0 = 1 + 1 ** -0 = 1 1 ** 10 = 1 1 ** -10 = 1 1 ** INF = 1 @@ -92,6 +120,7 @@ foreach($numbers as $base) { -1 ** 0.1 = NAN -1 ** -0.1 = NAN -1 ** 0 = 1 + -1 ** -0 = 1 -1 ** 10 = 1 -1 ** -10 = 1 -1 ** INF = 1 @@ -109,6 +138,7 @@ foreach($numbers as $base) { 2 ** 0.1 = 1.0717734625363 2 ** -0.1 = 0.93303299153681 2 ** 0 = 1 + 2 ** -0 = 1 2 ** 10 = 1024 2 ** -10 = 0.0009765625 2 ** INF = INF @@ -126,6 +156,7 @@ foreach($numbers as $base) { -2 ** 0.1 = NAN -2 ** -0.1 = NAN -2 ** 0 = 1 + -2 ** -0 = 1 -2 ** 10 = 1024 -2 ** -10 = 0.0009765625 -2 ** INF = INF @@ -143,6 +174,7 @@ foreach($numbers as $base) { 2.1 ** 0.1 = 1.0770154403044 2.1 ** -0.1 = 0.92849179554696 2.1 ** 0 = 1 + 2.1 ** -0 = 1 2.1 ** 10 = 1667.9880978201 2.1 ** -10 = 0.0005995246616609 2.1 ** INF = INF @@ -160,6 +192,7 @@ foreach($numbers as $base) { -2.1 ** 0.1 = NAN -2.1 ** -0.1 = NAN -2.1 ** 0 = 1 +-2.1 ** -0 = 1 -2.1 ** 10 = 1667.9880978201 -2.1 ** -10 = 0.0005995246616609 -2.1 ** INF = INF @@ -177,6 +210,7 @@ foreach($numbers as $base) { 0.1 ** 0.1 = 0.79432823472428 0.1 ** -0.1 = 1.2589254117942 0.1 ** 0 = 1 + 0.1 ** -0 = 1 0.1 ** 10 = 1.0E-10 0.1 ** -10 = 10000000000 0.1 ** INF = 0 @@ -194,6 +228,7 @@ foreach($numbers as $base) { -0.1 ** 0.1 = NAN -0.1 ** -0.1 = NAN -0.1 ** 0 = 1 +-0.1 ** -0 = 1 -0.1 ** 10 = 1.0E-10 -0.1 ** -10 = 10000000000 -0.1 ** INF = 0 @@ -211,11 +246,30 @@ foreach($numbers as $base) { 0 ** 0.1 = 0 0 ** -0.1 = INF 0 ** 0 = 1 + 0 ** -0 = 1 0 ** 10 = 0 0 ** -10 = INF 0 ** INF = 0 0 ** -INF = INF 0 ** NAN = NAN + -0 ** 0 = 1 + -0 ** 1 = 0 + -0 ** -1 = INF + -0 ** 1 = 0 + -0 ** -1 = INF + -0 ** 2 = 0 + -0 ** -2 = INF + -0 ** 2.1 = 0 + -0 ** -2.1 = INF + -0 ** 0.1 = 0 + -0 ** -0.1 = INF + -0 ** 0 = 1 + -0 ** -0 = 1 + -0 ** 10 = -0 + -0 ** -10 = -INF + -0 ** INF = -0 + -0 ** -INF = -INF + -0 ** NAN = NAN 10 ** 0 = 1 10 ** 1 = 10 10 ** -1 = 0.1 @@ -228,6 +282,7 @@ foreach($numbers as $base) { 10 ** 0.1 = 1.2589254117942 10 ** -0.1 = 0.79432823472428 10 ** 0 = 1 + 10 ** -0 = 1 10 ** 10 = 10000000000 10 ** -10 = 1.0E-10 10 ** INF = INF @@ -245,6 +300,7 @@ foreach($numbers as $base) { -10 ** 0.1 = NAN -10 ** -0.1 = NAN -10 ** 0 = 1 + -10 ** -0 = 1 -10 ** 10 = 10000000000 -10 ** -10 = 1.0E-10 -10 ** INF = INF @@ -262,6 +318,7 @@ foreach($numbers as $base) { INF ** 0.1 = INF INF ** -0.1 = 0 INF ** 0 = 1 + INF ** -0 = 1 INF ** 10 = INF INF ** -10 = 0 INF ** INF = INF @@ -279,6 +336,7 @@ foreach($numbers as $base) { -INF ** 0.1 = INF -INF ** -0.1 = 0 -INF ** 0 = 1 +-INF ** -0 = 1 -INF ** 10 = INF -INF ** -10 = 0 -INF ** INF = INF @@ -296,6 +354,7 @@ foreach($numbers as $base) { NAN ** 0.1 = NAN NAN ** -0.1 = NAN NAN ** 0 = 1 + NAN ** -0 = 1 NAN ** 10 = NAN NAN ** -10 = NAN NAN ** INF = NAN From fc4cf9f890bd40ffd0fc9106e9b32070f7e91b37 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Tue, 7 May 2024 19:43:36 +0200 Subject: [PATCH 13/18] Fixed test case fpow.phpt --- ext/standard/tests/math/fpow.phpt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/standard/tests/math/fpow.phpt b/ext/standard/tests/math/fpow.phpt index 6518ef10dbe8a..3f3c64862e81e 100644 --- a/ext/standard/tests/math/fpow.phpt +++ b/ext/standard/tests/math/fpow.phpt @@ -253,10 +253,10 @@ foreach ($numbers as $base) { 0 ** -INF = INF 0 ** NAN = NAN -0 ** 0 = 1 - -0 ** 1 = 0 - -0 ** -1 = INF - -0 ** 1 = 0 - -0 ** -1 = INF + -0 ** 1 = -0 + -0 ** -1 = -INF + -0 ** 1 = -0 + -0 ** -1 = -INF -0 ** 2 = 0 -0 ** -2 = INF -0 ** 2.1 = 0 @@ -265,10 +265,10 @@ foreach ($numbers as $base) { -0 ** -0.1 = INF -0 ** 0 = 1 -0 ** -0 = 1 - -0 ** 10 = -0 - -0 ** -10 = -INF - -0 ** INF = -0 - -0 ** -INF = -INF + -0 ** 10 = 0 + -0 ** -10 = INF + -0 ** INF = 0 + -0 ** -INF = INF -0 ** NAN = NAN 10 ** 0 = 1 10 ** 1 = 10 From 0292f9bdb911a10a3b1901f1280b4f04ba044f99 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Tue, 7 May 2024 22:41:23 +0200 Subject: [PATCH 14/18] Renamed function zend_power_base_0_exponent_lt_eq_0_error --- Zend/zend_operators.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index fc73568cf7d5c..f7b03bd40479d 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1287,7 +1287,7 @@ ZEND_API zend_result ZEND_FASTCALL mul_function(zval *result, zval *op1, zval *o } /* }}} */ -static void ZEND_COLD zend_power_base_0_exponent_lt_eq_0_error(void) +static void ZEND_COLD zend_power_base_0_exponent_lt_0_error(void) { zend_error(E_DEPRECATED, "Power of base 0 and negative exponent is deprecated"); } @@ -1295,7 +1295,7 @@ static void ZEND_COLD zend_power_base_0_exponent_lt_eq_0_error(void) static zend_result safe_pow(double *result, double base, double exponent) { if (UNEXPECTED(base == 0.0 && exponent < 0.0)) { - zend_power_base_0_exponent_lt_eq_0_error(); + zend_power_base_0_exponent_lt_0_error(); } *result = pow(base, exponent); From 20966858ac5efd9fcb9e61c6e657d66520a0c8e6 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Wed, 8 May 2024 23:52:13 +0200 Subject: [PATCH 15/18] Changed the return type of safe_pow --- Zend/zend_operators.c | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index f7b03bd40479d..f825e63ff699b 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1292,14 +1292,13 @@ static void ZEND_COLD zend_power_base_0_exponent_lt_0_error(void) zend_error(E_DEPRECATED, "Power of base 0 and negative exponent is deprecated"); } -static zend_result safe_pow(double *result, double base, double exponent) +static double safe_pow(double base, double exponent) { if (UNEXPECTED(base == 0.0 && exponent < 0.0)) { zend_power_base_0_exponent_lt_0_error(); } - *result = pow(base, exponent); - return SUCCESS; + return pow(base, exponent); } static zend_result ZEND_FASTCALL pow_function_base(zval *result, zval *op1, zval *op2) /* {{{ */ @@ -1326,18 +1325,14 @@ static zend_result ZEND_FASTCALL pow_function_base(zval *result, zval *op1, zval --i; ZEND_SIGNED_MULTIPLY_LONG(l1, l2, l1, dval, overflow); if (overflow) { - double pow_result; - safe_pow(&pow_result, l2, i); - ZVAL_DOUBLE(result, dval * pow_result); + ZVAL_DOUBLE(result, dval * safe_pow(l2, i)); return SUCCESS; } } else { i /= 2; ZEND_SIGNED_MULTIPLY_LONG(l2, l2, l2, dval, overflow); if (overflow) { - double pow_result; - safe_pow(&pow_result, dval, i); - ZVAL_DOUBLE(result, (double)l1 * pow_result); + ZVAL_DOUBLE(result, (double)l1 * safe_pow(dval, i)); return SUCCESS; } } @@ -1345,25 +1340,17 @@ static zend_result ZEND_FASTCALL pow_function_base(zval *result, zval *op1, zval /* i == 0 */ ZVAL_LONG(result, l1); } else { - double pow_result; - safe_pow(&pow_result, (double)Z_LVAL_P(op1), (double)Z_LVAL_P(op2)); - ZVAL_DOUBLE(result, pow_result); + ZVAL_DOUBLE(result, safe_pow((double)Z_LVAL_P(op1), (double)Z_LVAL_P(op2))); } return SUCCESS; } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) { - double pow_result; - safe_pow(&pow_result, Z_DVAL_P(op1), Z_DVAL_P(op2)); - ZVAL_DOUBLE(result, pow_result); + ZVAL_DOUBLE(result, safe_pow(Z_DVAL_P(op1), Z_DVAL_P(op2))); return SUCCESS; } else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) { - double pow_result; - safe_pow(&pow_result, (double)Z_LVAL_P(op1), Z_DVAL_P(op2)); - ZVAL_DOUBLE(result, pow_result); + ZVAL_DOUBLE(result, safe_pow((double)Z_LVAL_P(op1), Z_DVAL_P(op2))); return SUCCESS; } else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) { - double pow_result; - safe_pow(&pow_result, Z_DVAL_P(op1), (double)Z_LVAL_P(op2)); - ZVAL_DOUBLE(result, pow_result); + ZVAL_DOUBLE(result, safe_pow(Z_DVAL_P(op1), (double)Z_LVAL_P(op2))); return SUCCESS; } else { return FAILURE; From a3d1fdbc2763249e2678ae8678e3e4be04d7ebc3 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Tue, 14 May 2024 00:40:10 +0200 Subject: [PATCH 16/18] Removed whitespace in is_finite_basic.phpt --- ext/standard/tests/math/is_finite_basic.phpt | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/standard/tests/math/is_finite_basic.phpt b/ext/standard/tests/math/is_finite_basic.phpt index 21f4549ece141..08bbadbd3babc 100644 --- a/ext/standard/tests/math/is_finite_basic.phpt +++ b/ext/standard/tests/math/is_finite_basic.phpt @@ -23,7 +23,6 @@ for ($i = 0; $i < count($values); $i++) { } ?> --EXPECTF-- - Deprecated: Power of base 0 and negative exponent is deprecated in %s on line %d bool(true) bool(true) From 5b4066bcac00be08a6d410bf6c8ec3fdea4d09fb Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Tue, 14 May 2024 00:52:22 +0200 Subject: [PATCH 17/18] [skip ci] Added entry to NEWS --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 8961c76eb0fce..87981d1ed3a34 100644 --- a/NEWS +++ b/NEWS @@ -265,6 +265,7 @@ PHP NEWS http_clear_last_response_headers() that allows retrieving the same content as the magic $http_response_header variable. . Add php_base64_encode_ex() API. (Remi) + . [RFC] Deprecated raising zero to the power of negative number. (Jorg Sowa) - XML: . Added XML_OPTION_PARSE_HUGE parser option. (nielsdos) From c250d1b370d957ddd285f34b37180951348b0201 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Sat, 18 May 2024 23:14:37 +0200 Subject: [PATCH 18/18] Updated NEWS and UPGRADING --- NEWS | 2 +- UPGRADING | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 87981d1ed3a34..568b1e85a49bd 100644 --- a/NEWS +++ b/NEWS @@ -265,7 +265,7 @@ PHP NEWS http_clear_last_response_headers() that allows retrieving the same content as the magic $http_response_header variable. . Add php_base64_encode_ex() API. (Remi) - . [RFC] Deprecated raising zero to the power of negative number. (Jorg Sowa) + . Implemented "Raising zero to the power of negative number" RFC (Jorg Sowa) - XML: . Added XML_OPTION_PARSE_HUGE parser option. (nielsdos) diff --git a/UPGRADING b/UPGRADING index d2b21942d7a38..dd530b8cba085 100644 --- a/UPGRADING +++ b/UPGRADING @@ -352,6 +352,7 @@ PHP 8.4 UPGRADE NOTES - Standard: . Calling stream_context_set_option() with 2 arguments is deprecated. Use stream_context_set_options() instead. + . Raising zero to the power of negative number is deprecated. ======================================== 5. Changed Functions @@ -524,6 +525,7 @@ PHP 8.4 UPGRADE NOTES . Added the http_get_last_response_headers() and http_clear_last_response_headers() that allows retrieving the same content as the magic $http_response_header variable. + . Added function fpow() following rules of IEEE 754. - XSL: . Added XSLTProcessor::registerPhpFunctionNS().