From f256c3f61764c90a717611dcecbbbbe21b0d5667 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 30 Jun 2021 15:45:42 +0200 Subject: [PATCH] Move INHERITANCE_WARNING handling one layer up There is only a single place where we need to convert ERROR into WARNING, don't thread it through more places than necessary. --- Zend/zend_inheritance.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index a66957c4fef..ccbc2d92997 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -461,7 +461,7 @@ static inheritance_status zend_perform_covariant_class_type_check( static inheritance_status zend_perform_covariant_type_check( zend_class_entry *fe_scope, zend_type fe_type, - zend_class_entry *proto_scope, zend_type proto_type, bool tentative) /* {{{ */ + zend_class_entry *proto_scope, zend_type proto_type) { ZEND_ASSERT(ZEND_TYPE_IS_SET(fe_type) && ZEND_TYPE_IS_SET(proto_type)); @@ -502,7 +502,7 @@ static inheritance_status zend_perform_covariant_type_check( if (added_types) { /* Otherwise adding new types is illegal */ - return tentative ? INHERITANCE_WARNING : INHERITANCE_ERROR; + return INHERITANCE_ERROR; } } @@ -528,7 +528,7 @@ static inheritance_status zend_perform_covariant_type_check( } if (status == INHERITANCE_ERROR) { - return tentative ? INHERITANCE_WARNING : INHERITANCE_ERROR; + return INHERITANCE_ERROR; } if (status != INHERITANCE_SUCCESS) { all_success = 0; @@ -557,7 +557,6 @@ static inheritance_status zend_perform_covariant_type_check( } ZEND_TYPE_FOREACH_END(); return INHERITANCE_UNRESOLVED; } -/* }}} */ static inheritance_status zend_do_perform_arg_type_hint_check( zend_class_entry *fe_scope, zend_arg_info *fe_arg_info, @@ -576,7 +575,7 @@ static inheritance_status zend_do_perform_arg_type_hint_check( /* Contravariant type check is performed as a covariant type check with swapped * argument order. */ return zend_perform_covariant_type_check( - proto_scope, proto_arg_info->type, fe_scope, fe_arg_info->type, 0); + proto_scope, proto_arg_info->type, fe_scope, fe_arg_info->type); } /* }}} */ @@ -678,15 +677,14 @@ static inheritance_status zend_do_perform_implementation_check( } local_status = zend_perform_covariant_type_check( - fe_scope, fe->common.arg_info[-1].type, - proto_scope, proto->common.arg_info[-1].type, ZEND_ARG_TYPE_IS_TENTATIVE(&proto->common.arg_info[-1])); + fe_scope, fe->common.arg_info[-1].type, proto_scope, proto->common.arg_info[-1].type); if (UNEXPECTED(local_status != INHERITANCE_SUCCESS)) { - if (UNEXPECTED(local_status == INHERITANCE_ERROR || local_status == INHERITANCE_WARNING)) { - return local_status; + if (local_status == INHERITANCE_ERROR + && ZEND_ARG_TYPE_IS_TENTATIVE(&proto->common.arg_info[-1])) { + local_status = INHERITANCE_WARNING; } - ZEND_ASSERT(local_status == INHERITANCE_UNRESOLVED); - status = INHERITANCE_UNRESOLVED; + return local_status; } } @@ -1077,9 +1075,9 @@ inheritance_status property_types_compatible( /* Perform a covariant type check in both directions to determined invariance. */ inheritance_status status1 = zend_perform_covariant_type_check( - child_info->ce, child_info->type, parent_info->ce, parent_info->type, 0); + child_info->ce, child_info->type, parent_info->ce, parent_info->type); inheritance_status status2 = zend_perform_covariant_type_check( - parent_info->ce, parent_info->type, child_info->ce, child_info->type, 0); + parent_info->ce, parent_info->type, child_info->ce, child_info->type); if (status1 == INHERITANCE_SUCCESS && status2 == INHERITANCE_SUCCESS) { return INHERITANCE_SUCCESS; }