]> granicus.if.org Git - php/commitdiff
More type inference fixes
authorNikita Popov <nikic@php.net>
Thu, 16 Jun 2016 09:24:20 +0000 (11:24 +0200)
committerNikita Popov <nikic@php.net>
Thu, 16 Jun 2016 12:25:48 +0000 (14:25 +0200)
ext/opcache/Optimizer/zend_func_info.c
ext/opcache/Optimizer/zend_inference.c

index a684a16e73e9a0614213fb7def7e25c377559cb1..9a1a9e25d447dde676e070472c3d20b2e04d961c 100644 (file)
@@ -229,7 +229,7 @@ static const func_info_t func_infos[] = {
        FC("strncmp",                 zend_lb_ssn_info),
        FC("strcasecmp",              zend_l_ss_info),
        FC("strncasecmp",             zend_lb_ssn_info),
-       F1("each",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
+       F1("each",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_KEY_ANY),
        F1("error_reporting",         MAY_BE_NULL | MAY_BE_LONG),
        F1("define",                  MAY_BE_FALSE | MAY_BE_TRUE | MAY_BE_NULL), // TODO: inline
        FC("defined",                 zend_b_s_info), // TODO: inline
@@ -251,8 +251,8 @@ static const func_info_t func_infos[] = {
        F1("get_included_files",      MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING),
        F1("trigger_error",           MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("user_error",              MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
-       F1("set_error_handler",       MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_OBJECT | MAY_BE_OBJECT),
-       I1("restore_error_handler",   MAY_BE_TRUE),
+       F1("set_error_handler",       MAY_BE_NULL | MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_OBJECT | MAY_BE_OBJECT),
+       I1("restore_error_handler",   MAY_BE_NULL | MAY_BE_TRUE),
        F1("get_declared_traits",     MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING),
        F1("get_declared_classes",    MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING),
        F1("get_declared_interfaces", MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING),
@@ -330,7 +330,7 @@ static const func_info_t func_infos[] = {
        F1("stristr",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING),
        F1("strrchr",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING),
        F1("str_shuffle",                  MAY_BE_NULL | MAY_BE_STRING),
-       F1("str_word_count",               MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
+       F1("str_word_count",               MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING),
        F1("str_split",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING),
        F1("strpbrk",                      MAY_BE_FALSE | MAY_BE_STRING),
        F1("substr_compare",               MAY_BE_FALSE | MAY_BE_LONG),
@@ -382,9 +382,9 @@ static const func_info_t func_infos[] = {
        F1("vsprintf",                     MAY_BE_FALSE | MAY_BE_STRING),
        F1("fprintf",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
        F1("vfprintf",                     MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
-       F1("sscanf",                       MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_ANY),
-       F1("fscanf",                       MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_ANY),
-       F1("parse_url",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_LONG),
+       F1("sscanf",                       MAY_BE_NULL | MAY_BE_LONG | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_ANY),
+       F1("fscanf",                       MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_ANY),
+       F1("parse_url",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG | MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_LONG),
        F1("urlencode",                    MAY_BE_NULL | MAY_BE_STRING),
        F1("urldecode",                    MAY_BE_NULL | MAY_BE_STRING),
        F1("rawurlencode",                 MAY_BE_NULL | MAY_BE_STRING),
@@ -491,11 +491,11 @@ static const func_info_t func_infos[] = {
 #endif
        F1("ip2long",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
        F1("long2ip",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING),
-       F1("getenv",                       MAY_BE_FALSE | MAY_BE_STRING),
+       F1("getenv",                       MAY_BE_FALSE | MAY_BE_STRING | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING),
 #ifdef HAVE_PUTENV
        F1("putenv",                       MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
 #endif
-       F1("getopt",                       MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
+       F1("getopt",                       MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
 #ifdef HAVE_GETLOADAVG
        F1("sys_getloadavg",               MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_DOUBLE),
 #endif
@@ -539,12 +539,12 @@ static const func_info_t func_infos[] = {
        F1("register_shutdown_function",   MAY_BE_NULL | MAY_BE_FALSE),
        F1("register_tick_function",       MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("unregister_tick_function",     MAY_BE_NULL),
-       F1("highlight_file",               MAY_BE_FALSE | MAY_BE_STRING),
+       F1("highlight_file",               MAY_BE_FALSE | MAY_BE_TRUE | MAY_BE_STRING),
        F1("show_source",                  MAY_BE_FALSE | MAY_BE_STRING),
-       F1("highlight_string",             MAY_BE_FALSE | MAY_BE_STRING),
+       F1("highlight_string",             MAY_BE_FALSE | MAY_BE_TRUE | MAY_BE_STRING),
        F1("php_strip_whitespace",         MAY_BE_FALSE | MAY_BE_STRING),
        F1("ini_get",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING),
-       F1("ini_get_all",                  MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
+       F1("ini_get_all",                  MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
        F1("ini_set",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING),
        F1("ini_alter",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING),
        F1("ini_restore",                  MAY_BE_NULL),
@@ -561,8 +561,8 @@ static const func_info_t func_infos[] = {
        F1("connection_aborted",           MAY_BE_LONG),
        F1("connection_status",            MAY_BE_LONG),
        F1("ignore_user_abort",            MAY_BE_NULL | MAY_BE_LONG),
-       F1("parse_ini_file",               MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
-       F1("parse_ini_string",             MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
+       F1("parse_ini_file",               MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
+       F1("parse_ini_string",             MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
 #if ZEND_DEBUG
        F1("config_get_hash",              MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
 #endif
@@ -636,7 +636,7 @@ static const func_info_t func_infos[] = {
        F1("file_put_contents",            MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
        F1("stream_select",                MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
        F1("stream_context_create",        MAY_BE_FALSE | MAY_BE_RESOURCE),
-       F1("stream_context_set_params",    MAY_BE_FALSE | MAY_BE_RESOURCE),
+       F1("stream_context_set_params",    MAY_BE_FALSE | MAY_BE_TRUE),
        F1("stream_context_get_params",    MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_ANY),
        F1("stream_context_set_option",    MAY_BE_FALSE | MAY_BE_TRUE),
        F1("stream_context_get_options",   MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_ANY),
@@ -661,7 +661,7 @@ static const func_info_t func_infos[] = {
        F1("stream_copy_to_stream",        MAY_BE_FALSE | MAY_BE_LONG),
        F1("stream_get_contents",          MAY_BE_FALSE | MAY_BE_STRING),
        F1("stream_supports_lock",         MAY_BE_FALSE | MAY_BE_TRUE),
-       F1("fgetcsv",                      MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_STRING),
+       F1("fgetcsv",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_NULL | MAY_BE_ARRAY_OF_STRING),
        F1("fputcsv",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
        F1("flock",                        MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("get_meta_tags",                MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_STRING),
@@ -672,7 +672,7 @@ static const func_info_t func_infos[] = {
        F1("set_socket_blocking",          MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("stream_set_blocking",          MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("socket_set_blocking",          MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
-       F1("stream_get_meta_data",         MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_ANY),
+       F1("stream_get_meta_data",         MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_ANY),
        F1("stream_get_line",              MAY_BE_FALSE | MAY_BE_STRING),
        F1("stream_wrapper_register",      MAY_BE_FALSE | MAY_BE_TRUE),
        F1("stream_register_wrapper",      MAY_BE_FALSE | MAY_BE_TRUE),
@@ -708,21 +708,21 @@ static const func_info_t func_infos[] = {
 #endif
        F1("getcwd",                       MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING),
        F1("rewinddir",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
-       F1("readdir",                      MAY_BE_FALSE | MAY_BE_STRING),
+       F1("readdir",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING),
        F1("dir",                          MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_OBJECT),
        F1("scandir",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING),
 #ifdef HAVE_GLOB
        F1("glob",                         MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING),
 #endif
-       F1("fileatime",                    MAY_BE_NULL | MAY_BE_LONG),
-       F1("filectime",                    MAY_BE_NULL | MAY_BE_LONG),
-       F1("filegroup",                    MAY_BE_NULL | MAY_BE_LONG),
-       F1("fileinode",                    MAY_BE_NULL | MAY_BE_LONG),
-       F1("filemtime",                    MAY_BE_NULL | MAY_BE_LONG),
-       F1("fileowner",                    MAY_BE_NULL | MAY_BE_LONG),
-       F1("fileperms",                    MAY_BE_NULL | MAY_BE_LONG),
-       F1("filesize",                     MAY_BE_NULL | MAY_BE_LONG),
-       F1("filetype",                     MAY_BE_NULL | MAY_BE_STRING),
+       F1("fileatime",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
+       F1("filectime",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
+       F1("filegroup",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
+       F1("fileinode",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
+       F1("filemtime",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
+       F1("fileowner",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
+       F1("fileperms",                    MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
+       F1("filesize",                     MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_LONG),
+       F1("filetype",                     MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_STRING),
        F1("file_exists",                  MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("is_writable",                  MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("is_writeable",                 MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
@@ -731,8 +731,8 @@ static const func_info_t func_infos[] = {
        F1("is_file",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("is_dir",                       MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("is_link",                      MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
-       F1("stat",                         MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING),
-       F1("lstat",                        MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING),
+       F1("stat",                         MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING),
+       F1("lstat",                        MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_FALSE | MAY_BE_ARRAY_OF_TRUE | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING),
 #ifndef NETWARE
        F1("chown",                        MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("chgrp",                        MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
@@ -848,7 +848,7 @@ static const func_info_t func_infos[] = {
        F1("array_filter",                 MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_map",                    MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_chunk",                  MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
-       F1("array_combine",                MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
+       F1("array_combine",                MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_OF_ANY),
        F1("array_key_exists",             MAY_BE_NULL | MAY_BE_FALSE | MAY_BE_TRUE),
        F1("pos",                          UNKNOWN_INFO),
        F1("sizeof",                       MAY_BE_NULL | MAY_BE_LONG),
@@ -904,7 +904,7 @@ static const func_info_t func_infos[] = {
        F1("date_date_set",                         MAY_BE_FALSE | MAY_BE_OBJECT),
        F1("date_isodate_set",                      MAY_BE_FALSE | MAY_BE_OBJECT),
        F1("date_timestamp_set",                    MAY_BE_FALSE | MAY_BE_OBJECT),
-       F1("date_timestamp_get",                    MAY_BE_FALSE | MAY_BE_OBJECT),
+       F1("date_timestamp_get",                    MAY_BE_FALSE | MAY_BE_LONG),
        F1("timezone_open",                         MAY_BE_FALSE | MAY_BE_OBJECT),
        F1("timezone_name_get",                     MAY_BE_FALSE | MAY_BE_STRING),
        F1("timezone_name_from_abbr",               MAY_BE_FALSE | MAY_BE_STRING),
index 04bf483c1a4ef08ea26052893bfb070f424a80ca..ee14e49b5c3055df70dc7a0aa1f98ff70bc15996 100644 (file)
@@ -2596,8 +2596,15 @@ static void zend_update_type_info(const zend_op_array *op_array,
                                        tmp |= MAY_BE_LONG;
                                }
                        } else {
+                               if (t1 & MAY_BE_ERROR) {
+                                       tmp |= MAY_BE_NULL;
+                               }
                                if (t1 & (MAY_BE_UNDEF | MAY_BE_NULL)) {
-                                       tmp |= MAY_BE_LONG;
+                                       if (opline->opcode == ZEND_PRE_INC) {
+                                               tmp |= MAY_BE_LONG;
+                                       } else {
+                                               tmp |= MAY_BE_NULL;
+                                       }
                                }
                                if (t1 & MAY_BE_LONG) {
                                        tmp |= MAY_BE_LONG | MAY_BE_DOUBLE;
@@ -2647,8 +2654,15 @@ static void zend_update_type_info(const zend_op_array *op_array,
                                        tmp |= MAY_BE_LONG;
                                }
                        } else {
+                               if (t1 & MAY_BE_ERROR) {
+                                       tmp |= MAY_BE_NULL;
+                               }
                                if (t1 & (MAY_BE_UNDEF | MAY_BE_NULL)) {
-                                       tmp |= MAY_BE_LONG;
+                                       if (opline->opcode == ZEND_POST_INC) {
+                                               tmp |= MAY_BE_LONG;
+                                       } else {
+                                               tmp |= MAY_BE_NULL;
+                                       }
                                }
                                if (t1 & MAY_BE_LONG) {
                                        tmp |= MAY_BE_LONG | MAY_BE_DOUBLE;
@@ -2923,6 +2937,8 @@ static void zend_update_type_info(const zend_op_array *op_array,
                }
                case ZEND_DECLARE_CLASS:
                case ZEND_DECLARE_INHERITED_CLASS:
+               case ZEND_DECLARE_ANON_CLASS:
+               case ZEND_DECLARE_ANON_INHERITED_CLASS:
                        UPDATE_SSA_TYPE(MAY_BE_CLASS, ssa_ops[i].result_def);
                        if ((ce = zend_hash_find_ptr(&script->class_table, Z_STR_P(CRT_CONSTANT_EX(op_array, opline->op1, ssa->rt_constants)))) != NULL) {
                                UPDATE_SSA_OBJ_TYPE(ce, 0, ssa_ops[i].result_def);