Skip to content

Commit 0a268d4

Browse files
committed
Warn on implicit float to int conversions.
1 parent c5f4c3d commit 0a268d4

17 files changed

+1126
-10
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
--TEST--
2+
Implicit float to int conversions should not warn for literals if float has a fractional part equal to 0
3+
--FILE--
4+
<?php
5+
6+
echo 'Bitwise ops:' . \PHP_EOL;
7+
$var = ~1.0;
8+
var_dump($var);
9+
$var = 1.0|3;
10+
var_dump($var);
11+
$var = 1.0&3;
12+
var_dump($var);
13+
$var = 1.0^3;
14+
var_dump($var);
15+
$var = 1.0 << 3;
16+
var_dump($var);
17+
$var = 1.0 >> 3;
18+
var_dump($var);
19+
$var = 3 << 1.0;
20+
var_dump($var);
21+
$var = 3 >> 1.0;
22+
var_dump($var);
23+
24+
echo 'Modulo:' . \PHP_EOL;
25+
$var = 6.0 % 2;
26+
var_dump($var);
27+
$var = 9 % 2.0;
28+
var_dump($var);
29+
30+
// Exponentiation?
31+
32+
echo 'Offset access:' . \PHP_EOL;
33+
echo 'Arrays:' . \PHP_EOL;
34+
$array = ['a', 'b', 'c'];
35+
var_dump($array[1.0]);
36+
$array[2.0] = 'z';
37+
var_dump($array);
38+
39+
/* Strings are handled differently and always warn on non integer keys */
40+
41+
echo 'Function calls:' . \PHP_EOL;
42+
function foo(int $a) {
43+
return $a;
44+
}
45+
var_dump(foo(1.0));
46+
47+
var_dump(chr(60.0));
48+
49+
echo 'Function returns:' . \PHP_EOL;
50+
function bar(): int {
51+
return 3.0;
52+
}
53+
var_dump(bar());
54+
55+
echo 'Typed property assignment:' . \PHP_EOL;
56+
class Test {
57+
public int $a;
58+
}
59+
60+
$instance = new Test();
61+
$instance->a = 1.0;
62+
var_dump($instance->a);
63+
64+
?>
65+
--EXPECT--
66+
Bitwise ops:
67+
int(-2)
68+
int(3)
69+
int(1)
70+
int(2)
71+
int(8)
72+
int(0)
73+
int(6)
74+
int(1)
75+
Modulo:
76+
int(0)
77+
int(1)
78+
Offset access:
79+
Arrays:
80+
string(1) "b"
81+
array(3) {
82+
[0]=>
83+
string(1) "a"
84+
[1]=>
85+
string(1) "b"
86+
[2]=>
87+
string(1) "z"
88+
}
89+
Function calls:
90+
int(1)
91+
string(1) "<"
92+
Function returns:
93+
int(3)
94+
Typed property assignment:
95+
int(1)
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
--TEST--
2+
Implicit string float to int conversions should not warn for literals if float has a fractional part equal to 0
3+
--FILE--
4+
<?php
5+
6+
echo 'Bitwise ops:' . \PHP_EOL;
7+
$var = '1.0'|3;
8+
var_dump($var);
9+
$var = '1.0'&3;
10+
var_dump($var);
11+
$var = '1.0'^3;
12+
var_dump($var);
13+
$var = '1.0' << 3;
14+
var_dump($var);
15+
$var = '1.0' >> 3;
16+
var_dump($var);
17+
$var = 3 << '1.0';
18+
var_dump($var);
19+
$var = 3 >> '1.0';
20+
var_dump($var);
21+
22+
echo 'Modulo:' . \PHP_EOL;
23+
$var = '6.0' % 2;
24+
var_dump($var);
25+
$var = 9 % '2.0';
26+
var_dump($var);
27+
28+
// Exponentiation?
29+
30+
/* Float string array keys are never normalized to an integer value */
31+
/* Strings are handled differently and always warn on non integer keys */
32+
33+
echo 'Function calls:' . \PHP_EOL;
34+
function foo(int $a) {
35+
return $a;
36+
}
37+
var_dump(foo('1.0'));
38+
39+
var_dump(chr('60.0'));
40+
41+
echo 'Function returns:' . \PHP_EOL;
42+
function bar(): int {
43+
return '3.0';
44+
}
45+
var_dump(bar());
46+
47+
echo 'Typed property assignment:' . \PHP_EOL;
48+
class Test {
49+
public int $a;
50+
}
51+
52+
$instance = new Test();
53+
$instance->a = '1.0';
54+
var_dump($instance->a);
55+
56+
?>
57+
--EXPECT--
58+
Bitwise ops:
59+
int(3)
60+
int(1)
61+
int(2)
62+
int(8)
63+
int(0)
64+
int(6)
65+
int(1)
66+
Modulo:
67+
int(0)
68+
int(1)
69+
Function calls:
70+
int(1)
71+
string(1) "<"
72+
Function returns:
73+
int(3)
74+
Typed property assignment:
75+
int(1)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
--TEST--
2+
Implicit float to int conversions should not warn for literals in combined assingment operetor if float has a fractional part equal to 0
3+
--FILE--
4+
<?php
5+
6+
echo 'Bitwise ops:' . \PHP_EOL;
7+
8+
$var = 3;
9+
$var |= 1.0;
10+
var_dump($var);
11+
12+
$var = 3;
13+
$var &= 1.0;
14+
var_dump($var);
15+
16+
$var = 3;
17+
$var ^= 1.0;
18+
var_dump($var);
19+
20+
$var = 3;
21+
$var <<= 1.0;
22+
var_dump($var);
23+
24+
$var = 3;
25+
$var >>= 1.0;
26+
var_dump($var);
27+
28+
echo 'Modulo:' . \PHP_EOL;
29+
$var = 9;
30+
$var %= 2.0;
31+
var_dump($var);
32+
33+
// Exponentiation?
34+
35+
?>
36+
--EXPECT--
37+
Bitwise ops:
38+
int(3)
39+
int(1)
40+
int(2)
41+
int(6)
42+
int(1)
43+
Modulo:
44+
int(1)
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
--TEST--
2+
Implicit float to int conversions should not warn for variables if float has a fractional part equal to 0
3+
--FILE--
4+
<?php
5+
6+
echo 'Bitwise ops:' . \PHP_EOL;
7+
8+
$float = 1.0;
9+
10+
$var = ~$float;
11+
var_dump($var);
12+
13+
$var = $float|3;
14+
var_dump($var);
15+
16+
$var = $float&3;
17+
var_dump($var);
18+
19+
$var = $float^3;
20+
var_dump($var);
21+
22+
$var = $float << 3;
23+
var_dump($var);
24+
25+
$var = $float >> 3;
26+
var_dump($var);
27+
28+
$var = $float;
29+
$var <<= 3;
30+
var_dump($var);
31+
32+
$var = $float;
33+
$var >>= 3;
34+
var_dump($var);
35+
36+
$var = 3 << $float;
37+
var_dump($var);
38+
39+
$var = 3 >> $float;
40+
var_dump($var);
41+
42+
echo 'Modulo:' . \PHP_EOL;
43+
$modFloat = 6.0;
44+
$var = $modFloat % 2;
45+
var_dump($var);
46+
47+
$modFloat = 2.0;
48+
$var = 9 % $modFloat;
49+
var_dump($var);
50+
51+
// Exponentiation?
52+
53+
echo 'Offset access:' . \PHP_EOL;
54+
$offsetAccess = 2.0;
55+
echo 'Arrays:' . \PHP_EOL;
56+
$array = ['a', 'b', 'c'];
57+
var_dump($array[$float]);
58+
$array[$offsetAccess] = 'z';
59+
var_dump($array);
60+
61+
echo 'Function calls:' . \PHP_EOL;
62+
function foo(int $a) {
63+
return $a;
64+
}
65+
var_dump(foo($float));
66+
67+
$cp = 60.0;
68+
var_dump(chr($cp));
69+
70+
echo 'Function returns:' . \PHP_EOL;
71+
function bar(): int {
72+
$var = 3.0;
73+
return $var;
74+
}
75+
var_dump(bar());
76+
77+
echo 'Typed property assignment:' . \PHP_EOL;
78+
class Test {
79+
public int $a;
80+
}
81+
82+
$instance = new Test();
83+
$instance->a = $float;
84+
var_dump($instance->a);
85+
86+
?>
87+
--EXPECT--
88+
Bitwise ops:
89+
int(-2)
90+
int(3)
91+
int(1)
92+
int(2)
93+
int(8)
94+
int(0)
95+
int(8)
96+
int(0)
97+
int(6)
98+
int(1)
99+
Modulo:
100+
int(0)
101+
int(1)
102+
Offset access:
103+
Arrays:
104+
string(1) "b"
105+
array(3) {
106+
[0]=>
107+
string(1) "a"
108+
[1]=>
109+
string(1) "b"
110+
[2]=>
111+
string(1) "z"
112+
}
113+
Function calls:
114+
int(1)
115+
string(1) "<"
116+
Function returns:
117+
int(3)
118+
Typed property assignment:
119+
int(1)

0 commit comments

Comments
 (0)