diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 0bb536faa2d..7e28d32e538 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -1911,6 +1911,11 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) { (ssa_var_info[__var].type & MAY_BE_REF) \ == (__type & MAY_BE_REF)); \ if (ssa_var_info[__var].type & ~__type) { \ + if ((ssa_var_info[__var].type & ~__type & \ + ~(MAY_BE_RC1|MAY_BE_RCN)) == 0) { \ + ssa_var_info[__var].type |= __type; \ + break; \ + } \ emit_type_narrowing_warning(op_array, ssa, __var); \ return FAILURE; \ } \ diff --git a/ext/opcache/tests/opt/inference_001.phpt b/ext/opcache/tests/opt/inference_001.phpt new file mode 100644 index 00000000000..2c738957346 --- /dev/null +++ b/ext/opcache/tests/opt/inference_001.phpt @@ -0,0 +1,163 @@ +--TEST-- +Type inference 001: Invalid type narrowing warning +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--FILE-- +$e; + $i += $a; + $j++; + $e; + $a == $Z + $a .= $i+= $a; + $j++; + $e; + $a == $Z + $j++; + $e; + $a == $Z + $a = $a + $b = $i += $a; + $obj = new stdClass; + $obj->prop1 = set_error_handler(function () { + $$GLOBALS['a'] = null; + }); + $obj->$a .= $i += $a; + $obj = new stdClass; + $obj->prop1 = $j++; + $e; + $a == $Z + $a = $a + $j++; + $e; + $a == $Z + $a = $a + $b = $aa = $a; + } +} +test(); +?> +DONE +--EXPECTF-- +Warning: Undefined variable $a in %sinference_001.php on line 6 + +Warning: Undefined variable $obj in %sinference_001.php on line 7 + +Warning: Undefined variable $e in %sinference_001.php on line 7 + +Warning: Attempt to read property "" on null in %sinference_001.php on line 7 + +Warning: Undefined variable $Z in %sinference_001.php on line 11 + +Warning: Undefined variable $Z in %sinference_001.php on line 14 + +Warning: Undefined variable $Z in %sinference_001.php on line 16 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Warning: Array to string conversion in %sinference_001.php on line 19 + +Fatal error: Uncaught TypeError: Unsupported operand types: null + string in %sinference_001.php:11 +Stack trace: +#0 %sinference_001.php(30): test() +#1 {main} + thrown in %sinference_001.php on line 11