summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-05-08 11:33:13 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-05-08 11:35:26 +0200
commitd19b6aa5ba6ea7b488cca748934264e11469f3d5 (patch)
tree3e6519e91688410a00085cc817b127e48349f7b7
parent9977de00284c2b702e4aadfcc66069befa0aaf75 (diff)
downloadphp-git-d19b6aa5ba6ea7b488cca748934264e11469f3d5.tar.gz
Fix resolution of "parent" during inheritance check
We can't assume that the method we're checking against is part of the parent class...
-rw-r--r--Zend/tests/type_declarations/parent_is_not_proto.phpt17
-rw-r--r--Zend/zend_inheritance.c4
2 files changed, 19 insertions, 2 deletions
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
index 0000000000..f6ee536547
--- /dev/null
+++ b/Zend/tests/type_declarations/parent_is_not_proto.phpt
@@ -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===
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index 2d51ed150e..fac74a28f0 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -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 {