From 179ed6e43d9703fe6bdaa286aec79f7e131a8ab0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pedro=20Magalh=C3=A3es?= Date: Sat, 30 Sep 2017 21:24:38 +0100 Subject: [PATCH] 63911: Compare opcodes of the op_array to determine different functions --- NEWS | 2 ++ Zend/tests/traits/bug63911.phpt | 26 ++++++++++++++++++++++++++ Zend/zend_inheritance.c | 5 +++++ 3 files changed, 33 insertions(+) create mode 100644 Zend/tests/traits/bug63911.phpt diff --git a/NEWS b/NEWS index 152e3de3df..a86a3bfc00 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ PHP NEWS files). (petk) . Fixed bug #74922 (Composed class has fatal error with duplicate, equal const properties). (pmmaga) + . Fixed bug #63911 (identical trait methods raise errors during composition). + (pmmaga) - BCMath: . Fixed bug #66364 (BCMath bcmul ignores scale parameter). (cmb) diff --git a/Zend/tests/traits/bug63911.phpt b/Zend/tests/traits/bug63911.phpt new file mode 100644 index 0000000000..72892cdd34 --- /dev/null +++ b/Zend/tests/traits/bug63911.phpt @@ -0,0 +1,26 @@ +--TEST-- +Bug #63911 (Ignore conflicting trait methods originationg from identical sub traits) +--FILE-- +a(); +--EXPECT-- +Done diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index c7391f96f7..7f253d90ea 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1165,6 +1165,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 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) { + return; + } + if (existing_fn->common.scope == ce) { /* members from the current class override trait methods */ /* use temporary *overriden HashTable to detect hidden conflict */ -- 2.40.0