Skip to content

Commit e1baef1

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Fixed type inference (it's safe to ignore reference counting narrowing)
2 parents 8cdead1 + 2d3ea98 commit e1baef1

File tree

2 files changed

+168
-0
lines changed

2 files changed

+168
-0
lines changed

Zend/Optimizer/zend_inference.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,6 +1911,11 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) {
19111911
(ssa_var_info[__var].type & MAY_BE_REF) \
19121912
== (__type & MAY_BE_REF)); \
19131913
if (ssa_var_info[__var].type & ~__type) { \
1914+
if ((ssa_var_info[__var].type & ~__type & \
1915+
~(MAY_BE_RC1|MAY_BE_RCN)) == 0) { \
1916+
ssa_var_info[__var].type |= __type; \
1917+
break; \
1918+
} \
19141919
emit_type_narrowing_warning(op_array, ssa, __var); \
19151920
return FAILURE; \
19161921
} \
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
--TEST--
2+
Type inference 001: Invalid type narrowing warning
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.optimization_level=-1
7+
--FILE--
8+
<?php
9+
function test() {
10+
$j = 0;
11+
for ($i = 0; $i = 10; $i++) {
12+
$e;
13+
$a = $a;
14+
$obj->$e;
15+
$i += $a;
16+
$j++;
17+
$e;
18+
$a == $Z + $a .= $i+= $a;
19+
$j++;
20+
$e;
21+
$a == $Z + $j++;
22+
$e;
23+
$a == $Z + $a = $a + $b = $i += $a;
24+
$obj = new stdClass;
25+
$obj->prop1 = set_error_handler(function () {
26+
$$GLOBALS['a'] = null;
27+
});
28+
$obj->$a .= $i += $a;
29+
$obj = new stdClass;
30+
$obj->prop1 = $j++;
31+
$e;
32+
$a == $Z + $a = $a + $j++;
33+
$e;
34+
$a == $Z + $a = $a + $b = $aa = $a;
35+
}
36+
}
37+
test();
38+
?>
39+
DONE
40+
--EXPECTF--
41+
Warning: Undefined variable $a in %sinference_001.php on line 6
42+
43+
Warning: Undefined variable $obj in %sinference_001.php on line 7
44+
45+
Warning: Undefined variable $e in %sinference_001.php on line 7
46+
47+
Warning: Attempt to read property "" on null in %sinference_001.php on line 7
48+
49+
Warning: Undefined variable $Z in %sinference_001.php on line 11
50+
51+
Warning: Undefined variable $Z in %sinference_001.php on line 14
52+
53+
Warning: Undefined variable $Z in %sinference_001.php on line 16
54+
55+
Warning: Array to string conversion in %sinference_001.php on line 19
56+
57+
Warning: Array to string conversion in %sinference_001.php on line 19
58+
59+
Warning: Array to string conversion in %sinference_001.php on line 19
60+
61+
Warning: Array to string conversion in %sinference_001.php on line 19
62+
63+
Warning: Array to string conversion in %sinference_001.php on line 19
64+
65+
Warning: Array to string conversion in %sinference_001.php on line 19
66+
67+
Warning: Array to string conversion in %sinference_001.php on line 19
68+
69+
Warning: Array to string conversion in %sinference_001.php on line 19
70+
71+
Warning: Array to string conversion in %sinference_001.php on line 19
72+
73+
Warning: Array to string conversion in %sinference_001.php on line 19
74+
75+
Warning: Array to string conversion in %sinference_001.php on line 19
76+
77+
Warning: Array to string conversion in %sinference_001.php on line 19
78+
79+
Warning: Array to string conversion in %sinference_001.php on line 19
80+
81+
Warning: Array to string conversion in %sinference_001.php on line 19
82+
83+
Warning: Array to string conversion in %sinference_001.php on line 19
84+
85+
Warning: Array to string conversion in %sinference_001.php on line 19
86+
87+
Warning: Array to string conversion in %sinference_001.php on line 19
88+
89+
Warning: Array to string conversion in %sinference_001.php on line 19
90+
91+
Warning: Array to string conversion in %sinference_001.php on line 19
92+
93+
Warning: Array to string conversion in %sinference_001.php on line 19
94+
95+
Warning: Array to string conversion in %sinference_001.php on line 19
96+
97+
Warning: Array to string conversion in %sinference_001.php on line 19
98+
99+
Warning: Array to string conversion in %sinference_001.php on line 19
100+
101+
Warning: Array to string conversion in %sinference_001.php on line 19
102+
103+
Warning: Array to string conversion in %sinference_001.php on line 19
104+
105+
Warning: Array to string conversion in %sinference_001.php on line 19
106+
107+
Warning: Array to string conversion in %sinference_001.php on line 19
108+
109+
Warning: Array to string conversion in %sinference_001.php on line 19
110+
111+
Warning: Array to string conversion in %sinference_001.php on line 19
112+
113+
Warning: Array to string conversion in %sinference_001.php on line 19
114+
115+
Warning: Array to string conversion in %sinference_001.php on line 19
116+
117+
Warning: Array to string conversion in %sinference_001.php on line 19
118+
119+
Warning: Array to string conversion in %sinference_001.php on line 19
120+
121+
Warning: Array to string conversion in %sinference_001.php on line 19
122+
123+
Warning: Array to string conversion in %sinference_001.php on line 19
124+
125+
Warning: Array to string conversion in %sinference_001.php on line 19
126+
127+
Warning: Array to string conversion in %sinference_001.php on line 19
128+
129+
Warning: Array to string conversion in %sinference_001.php on line 19
130+
131+
Warning: Array to string conversion in %sinference_001.php on line 19
132+
133+
Warning: Array to string conversion in %sinference_001.php on line 19
134+
135+
Warning: Array to string conversion in %sinference_001.php on line 19
136+
137+
Warning: Array to string conversion in %sinference_001.php on line 19
138+
139+
Warning: Array to string conversion in %sinference_001.php on line 19
140+
141+
Warning: Array to string conversion in %sinference_001.php on line 19
142+
143+
Warning: Array to string conversion in %sinference_001.php on line 19
144+
145+
Warning: Array to string conversion in %sinference_001.php on line 19
146+
147+
Warning: Array to string conversion in %sinference_001.php on line 19
148+
149+
Warning: Array to string conversion in %sinference_001.php on line 19
150+
151+
Warning: Array to string conversion in %sinference_001.php on line 19
152+
153+
Warning: Array to string conversion in %sinference_001.php on line 19
154+
155+
Warning: Array to string conversion in %sinference_001.php on line 19
156+
157+
Warning: Array to string conversion in %sinference_001.php on line 19
158+
159+
Fatal error: Uncaught TypeError: Unsupported operand types: null + string in %sinference_001.php:11
160+
Stack trace:
161+
#0 %sinference_001.php(30): test()
162+
#1 {main}
163+
thrown in %sinference_001.php on line 11

0 commit comments

Comments
 (0)