Skip to content

Commit 32b04c4

Browse files
committed
Add warning for negative steps
1 parent f0c4b16 commit 32b04c4

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

ext/standard/array.c

+8
Original file line numberDiff line numberDiff line change
@@ -2751,6 +2751,10 @@ PHP_FUNCTION(range)
27512751

27522752
/* We only want positive step values. */
27532753
if (step_double < 0.0) {
2754+
php_error_docref(NULL, E_WARNING, "Argument #3 ($step) must be greater than 0, $step multiplied by -1");
2755+
if (UNEXPECTED(EG(exception))) {
2756+
RETURN_THROWS();
2757+
}
27542758
step_double *= -1;
27552759
}
27562760
step = zend_dval_to_lval(step_double);
@@ -2761,6 +2765,10 @@ PHP_FUNCTION(range)
27612765
step = Z_LVAL_P(user_step);
27622766
/* We only want positive step values. */
27632767
if (step < 0) {
2768+
php_error_docref(NULL, E_WARNING, "Argument #3 ($step) must be greater than 0, $step multiplied by -1");
2769+
if (UNEXPECTED(EG(exception))) {
2770+
RETURN_THROWS();
2771+
}
27642772
step *= -1;
27652773
}
27662774
step_double = (double) step;

ext/standard/tests/array/range/range_step_errors.phpt

+62-1
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,30 @@ try {
8787
echo $e->getMessage(), "\n";
8888
}
8989

90+
echo "Step must not be negative\n";
91+
try {
92+
var_dump(range('a', 'c', -1));
93+
} catch (\ValueError $e) {
94+
echo $e->getMessage(), "\n";
95+
}
96+
try {
97+
var_dump(range(1, 3, -1));
98+
} catch (\ValueError $e) {
99+
echo $e->getMessage(), "\n";
100+
}
101+
try {
102+
var_dump(range('a', 'c', -1));
103+
} catch (\ValueError $e) {
104+
echo $e->getMessage(), "\n";
105+
}
106+
try {
107+
var_dump(range(1.5, 3.5, -1.5));
108+
} catch (\ValueError $e) {
109+
echo $e->getMessage(), "\n";
110+
}
111+
90112
?>
91-
--EXPECT--
113+
--EXPECTF--
92114
Step cannot be 0
93115
range(): Argument #3 ($step) cannot be 0
94116
range(): Argument #3 ($step) cannot be 0
@@ -111,3 +133,42 @@ range(): Argument #3 ($step) must be less than the range spanned by argument #1
111133
range(): Argument #3 ($step) must be less than the range spanned by argument #1 ($start) and argument #2 ($end)
112134
-- Testing ( (low > high) && (low-high < step) ) for characters --
113135
range(): Argument #3 ($step) must be less than the range spanned by argument #1 ($start) and argument #2 ($end)
136+
Step must not be negative
137+
138+
Warning: range(): Argument #3 ($step) must be greater than 0, $step multiplied by -1 in %s on line %d
139+
array(3) {
140+
[0]=>
141+
string(1) "a"
142+
[1]=>
143+
string(1) "b"
144+
[2]=>
145+
string(1) "c"
146+
}
147+
148+
Warning: range(): Argument #3 ($step) must be greater than 0, $step multiplied by -1 in %s on line %d
149+
array(3) {
150+
[0]=>
151+
int(1)
152+
[1]=>
153+
int(2)
154+
[2]=>
155+
int(3)
156+
}
157+
158+
Warning: range(): Argument #3 ($step) must be greater than 0, $step multiplied by -1 in %s on line %d
159+
array(3) {
160+
[0]=>
161+
string(1) "a"
162+
[1]=>
163+
string(1) "b"
164+
[2]=>
165+
string(1) "c"
166+
}
167+
168+
Warning: range(): Argument #3 ($step) must be greater than 0, $step multiplied by -1 in %s on line %d
169+
array(2) {
170+
[0]=>
171+
float(1.5)
172+
[1]=>
173+
float(3)
174+
}

0 commit comments

Comments
 (0)