]> granicus.if.org Git - php/commitdiff
Fixed bug #80391
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 24 Nov 2020 09:09:28 +0000 (10:09 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 24 Nov 2020 09:09:28 +0000 (10:09 +0100)
Iterable was not considered a subtype of array|object, and thus
also not a subtype of mixed.

NEWS
Zend/tests/bug80391.phpt [new file with mode: 0644]
Zend/zend_inheritance.c

diff --git a/NEWS b/NEWS
index a3923e6972131923de0d9c85860054ee1ff23c00..bd3a10adfa76f9002374d125c69468a672092520 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ PHP                                                                        NEWS
   . Fixed bug #80345 (PHPIZE configuration has outdated PHP_RELEASE_VERSION).
     (cmb)
   . Fixed bug #72964 (White space not unfolded for CC/Bcc headers). (cmb)
+  . Fixed bug #80391 (Iterable not covariant to mixed). (Nikita)
 
 - Tidy:
   . Fixed bug #77594 (ob_tidyhandler is never reset). (cmb)
diff --git a/Zend/tests/bug80391.phpt b/Zend/tests/bug80391.phpt
new file mode 100644 (file)
index 0000000..f483ed8
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+Iterable not covariant to mixed
+--FILE--
+<?php
+
+class A {
+    public function method1(): mixed {}
+    public function method2(): array|object {}
+    public function method3(iterable $x) {}
+    public function method4(iterable $x) {}
+}
+
+class B extends A {
+    public function method1(): iterable {}
+    public function method2(): iterable {}
+    public function method3(mixed $x) {}
+    public function method4(array|object $x) {}
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
index 7401456d8f09b6e4befc97583754ed7eae453f1e..882738b75858134df06269c11f2aa036fa27042e 100644 (file)
@@ -323,6 +323,10 @@ static zend_bool unlinked_instanceof(zend_class_entry *ce1, zend_class_entry *ce
 
 static zend_bool zend_type_contains_traversable(zend_type type) {
        zend_type *single_type;
+       if (ZEND_TYPE_FULL_MASK(type) & MAY_BE_OBJECT) {
+               return 1;
+       }
+
        ZEND_TYPE_FOREACH(type, single_type) {
                if (ZEND_TYPE_HAS_NAME(*single_type)
                                && zend_string_equals_literal_ci(ZEND_TYPE_NAME(*single_type), "Traversable")) {