diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 325e7d556a2..f023888bb03 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -3227,7 +3227,12 @@ static zend_always_inline int _zend_update_type_info( tmp |= t1 & (MAY_BE_RC1|MAY_BE_RCN); } if (opline->op2_type == IS_UNUSED) { - key_type |= MAY_BE_HASH_ONLY(t1) ? MAY_BE_ARRAY_NUMERIC_HASH : MAY_BE_ARRAY_KEY_LONG; + if (t1 & (MAY_BE_UNDEF|MAY_BE_NULL)) { + key_type |= MAY_BE_ARRAY_PACKED; + } + if (t1 & MAY_BE_ARRAY) { + key_type |= MAY_BE_HASH_ONLY(t1) ? MAY_BE_ARRAY_NUMERIC_HASH : MAY_BE_ARRAY_KEY_LONG; + } } else { if (t2 & (MAY_BE_LONG|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_RESOURCE|MAY_BE_DOUBLE)) { key_type |= MAY_BE_HASH_ONLY(t1) ? MAY_BE_ARRAY_NUMERIC_HASH : MAY_BE_ARRAY_KEY_LONG; diff --git a/ext/opcache/tests/opt/inference_007.phpt b/ext/opcache/tests/opt/inference_007.phpt new file mode 100644 index 00000000000..4bf61601ce1 --- /dev/null +++ b/ext/opcache/tests/opt/inference_007.phpt @@ -0,0 +1,18 @@ +--TEST-- +Type inference 007: Incorrect array key type inference +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--FILE-- +""); + } +} +?> +DONE +--EXPECT-- +DONE