summaryrefslogtreecommitdiff
path: root/Zend/zend_inheritance.c
diff options
context:
space:
mode:
authorChris Wright <daverandom@php.net>2018-08-21 17:40:06 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2018-08-22 14:08:15 +0200
commit9ace33b9c5d06b869b2aec577b119b0494840931 (patch)
tree3b506ba85f2b378312f6e73f2091c89c9aebed48 /Zend/zend_inheritance.c
parent02b0bc8bb1f3fec949cea616f0092c3f9d8bdb4a (diff)
downloadphp-git-9ace33b9c5d06b869b2aec577b119b0494840931.tar.gz
Fix #76773 - Methods with a concrete scope need to be added again
Diffstat (limited to 'Zend/zend_inheritance.c')
-rw-r--r--Zend/zend_inheritance.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index 8af409f191..d692f3410c 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -1178,10 +1178,11 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s
zend_function *new_fn;
if ((existing_fn = zend_hash_find_ptr(&ce->function_table, key)) != NULL) {
- /* if it is the same function with the same visibility regardless of where it is coming from */
- /* there is no conflict and we do not need to add it again */
+ /* if it is the same function with the same visibility and has not been assigned a class scope yet, regardless
+ * of where it is coming from there is no conflict and we do not need to add it again */
if (existing_fn->op_array.opcodes == fn->op_array.opcodes &&
- (existing_fn->common.fn_flags & ZEND_ACC_PPP_MASK) == (fn->common.fn_flags & ZEND_ACC_PPP_MASK)) {
+ (existing_fn->common.fn_flags & ZEND_ACC_PPP_MASK) == (fn->common.fn_flags & ZEND_ACC_PPP_MASK) &&
+ (existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
return;
}