]> granicus.if.org Git - php/commitdiff
Bug #33732 (Wrong behavior of constants in class and interface extending)
authorDmitry Stogov <dmitry@php.net>
Wed, 23 Nov 2005 09:27:01 +0000 (09:27 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 23 Nov 2005 09:27:01 +0000 (09:27 +0000)
Zend/tests/bug33732.phpt [new file with mode: 0755]
Zend/zend_compile.c

diff --git a/Zend/tests/bug33732.phpt b/Zend/tests/bug33732.phpt
new file mode 100755 (executable)
index 0000000..f1e5a14
--- /dev/null
@@ -0,0 +1,45 @@
+--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
index 030fc2168f85e114bf78b70d12746f4b1b579d99..44f91c3426e6f1e90c2ae085cd208d176143e7a9 100644 (file)
@@ -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;