summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-05-08 11:37:49 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-05-08 11:37:49 +0200
commite2ef4e9e2fa8cdb749ce4c2afdd3499765ffb721 (patch)
treeff60a0cba8399d105feba1e26a5daff9eec7605a
parentd153fbc5a935a73e95bfb1c13f82208c4983aa2f (diff)
parentd19b6aa5ba6ea7b488cca748934264e11469f3d5 (diff)
downloadphp-git-e2ef4e9e2fa8cdb749ce4c2afdd3499765ffb721.tar.gz
Merge branch 'PHP-7.2' into PHP-7.3
-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 eed2074729..0b0cb314b6 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -208,8 +208,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 {