]> granicus.if.org Git - php/commitdiff
Fixed bug #79193
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 30 Jan 2020 13:55:58 +0000 (14:55 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 30 Jan 2020 13:55:58 +0000 (14:55 +0100)
NEWS
ext/opcache/Optimizer/zend_inference.c
ext/opcache/tests/bug79193.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 2dcfdf9db3b3e08fcb1c11812ec7485f09955fbe..a4ef1ef469b1169cd1a20c18dd8859dfc49c528c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -39,6 +39,8 @@ PHP                                                                        NEWS
   . Fixed bug #79114 (Eval class during preload causes class to be only half
     available). (Laruence)
   . Fixed bug #79128 (Preloading segfaults if preload_user is used). (Nikita)
+  . Fixed bug #79193 (Incorrect type inference for self::$field =& $field).
+    (Nikita)
 
 - OpenSSL:
   . Fixed bug #79145 (openssl memory leak). (cmb, Nikita)
index f89b133b9267aefeb59637aac4917174111f2e1d..7accf73a5d4e6782aeed7fbb5a3204cfcee5e9fd 100644 (file)
@@ -2999,6 +2999,13 @@ static int zend_update_type_info(const zend_op_array *op_array,
                                UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
                        }
                        break;
+               case ZEND_ASSIGN_STATIC_PROP_REF:
+                       if ((opline+1)->op1_type == IS_CV) {
+                               opline++;
+                               i++;
+                               UPDATE_SSA_TYPE(MAY_BE_REF, ssa_ops[i].op1_def);
+                       }
+                       break;
                case ZEND_BIND_GLOBAL:
                        tmp = MAY_BE_REF | MAY_BE_ANY
                                | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
diff --git a/ext/opcache/tests/bug79193.phpt b/ext/opcache/tests/bug79193.phpt
new file mode 100644 (file)
index 0000000..c500400
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Bug #79193: Incorrect type inference for self::$field =& $field
+--FILE--
+<?php
+
+class Test {
+    public static $foo;
+    public static function method($bar) {
+        Test::$foo =& $bar;
+        var_dump(is_int($bar));
+    }
+}
+
+Test::method(1);
+
+?>
+--EXPECT--
+bool(true)