summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-05-08 11:38:10 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-05-08 11:38:10 +0200
commit97cce70e550f251bb469576a130470e1d699a3a2 (patch)
treec00d5b7fe96147aaa508cce7318f09fa0a8d53d0
parent7647f5401caedee0a824f687d792aa352502f82a (diff)
parentd5ef9c5b289a31e1c3618916607ca3f68e06f9c0 (diff)
downloadphp-git-97cce70e550f251bb469576a130470e1d699a3a2.tar.gz
Merge branch 'PHP-7.4'
-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 48e277d5d8..70e2dcdfd4 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -195,8 +195,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 {