]> granicus.if.org Git - php/commitdiff
Fix resolution of "parent" during inheritance check
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 8 May 2019 09:33:13 +0000 (11:33 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 8 May 2019 09:35:26 +0000 (11:35 +0200)
We can't assume that the method we're checking against is part of
the parent class...

Zend/tests/type_declarations/parent_is_not_proto.phpt [new file with mode: 0644]
Zend/zend_inheritance.c

diff --git a/Zend/tests/type_declarations/parent_is_not_proto.phpt b/Zend/tests/type_declarations/parent_is_not_proto.phpt
new file mode 100644 (file)
index 0000000..f6ee536
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+The parent class is not necessarily the class of the prototype
+--FILE--
+<?php
+
+class A {
+    function test(): B {}
+}
+class B extends A {}
+class C extends B {
+    function test(): parent {}
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
index 2d51ed150edacbe552ebb6ffb1e025aaea2ac2be..fac74a28f0e4a3f7d6a09cbe78f59e96d0b8dd43 100644 (file)
@@ -193,8 +193,8 @@ static int zend_do_perform_type_hint_check(const zend_function *fe, zend_arg_inf
                fe_class_name = ZEND_TYPE_NAME(fe_arg_info->type);
                class_name = ZSTR_VAL(fe_class_name);
                class_name_len = ZSTR_LEN(fe_class_name);
-               if (class_name_len == sizeof("parent")-1 && !strcasecmp(class_name, "parent") && proto->common.scope) {
-                       fe_class_name = zend_string_copy(proto->common.scope->name);
+               if (class_name_len == sizeof("parent")-1 && !strcasecmp(class_name, "parent") && fe->common.scope && fe->common.scope->parent) {
+                       fe_class_name = zend_string_copy(fe->common.scope->parent->name);
                } else if (class_name_len == sizeof("self")-1 && !strcasecmp(class_name, "self") && fe->common.scope) {
                        fe_class_name = zend_string_copy(fe->common.scope->name);
                } else {