Commit 5279185a598 for php.net
commit 5279185a598dbb9e7acb4cc830be5a15c95ba93f
Author: Ilija Tovilo <ilija.tovilo@me.com>
Date: Mon Apr 6 18:24:55 2026 +0200
Fix internal return type check with gcov (GH-21653)
ZEND_ASSERT() is a no-op with gcov. Move zend_verify_internal_return_type() out
of ZEND_ASSERT().
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 1a79bc1ba99..66849c09cac 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1025,8 +1025,10 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_
if (should_throw) {
zend_internal_call_arginfo_violation(call->func);
}
- ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, fci->retval));
+ if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+ bool result = zend_verify_internal_return_type(call->func, fci->retval);
+ ZEND_ASSERT(result);
+ }
ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
? Z_ISREF_P(fci->retval) : !Z_ISREF_P(fci->retval));
}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 9cffc64a0ff..9d0f0f398b5 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -4154,8 +4154,10 @@ ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
if (should_throw) {
zend_internal_call_arginfo_violation(call->func);
}
- ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
+ if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+ bool result = zend_verify_internal_return_type(call->func, ret);
+ ZEND_ASSERT(result);
+ }
ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
zend_verify_internal_func_info(call->func, ret);
@@ -4283,8 +4285,10 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL,OBSERVER))
if (should_throw) {
zend_internal_call_arginfo_violation(call->func);
}
- ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
+ if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+ bool result = zend_verify_internal_return_type(call->func, ret);
+ ZEND_ASSERT(result);
+ }
ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
zend_verify_internal_func_info(call->func, ret);
@@ -4412,8 +4416,10 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
if (should_throw) {
zend_internal_call_arginfo_violation(call->func);
}
- ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
+ if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+ bool result = zend_verify_internal_return_type(call->func, ret);
+ ZEND_ASSERT(result);
+ }
ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
zend_verify_internal_func_info(call->func, ret);
@@ -9119,8 +9125,10 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY, SPEC(OBSERVER))
if (should_throw) {
zend_internal_call_arginfo_violation(call->func);
}
- ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
- zend_verify_internal_return_type(call->func, ret));
+ if (call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+ bool result = zend_verify_internal_return_type(call->func, ret);
+ ZEND_ASSERT(result);
+ }
ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
zend_verify_internal_func_info(call->func, ret);
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 7359bcb793f..2bfb82f421e 100644
Binary files a/Zend/zend_vm_execute.h and b/Zend/zend_vm_execute.h differ