Skip to content

Commit 77aefe1

Browse files
committed
ValueError for even root of negative number
1 parent 010f4e0 commit 77aefe1

File tree

5 files changed

+22
-19
lines changed

5 files changed

+22
-19
lines changed

ext/gmp/gmp.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,10 +1394,9 @@ ZEND_FUNCTION(gmp_root)
13941394
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1);
13951395

13961396
if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) {
1397-
// Todo promote to ValueError?
1398-
php_error_docref(NULL, E_WARNING, "Can't take even root of negative number");
1397+
zend_argument_value_error(2, "must be odd if argument #1 ($a) is negative");
13991398
FREE_GMP_TEMP(temp_a);
1400-
RETURN_FALSE;
1399+
RETURN_THROWS();
14011400
}
14021401

14031402
INIT_GMP_RETVAL(gmpnum_result);
@@ -1427,10 +1426,9 @@ ZEND_FUNCTION(gmp_rootrem)
14271426
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, 1);
14281427

14291428
if (nth % 2 == 0 && mpz_sgn(gmpnum_a) < 0) {
1430-
// Todo promote to ValueError?
1431-
php_error_docref(NULL, E_WARNING, "Can't take even root of negative number");
1429+
zend_argument_value_error(2, "must be odd if argument #1 ($a) is negative");
14321430
FREE_GMP_TEMP(temp_a);
1433-
RETURN_FALSE;
1431+
RETURN_THROWS();
14341432
}
14351433

14361434
gmp_create(&result1, &gmpnum_result1);

ext/gmp/gmp.stub.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,10 @@ function gmp_sqrt($a): GMP {}
9191
function gmp_sqrtrem($a): array {}
9292

9393
/** @param GMP|int|bool|string $a */
94-
function gmp_root($a, int $nth): GMP|false {}
94+
function gmp_root($a, int $nth): GMP {}
9595

9696
/** @param GMP|int|bool|string $a */
97-
function gmp_rootrem($a, int $nth): array|false {}
97+
function gmp_rootrem($a, int $nth): array {}
9898

9999
/** @param GMP|int|bool|string $base */
100100
function gmp_pow($base, int $exp): GMP {}

ext/gmp/gmp_arginfo.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 3094dae32430922d11c7bdb3a4da0e2c0b47ac7e */
2+
* Stub hash: a07c755ba28151df412a32411cd25f75eeea7fe0 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_init, 0, 1, GMP, 0)
55
ZEND_ARG_INFO(0, number)
@@ -70,12 +70,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_sqrtrem, 0, 1, IS_ARRAY, 0)
7070
ZEND_ARG_INFO(0, a)
7171
ZEND_END_ARG_INFO()
7272

73-
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_gmp_root, 0, 2, GMP, MAY_BE_FALSE)
73+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_gmp_root, 0, 2, GMP, 0)
7474
ZEND_ARG_INFO(0, a)
7575
ZEND_ARG_TYPE_INFO(0, nth, IS_LONG, 0)
7676
ZEND_END_ARG_INFO()
7777

78-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gmp_rootrem, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
78+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gmp_rootrem, 0, 2, IS_ARRAY, 0)
7979
ZEND_ARG_INFO(0, a)
8080
ZEND_ARG_TYPE_INFO(0, nth, IS_LONG, 0)
8181
ZEND_END_ARG_INFO()

ext/gmp/tests/gmp_remroot.phpt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ var_dump(gmp_rootrem(-100, 3));
1111

1212
var_dump(gmp_rootrem(1000, 4));
1313
var_dump(gmp_rootrem(100, 4));
14-
var_dump(gmp_rootrem(-100, 4));
14+
try {
15+
var_dump(gmp_rootrem(-100, 4));
16+
} catch (\ValueError $e) {
17+
echo $e->getMessage() . \PHP_EOL;
18+
}
1519

1620
var_dump(gmp_rootrem(0, 3));
1721

@@ -88,9 +92,7 @@ array(2) {
8892
string(2) "19"
8993
}
9094
}
91-
92-
Warning: gmp_rootrem(): Can't take even root of negative number in %s on line %d
93-
bool(false)
95+
gmp_rootrem(): Argument #2 ($nth) must be odd if argument #1 ($a) is negative
9496
array(2) {
9597
[0]=>
9698
object(GMP)#%d (1) {

ext/gmp/tests/gmp_root.phpt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ var_dump(gmp_root(-100, 3));
1111

1212
var_dump(gmp_root(1000, 4));
1313
var_dump(gmp_root(100, 4));
14-
var_dump(gmp_root(-100, 4));
14+
15+
try {
16+
var_dump(gmp_root(-100, 4));
17+
} catch (\ValueError $e) {
18+
echo $e->getMessage() . \PHP_EOL;
19+
}
1520

1621
var_dump(gmp_root(0, 3));
1722

@@ -48,9 +53,7 @@ object(GMP)#%d (1) {
4853
["num"]=>
4954
string(1) "3"
5055
}
51-
52-
Warning: gmp_root(): Can't take even root of negative number in %s on line %d
53-
bool(false)
56+
gmp_root(): Argument #2 ($nth) must be odd if argument #1 ($a) is negative
5457
object(GMP)#%d (1) {
5558
["num"]=>
5659
string(1) "0"

0 commit comments

Comments
 (0)