com php-src: Inheritance checks should not ignore parents if these implement an interface: Zend/tests/bug62358.phpt Zend/tests/bug73987.phpt
Zend/tests/bug73987_1.phpt Zend/zend_inheri tance.c
| From: | Joe Watkins | Date: | Sat, 28 Jan 2017 06:28:10 +0000 |
| Subject: | com php-src: Inheritance checks should not ignore parents if these implement an interface: Zend/tests/bug62358.phpt Zend/tests/bug73987.phpt Zend/tests/bug73987_1.phpt Zend/zend_inheri tance.c |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-96890@lists.php.net to get a copy of this message | ||
Commit: b67eb3440bb244adf6957bf2c68aeeaa6efc8c8d
Author: Pedro Magalhães <mail@pmmaga.net> Thu, 26 Jan 2017 23:50:56 +0100
Committer: Joe Watkins <krakjoe@php.net> Sat, 28 Jan 2017 06:28:10 +0000
Parents: bf914ff75a79aaacffebf689e6dd2b17175070b0
Branches: PHP-7.1 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=b67eb3440bb244adf6957bf2c68aeeaa6efc8c8d
Log:
Inheritance checks should not ignore parents if these implement an interface
Changed paths:
M Zend/tests/bug62358.phpt
A Zend/tests/bug73987.phpt
A Zend/tests/bug73987_1.phpt
M Zend/zend_inheritance.c
Diff:
diff --git a/Zend/tests/bug62358.phpt b/Zend/tests/bug62358.phpt
index 35bbc33..8509383 100644
--- a/Zend/tests/bug62358.phpt
+++ b/Zend/tests/bug62358.phpt
@@ -23,4 +23,4 @@ class B extends A {
}
?>
--EXPECTF--
-Fatal error: Declaration of B::foo($var) must be compatible with I::foo() in %sbug62358.php on line
17
+Fatal error: Declaration of B::foo($var) must be compatible with A::foo() in %sbug62358.php on line
17
diff --git a/Zend/tests/bug73987.phpt b/Zend/tests/bug73987.phpt
new file mode 100644
index 0000000..5515656
--- /dev/null
+++ b/Zend/tests/bug73987.phpt
@@ -0,0 +1,18 @@
+--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
new file mode 100644
index 0000000..6a0a157
--- /dev/null
+++ b/Zend/tests/bug73987_1.phpt
@@ -0,0 +1,18 @@
+--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
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index fd1345f..8ad5cc2 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -607,13 +607,12 @@ 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;