diff options
author | Stefan Marr <gron@php.net> | 2011-11-01 13:42:53 +0000 |
---|---|---|
committer | Stefan Marr <gron@php.net> | 2011-11-01 13:42:53 +0000 |
commit | 9b0d73af1d8a59f48336bc60513f44edd4d4c34d (patch) | |
tree | a8cd6afcd8be342c6a122bea63969b83b655da11 /Zend | |
parent | ceac9dc4902795ee615d9e089a29434bd77c4cdb (diff) | |
download | php-git-9b0d73af1d8a59f48336bc60513f44edd4d4c34d.tar.gz |
Added missing consistency check for abstract methods required by one trait and implemented by another.
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/tests/traits/bugs/abstract-methods05.phpt | 25 | ||||
-rw-r--r-- | Zend/tests/traits/bugs/abstract-methods06.phpt | 26 | ||||
-rw-r--r-- | Zend/zend_compile.c | 6 |
3 files changed, 57 insertions, 0 deletions
diff --git a/Zend/tests/traits/bugs/abstract-methods05.phpt b/Zend/tests/traits/bugs/abstract-methods05.phpt new file mode 100644 index 0000000000..e90ce39a32 --- /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-- +<?php +error_reporting(E_ALL); + +trait THelloB { + public function hello() { + echo 'Hello'; + } +} + +trait THelloA { + public abstract function hello($a); +} + +class TraitsTest1 { + use THelloB; + use THelloA; +} + + +?> +--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 0000000000..fdcd816961 --- /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-- +<?php +error_reporting(E_ALL); + +trait THelloB { + public function hello() { + echo 'Hello'; + } +} + +trait THelloA { + public abstract function hello($a); +} + +class TraitsTest1 { + use THelloA; + use THelloB; +} + + + +?> +--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 bf8a35d3ed..cb79e34bed 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 { |