--- /dev/null
+--TEST--
+Bug #33732 (Wrong behavior of constants in class and interface extending)
+--FILE--
+<?php
+interface iA {
+ const cA = "const of iA\n";
+}
+
+class A implements iA {
+}
+
+class B extends A implements iA {
+}
+
+echo iA::cA;
+echo A::cA;
+echo B::cA;
+
+
+interface iA2 {
+ const cA = "const of iA2\n";
+}
+
+interface iB2 extends iA2 {
+}
+
+class A2 implements iA2 {
+}
+
+class B2 extends A2 implements iB2 {
+}
+
+echo iA2::cA;
+echo A2::cA;
+echo iB2::cA;
+echo B2::cA;
+?>
+--EXPECT--
+const of iA
+const of iA
+const of iA
+const of iA2
+const of iA2
+const of iA2
+const of iA2
}
-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;