]> granicus.if.org Git - php/commitdiff
Revert "Inheritance checks should not ignore parents if these implement an interface"
authorJoe Watkins <krakjoe@php.net>
Wed, 1 Feb 2017 18:33:58 +0000 (18:33 +0000)
committerJoe Watkins <krakjoe@php.net>
Wed, 1 Feb 2017 18:34:14 +0000 (18:34 +0000)
This reverts commit b67eb3440bb244adf6957bf2c68aeeaa6efc8c8d.

NEWS
Zend/tests/bug62358.phpt
Zend/tests/bug73987.phpt [deleted file]
Zend/tests/bug73987_1.phpt [deleted file]
Zend/zend_inheritance.c

diff --git a/NEWS b/NEWS
index 6514e485aa08c0d18ac219aca7fdcb2bd8ab316e..7f600d8f4acd7def848403d23f7171f3356418f9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,8 +15,6 @@ PHP                                                                        NEWS
   . Fixed bug #73969 (segfault in debug_print_backtrace). (andrewnester)
   . Fixed bug #73994 (arginfo incorrect for unpack). (krakjoe)
   . Fixed bug #73973 (assertion error in debug_zval_dump). (andrewnester)
-  . Fixed bug #73987 (Method compatibility check looks to original 
-    definition and not parent). (pmmaga)
 
 - DOM:
   . Fixed bug #54382 (getAttributeNodeNS doesn't get xmlns* attributes).
index 8509383d469486d57b816ba4e582d91020a377d3..35bbc33835b0d557f90ed78e57f2c1c2c51638f5 100644 (file)
@@ -23,4 +23,4 @@ class B extends A {
 }
 ?>
 --EXPECTF--
-Fatal error: Declaration of B::foo($var) must be compatible with A::foo() in %sbug62358.php on line 17
+Fatal error: Declaration of B::foo($var) must be compatible with I::foo() in %sbug62358.php on line 17
diff --git a/Zend/tests/bug73987.phpt b/Zend/tests/bug73987.phpt
deleted file mode 100644 (file)
index 5515656..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
---TEST--
-Bug #73987 (Method compatibility check looks to original definition and not parent)
---FILE--
-<?php
-
-interface I {
-  public function example($a, $b, $c);
-}
-class A implements I {
-  public function example($a, $b = null, $c = null) { } // compatible with I::example
-}
-class B extends A {
-  public function example($a, $b, $c = null) { } // compatible with I::example
-}
-
-?>
---EXPECTF--
-Fatal error: Declaration of B::example($a, $b, $c = NULL) must be compatible with A::example($a, $b = NULL, $c = NULL) in %s
diff --git a/Zend/tests/bug73987_1.phpt b/Zend/tests/bug73987_1.phpt
deleted file mode 100644 (file)
index 6a0a157..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
---TEST--
-Bug #73987 (Method compatibility check looks to original definition and not parent)
---FILE--
-<?php
-
-interface I {
-  public function example();
-}
-class A implements I {
-  public function example(): int { } // compatible with I::example
-}
-class B extends A {
-  public function example(): string { } // compatible with I::example
-}
-
-?>
---EXPECTF--
-Fatal error: Declaration of B::example(): string must be compatible with A::example(): int in %s
index 8ad5cc2e01b23879c419d8a765eefa74d4fd4a9c..fd1345f844fa554e7db5f565ca0a34d60ba00efb 100644 (file)
@@ -607,12 +607,13 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
        } else if (!(parent->common.fn_flags & ZEND_ACC_CTOR) || (parent->common.prototype && (parent->common.prototype->common.scope->ce_flags & ZEND_ACC_INTERFACE))) {
                /* ctors only have a prototype if it comes from an interface */
                child->common.prototype = parent->common.prototype ? parent->common.prototype : parent;
-               /* and if that is the case, we want to check inheritance against it */
-               if (parent->common.fn_flags & ZEND_ACC_CTOR) {
-                       parent = child->common.prototype;
-               }
        }
 
+       if (child->common.prototype && (
+               child->common.prototype->common.fn_flags & ZEND_ACC_ABSTRACT
+       )) {
+               parent = child->common.prototype;
+       }
        if (UNEXPECTED(!zend_do_perform_implementation_check(child, parent))) {
                int error_level;
                const char *error_verb;