Skip to content

Commit 3c517e1

Browse files
committed
Warn on implicit float to int conversions.
1 parent c5f4c3d commit 3c517e1

11 files changed

+680
-1
lines changed
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
--TEST--
2+
Implicit float to int conversions should warn for literals
3+
--FILE--
4+
<?php
5+
// TODO Assignment version and when float is a variable instead of literal
6+
// TODO Float strings for bitwise, arithmetics ops, and function calls/returns
7+
8+
echo 'Bitwise ops:' . \PHP_EOL;
9+
// 8 Warnings generated in total
10+
$var = ~1.5;
11+
var_dump($var);
12+
$var = 1.5|3;
13+
var_dump($var);
14+
$var = 1.5&3;
15+
var_dump($var);
16+
$var = 1.5^3;
17+
var_dump($var);
18+
$var = 1.5 << 3;
19+
var_dump($var);
20+
$var = 1.5 >> 3;
21+
var_dump($var);
22+
$var = 3 << 1.5;
23+
var_dump($var);
24+
$var = 3 >> 1.5;
25+
var_dump($var);
26+
27+
echo 'Modulo:' . \PHP_EOL;
28+
// 2 warnings in total
29+
$var = 6.5 % 2;
30+
var_dump($var);
31+
$var = 9 % 2.5;
32+
var_dump($var);
33+
34+
// Exponentiation?
35+
36+
echo 'Offset access:' . \PHP_EOL;
37+
echo 'Arrays:' . \PHP_EOL;
38+
// 2 warnings in total
39+
$array = ['a', 'b', 'c'];
40+
var_dump($array[1.5]);
41+
$array[2.5] = 'z';
42+
var_dump($array);
43+
44+
echo 'Strings:' . \PHP_EOL;
45+
// 2 warnings in total
46+
$string = 'php';
47+
var_dump($string[1.5]);
48+
$string[2.5] = 'z';
49+
var_dump($string);
50+
51+
echo 'Function calls:' . \PHP_EOL;
52+
function foo(int $a) {
53+
return $a;
54+
}
55+
var_dump(foo(1.5));
56+
57+
// TODO: Why are two warnings generated here?
58+
var_dump(chr(60.5));
59+
60+
echo 'Function returns:' . \PHP_EOL;
61+
function bar(): int {
62+
return 3.5;
63+
}
64+
var_dump(bar());
65+
66+
echo 'Typed property assignment:' . \PHP_EOL;
67+
class Test {
68+
public int $a;
69+
}
70+
71+
$instance = new Test();
72+
$instance->a = 1.5;
73+
var_dump($instance->a);
74+
75+
76+
?>
77+
--EXPECTF--
78+
Warning: Implicit float to int conversion in %s on line %d
79+
80+
Warning: Implicit float to int conversion in %s on line %d
81+
82+
Warning: Implicit float to int conversion in %s on line %d
83+
84+
Warning: Implicit float to int conversion in %s on line %d
85+
86+
Warning: Implicit float to int conversion in %s on line %d
87+
88+
Warning: Implicit float to int conversion in %s on line %d
89+
90+
Warning: Implicit float to int conversion in %s on line %d
91+
92+
Warning: Implicit float to int conversion in %s on line %d
93+
94+
Warning: Implicit float to int conversion in %s on line %d
95+
96+
Warning: Implicit float to int conversion in %s on line %d
97+
Bitwise ops:
98+
int(-2)
99+
int(3)
100+
int(1)
101+
int(2)
102+
int(8)
103+
int(0)
104+
int(6)
105+
int(1)
106+
Modulo:
107+
int(0)
108+
int(1)
109+
Offset access:
110+
Arrays:
111+
112+
Warning: Implicit float to int conversion in %s on line %d
113+
string(1) "b"
114+
115+
Warning: Implicit float to int conversion in %s on line %d
116+
array(3) {
117+
[0]=>
118+
string(1) "a"
119+
[1]=>
120+
string(1) "b"
121+
[2]=>
122+
string(1) "z"
123+
}
124+
Strings:
125+
126+
Warning: String offset cast occurred in %s on line %d
127+
string(1) "h"
128+
129+
Warning: String offset cast occurred in %s on line %d
130+
string(3) "phz"
131+
Function calls:
132+
133+
Warning: Implicit float to int conversion in %s on line %d
134+
int(1)
135+
136+
Warning: Implicit float to int conversion in %s on line %d
137+
138+
Warning: Implicit float to int conversion in %s on line %d
139+
string(1) "<"
140+
Function returns:
141+
142+
Warning: Implicit float to int conversion in %s on line %d
143+
int(3)
144+
Typed property assignment:
145+
146+
Warning: Implicit float to int conversion in %s on line %d
147+
int(1)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
--TEST--
2+
Implicit float to int conversions should warn for literals in combined assingment operetor
3+
--FILE--
4+
<?php
5+
6+
echo 'Bitwise ops:' . \PHP_EOL;
7+
8+
$var = 3;
9+
$var |= 1.5;
10+
var_dump($var);
11+
12+
$var = 3;
13+
$var &= 1.5;
14+
var_dump($var);
15+
16+
$var = 3;
17+
$var ^= 1.5;
18+
var_dump($var);
19+
20+
$var = 3;
21+
$var <<= 1.5;
22+
var_dump($var);
23+
24+
$var = 3;
25+
$var >>= 1.5;
26+
var_dump($var);
27+
28+
echo 'Modulo:' . \PHP_EOL;
29+
$var = 9;
30+
$var %= 2.5;
31+
var_dump($var);
32+
33+
// Exponentiation?
34+
35+
36+
?>
37+
--EXPECTF--
38+
Bitwise ops:
39+
40+
Warning: Implicit float to int conversion in %s on line %d
41+
int(3)
42+
43+
Warning: Implicit float to int conversion in %s on line %d
44+
int(1)
45+
46+
Warning: Implicit float to int conversion in %s on line %d
47+
int(2)
48+
49+
Warning: Implicit float to int conversion in %s on line %d
50+
int(6)
51+
52+
Warning: Implicit float to int conversion in %s on line %d
53+
int(1)
54+
Modulo:
55+
56+
Warning: Implicit float to int conversion in %s on line %d
57+
int(1)
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
--TEST--
2+
Implicit float to int conversions should warn for literals
3+
--FILE--
4+
<?php
5+
6+
echo 'Bitwise ops:' . \PHP_EOL;
7+
8+
$float = 1.5;
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.5;
44+
$var = $modFloat % 2;
45+
var_dump($var);
46+
47+
$modFloat = 2.5;
48+
$var = 9 % $modFloat;
49+
var_dump($var);
50+
51+
// Exponentiation?
52+
53+
echo 'Offset access:' . \PHP_EOL;
54+
$offsetAccess = 2.5;
55+
echo 'Arrays:' . \PHP_EOL;
56+
// 2 warnings in total
57+
$array = ['a', 'b', 'c'];
58+
var_dump($array[$float]);
59+
$array[$offsetAccess] = 'z';
60+
var_dump($array);
61+
62+
echo 'Strings:' . \PHP_EOL;
63+
// 2 warnings in total
64+
$string = 'php';
65+
var_dump($string[$float]);
66+
$string[$offsetAccess] = 'z';
67+
var_dump($string);
68+
69+
echo 'Function calls:' . \PHP_EOL;
70+
function foo(int $a) {
71+
return $a;
72+
}
73+
var_dump(foo($float));
74+
75+
// TODO: Why are two warnings generated here?
76+
$cp = 60.5;
77+
var_dump(chr($cp));
78+
79+
echo 'Function returns:' . \PHP_EOL;
80+
function bar(): int {
81+
$var = 3.5;
82+
return $var;
83+
}
84+
var_dump(bar());
85+
86+
echo 'Typed property assignment:' . \PHP_EOL;
87+
class Test {
88+
public int $a;
89+
}
90+
91+
$instance = new Test();
92+
$instance->a = $float;
93+
var_dump($instance->a);
94+
95+
96+
?>
97+
--EXPECTF--
98+
Bitwise ops:
99+
100+
Warning: Implicit float to int conversion in %s on line %d
101+
int(-2)
102+
103+
Warning: Implicit float to int conversion in %s on line %d
104+
int(3)
105+
106+
Warning: Implicit float to int conversion in %s on line %d
107+
int(1)
108+
109+
Warning: Implicit float to int conversion in %s on line %d
110+
int(2)
111+
112+
Warning: Implicit float to int conversion in %s on line %d
113+
int(8)
114+
115+
Warning: Implicit float to int conversion in %s on line %d
116+
int(0)
117+
118+
Warning: Implicit float to int conversion in %s on line %d
119+
int(8)
120+
121+
Warning: Implicit float to int conversion in %s on line %d
122+
int(0)
123+
124+
Warning: Implicit float to int conversion in %s on line %d
125+
int(6)
126+
127+
Warning: Implicit float to int conversion in %s on line %d
128+
int(1)
129+
Modulo:
130+
131+
Warning: Implicit float to int conversion in %s on line %d
132+
int(0)
133+
134+
Warning: Implicit float to int conversion in %s on line %d
135+
int(1)
136+
Offset access:
137+
Arrays:
138+
139+
Warning: Implicit float to int conversion in %s on line %d
140+
string(1) "b"
141+
142+
Warning: Implicit float to int conversion in %s on line %d
143+
array(3) {
144+
[0]=>
145+
string(1) "a"
146+
[1]=>
147+
string(1) "b"
148+
[2]=>
149+
string(1) "z"
150+
}
151+
Strings:
152+
153+
Warning: String offset cast occurred in %s on line %d
154+
string(1) "h"
155+
156+
Warning: String offset cast occurred in %s on line %d
157+
string(3) "phz"
158+
Function calls:
159+
160+
Warning: Implicit float to int conversion in %s on line %d
161+
int(1)
162+
163+
Warning: Implicit float to int conversion in %s on line %d
164+
165+
Warning: Implicit float to int conversion in %s on line %d
166+
string(1) "<"
167+
Function returns:
168+
169+
Warning: Implicit float to int conversion in %s on line %d
170+
int(3)
171+
Typed property assignment:
172+
173+
Warning: Implicit float to int conversion in %s on line %d
174+
int(1)

0 commit comments

Comments
 (0)