]> 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:26:43 +0000 (09:26 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 23 Nov 2005 09:26:43 +0000 (09:26 +0000)
NEWS
Zend/tests/bug33732.phpt [new file with mode: 0755]
Zend/zend_compile.c

diff --git a/NEWS b/NEWS
index e76e29aa30f25f04f7342dd42ef7a7fc374dee31..8187bdf2e61a7eb46dbe3aec86b430ce83af8c22 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,8 @@ PHP                                                                        NEWS
   on Linux). (Patch: shulmanb at il dot ibm dot com, Jani)
 - Fixed bug #35143 (gettimeofday() ignores current time zone). (Derick)
 - Fixed bug #35046 (phpinfo() uses improper css enclosure). (Ilia)
+- Fixed bug #33732 (Wrong behavior of constants in class and interface
+  extending). (Dmitry)
 - Fixed bug #33153 (crash in mssql_next result). (Frank)
 - Fixed bug #33963 (mssql_bind() fails on input parameters). (Frank)
 - Fixed bug #33201 (Crash when fetching some data types). (Frank)
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 71ef13eb38bbff40ffa119e3ecddb25560b2ec64..93aeb757f8cae1d23f9df0a0d3d120d004cf1873 100644 (file)
@@ -2208,10 +2208,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_hash_quick_exists(child_constants_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h)) {
-               zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited constant %s from interface %s", hash_key->arKey, iface->name);
+       zval **old_constant;
+
+       if (zend_hash_quick_find(child_constants_table, hash_key->arKey, 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 %s from interface %s", hash_key->arKey, iface->name);
+               }
                return 0; 
        }
        return 1;