From: Dmitry Stogov Date: Wed, 23 Nov 2005 09:27:01 +0000 (+0000) Subject: Bug #33732 (Wrong behavior of constants in class and interface extending) X-Git-Tag: RELEASE_2_0_2~119 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=98b8a0fdb9e2690c621b52ad6e4ca0a697921cef;p=php Bug #33732 (Wrong behavior of constants in class and interface extending) --- diff --git a/Zend/tests/bug33732.phpt b/Zend/tests/bug33732.phpt new file mode 100755 index 0000000000..f1e5a14956 --- /dev/null +++ b/Zend/tests/bug33732.phpt @@ -0,0 +1,45 @@ +--TEST-- +Bug #33732 (Wrong behavior of constants in class and interface extending) +--FILE-- + +--EXPECT-- +const of iA +const of iA +const of iA +const of iA2 +const of iA2 +const of iA2 +const of iA2 diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 030fc2168f..44f91c3426 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2317,10 +2317,14 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent } -static zend_bool do_inherit_constant_check(HashTable *child_constants_table, zval *parent_constant, zend_hash_key *hash_key, zend_class_entry *iface) +static zend_bool do_inherit_constant_check(HashTable *child_constants_table, zval **parent_constant, zend_hash_key *hash_key, zend_class_entry *iface) { - if (zend_u_hash_quick_exists(child_constants_table, hash_key->type, hash_key->u.string, hash_key->nKeyLength, hash_key->h)) { - zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %R from interface %v", hash_key->type, hash_key->u.string, iface->name); + zval **old_constant; + + if (zend_u_hash_quick_find(child_constants_table, hash_key->type, hash_key->u.string, hash_key->nKeyLength, hash_key->h, (void**)&old_constant) == SUCCESS) { + if (*old_constant != *parent_constant) { + zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %R from interface %v", hash_key->type, hash_key->u.string, iface->name); + } return 0; } return 1;