From cbe485db055be97f2af4a6040df2390a9cd563ef Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 9 Jun 2021 15:15:23 +0200 Subject: [PATCH] Make PRE_INC/PRE_DEC type inference more accurate The return value can never be a reference, even if the variable is a reference. While here, also exclude the resource and array types which throw a TypeError since PHP 8.0. --- Zend/Optimizer/zend_inference.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 2a7d0c4639e..84ddc23076a 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -2631,9 +2631,6 @@ static zend_always_inline int _zend_update_type_info( case ZEND_PRE_INC: case ZEND_PRE_DEC: tmp = 0; - if (t1 & MAY_BE_REF) { - tmp |= MAY_BE_REF; - } if (t1 & (MAY_BE_RC1|MAY_BE_RCN)) { tmp |= MAY_BE_RC1; if (ssa_op->result_def >= 0) { @@ -2670,14 +2667,17 @@ static zend_always_inline int _zend_update_type_info( if (t1 & MAY_BE_STRING) { tmp |= MAY_BE_STRING | MAY_BE_LONG | MAY_BE_DOUBLE; } - tmp |= t1 & (MAY_BE_FALSE | MAY_BE_TRUE | MAY_BE_RESOURCE | MAY_BE_ARRAY | MAY_BE_OBJECT | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ARRAY_KEY_ANY); - } - if (ssa_op->op1_def >= 0) { - UPDATE_SSA_TYPE(tmp, ssa_op->op1_def); + tmp |= t1 & (MAY_BE_FALSE | MAY_BE_TRUE | MAY_BE_OBJECT); } if (ssa_op->result_def >= 0) { UPDATE_SSA_TYPE(tmp, ssa_op->result_def); } + if (ssa_op->op1_def >= 0) { + if (t1 & MAY_BE_REF) { + tmp |= MAY_BE_REF; + } + UPDATE_SSA_TYPE(tmp, ssa_op->op1_def); + } break; case ZEND_POST_INC: case ZEND_POST_DEC: