mirror of
https://github.com/php/php-src.git
synced 2024-09-22 18:37:25 +00:00
Added missing consistency check for abstract methods required by one trait and implemented by another.
This commit is contained in:
parent
bba44800ae
commit
ce0ddd5a34
25
Zend/tests/traits/bugs/abstract-methods05.phpt
Normal file
25
Zend/tests/traits/bugs/abstract-methods05.phpt
Normal file
@ -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
|
26
Zend/tests/traits/bugs/abstract-methods06.phpt
Normal file
26
Zend/tests/traits/bugs/abstract-methods06.phpt
Normal file
@ -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
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user