diff --git a/Zend/tests/traits/bugs/abstract-methods05.phpt b/Zend/tests/traits/bugs/abstract-methods05.phpt new file mode 100644 index 00000000000..e90ce39a321 --- /dev/null +++ b/Zend/tests/traits/bugs/abstract-methods05.phpt @@ -0,0 +1,25 @@ +--TEST-- +The compatibility with the signature of abstract methods should be checked. +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of THelloB::hello() must be compatible with THelloA::hello($a) in %s on line %d \ No newline at end of file diff --git a/Zend/tests/traits/bugs/abstract-methods06.phpt b/Zend/tests/traits/bugs/abstract-methods06.phpt new file mode 100644 index 00000000000..fdcd8169615 --- /dev/null +++ b/Zend/tests/traits/bugs/abstract-methods06.phpt @@ -0,0 +1,26 @@ +--TEST-- +The compatibility with the signature of abstract methods should be checked. (also checking the second possible implementation branch) +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of THelloB::hello() must be compatible with THelloA::hello($a) in %s on line %d \ No newline at end of file diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index bf8a35d3ed9..cb79e34bed2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3616,6 +3616,9 @@ static int zend_traits_merge_functions(zend_function *fn TSRMLS_DC, int num_args if (zend_hash_quick_find(function_tables[i], hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void **)&other_trait_fn) == SUCCESS) { /* if it is an abstract method, there is no collision */ if (other_trait_fn->common.fn_flags & ZEND_ACC_ABSTRACT) { + /* Make sure they are compatible */ + do_inheritance_check_on_method(fn, other_trait_fn TSRMLS_CC); + /* we can savely free and remove it from other table */ zend_function_dtor(other_trait_fn); zend_hash_quick_del(function_tables[i], hash_key->arKey, hash_key->nKeyLength, hash_key->h); @@ -3623,6 +3626,9 @@ static int zend_traits_merge_functions(zend_function *fn TSRMLS_DC, int num_args /* if it is not an abstract method, there is still no collision */ /* if fn is an abstract method */ if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) { + /* Make sure they are compatible */ + do_inheritance_check_on_method(other_trait_fn, fn TSRMLS_CC); + /* just mark as solved, will be added if its own trait is processed */ abstract_solved = 1; } else {