From 86430e8e010661884346d91ce624abfb36ccd20d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 29 Nov 2021 23:32:52 +0300 Subject: [PATCH] Fixed type inference (it's safe to ignore reference counting narrowing) --- ext/opcache/Optimizer/zend_inference.c | 5 + ext/opcache/tests/opt/inference_001.phpt | 163 +++++++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100644 ext/opcache/tests/opt/inference_001.phpt diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index e14c9530952..52f4123192b 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -1860,6 +1860,11 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) { } \ if (ssa_var_info[__var].type != __type) { \ 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