mirror of
https://github.com/php/php-src.git
synced 2024-11-30 21:35:36 +08:00
Fix SSA integrity violation for type inference in dead code
The foreach body can never be executed and thus may contain empty types. We should still uphold our SSA integrity invariants in that case.
This commit is contained in:
parent
0427dcb913
commit
83738281eb
18
Zend/tests/dead_array_type_inference.phpt
Normal file
18
Zend/tests/dead_array_type_inference.phpt
Normal file
@ -0,0 +1,18 @@
|
||||
--TEST--
|
||||
Make sure type inference upholds invariants for dead arrays
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function test() {
|
||||
foreach ($a as $v) {
|
||||
$b[] = $v;
|
||||
}
|
||||
}
|
||||
|
||||
test();
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Notice: Undefined variable: a in %s on line %d
|
||||
|
||||
Warning: Invalid argument supplied for foreach() in %s on line %d
|
@ -2106,24 +2106,28 @@ static uint32_t assign_dim_result_type(
|
||||
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
|
||||
}
|
||||
if (tmp & MAY_BE_ARRAY) {
|
||||
if (value_type & MAY_BE_UNDEF) {
|
||||
tmp |= MAY_BE_ARRAY_OF_NULL;
|
||||
}
|
||||
if (dim_op_type == IS_UNUSED) {
|
||||
tmp |= MAY_BE_ARRAY_KEY_LONG;
|
||||
} else {
|
||||
if (dim_type & (MAY_BE_LONG|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_RESOURCE|MAY_BE_DOUBLE)) {
|
||||
tmp |= MAY_BE_ARRAY_KEY_LONG;
|
||||
/* Only add key type if we have a value type. We want to maintain the invariant that a
|
||||
* key type exists iff a value type exists even in dead code that may use empty types. */
|
||||
if (value_type & (MAY_BE_ANY|MAY_BE_UNDEF)) {
|
||||
if (value_type & MAY_BE_UNDEF) {
|
||||
tmp |= MAY_BE_ARRAY_OF_NULL;
|
||||
}
|
||||
if (dim_type & MAY_BE_STRING) {
|
||||
tmp |= MAY_BE_ARRAY_KEY_STRING;
|
||||
if (dim_op_type != IS_CONST) {
|
||||
// FIXME: numeric string
|
||||
if (dim_op_type == IS_UNUSED) {
|
||||
tmp |= MAY_BE_ARRAY_KEY_LONG;
|
||||
} else {
|
||||
if (dim_type & (MAY_BE_LONG|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_RESOURCE|MAY_BE_DOUBLE)) {
|
||||
tmp |= MAY_BE_ARRAY_KEY_LONG;
|
||||
}
|
||||
}
|
||||
if (dim_type & (MAY_BE_UNDEF|MAY_BE_NULL)) {
|
||||
tmp |= MAY_BE_ARRAY_KEY_STRING;
|
||||
if (dim_type & MAY_BE_STRING) {
|
||||
tmp |= MAY_BE_ARRAY_KEY_STRING;
|
||||
if (dim_op_type != IS_CONST) {
|
||||
// FIXME: numeric string
|
||||
tmp |= MAY_BE_ARRAY_KEY_LONG;
|
||||
}
|
||||
}
|
||||
if (dim_type & (MAY_BE_UNDEF|MAY_BE_NULL)) {
|
||||
tmp |= MAY_BE_ARRAY_KEY_STRING;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Only add value type if we have a key type. It might be that the key type is illegal
|
||||
|
Loading…
Reference in New Issue
Block a user