Fixed Bug #61052 (Missing error check in trait 'insteadof' clause)

This commit is contained in:
Stefan Marr 2012-03-04 19:34:19 +00:00
parent 3e6bc8fbce
commit 520d07d86a
2 changed files with 34 additions and 1 deletions

View File

@ -0,0 +1,18 @@
--TEST--
Bug #61052 (missing error check in trait 'insteadof' clause)
--FILE--
<?php
trait T1 {
function foo(){ echo "T1\n"; }
}
trait T2 {
function foo(){ echo "T2\n"; }
}
class C {
use T1, T2 {
T1::foo insteadof T1;
}
}
C::foo();
--EXPECTF--
Fatal error: Inconsistent insteadof definition. The method foo is to be used from T1, but T1 is also on the exclude list in %s on line %d

View File

@ -3984,13 +3984,28 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
/** With the other traits, we are more permissive.
We do not give errors for those. This allows to be more
defensive in such definitions. */
defensive in such definitions.
However, we want to make sure that the insteadof declartion
is consistent in itself.
*/
j = 0;
while (cur_precedence->exclude_from_classes[j]) {
char* class_name = (char*)cur_precedence->exclude_from_classes[j];
zend_uint name_length = strlen(class_name);
cur_precedence->exclude_from_classes[j] = zend_fetch_class(class_name, name_length, ZEND_FETCH_CLASS_TRAIT TSRMLS_CC);
/* make sure that the trait method is not from a class mentioned in
exclude_from_classes, for consistency */
if (cur_precedence->trait_method->ce == cur_precedence->exclude_from_classes[i]) {
zend_error(E_COMPILE_ERROR,
"Inconsistent insteadof definition. "
"The method %s is to be used from %s, but %s is also on the exclude list",
cur_method_ref->method_name,
cur_precedence->trait_method->ce->name,
cur_precedence->trait_method->ce->name);
}
efree(class_name);
j++;
}