Skip to content

Commit 6a80137

Browse files
committed
Allow generators to have a real return type of mixed
Fixes an edge case overlooked in php#5313
1 parent 0386cbb commit 6a80137

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

Zend/tests/return_types/generators001.phpt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,15 @@ function test3() : Traversable {
1414
yield 3;
1515
}
1616

17+
function test4() : mixed {
18+
yield 3;
19+
}
20+
1721
var_dump(
1822
test1(),
1923
test2(),
20-
test3()
24+
test3(),
25+
test4(),
2126
);
2227
--EXPECTF--
2328
object(Generator)#%d (%d) {
@@ -26,3 +31,5 @@ object(Generator)#%d (%d) {
2631
}
2732
object(Generator)#%d (%d) {
2833
}
34+
object(Generator)#%d (%d) {
35+
}

Zend/tests/return_types/generators002.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ function test1() : StdClass {
66
yield 1;
77
}
88
--EXPECTF--
9-
Fatal error: Generators may only declare a return type containing Generator, Iterator, Traversable, or iterable, StdClass is not permitted in %s on line %d
9+
Fatal error: Generators may only declare a return type containing Generator, Iterator, Traversable, iterable, or mixed, StdClass is not permitted in %s on line %d

Zend/zend_compile.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,8 @@ static void zend_mark_function_as_generator() /* {{{ */
12631263

12641264
if (CG(active_op_array)->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
12651265
zend_type return_type = CG(active_op_array)->arg_info[-1].type;
1266-
zend_bool valid_type = (ZEND_TYPE_FULL_MASK(return_type) & MAY_BE_ITERABLE) != 0;
1266+
zend_bool valid_type = (ZEND_TYPE_FULL_MASK(return_type) & MAY_BE_ITERABLE) != 0 ||
1267+
ZEND_TYPE_FULL_MASK(return_type) == MAY_BE_ANY;
12671268
if (!valid_type) {
12681269
zend_type *single_type;
12691270
ZEND_TYPE_FOREACH(return_type, single_type) {
@@ -1279,7 +1280,7 @@ static void zend_mark_function_as_generator() /* {{{ */
12791280
zend_string *str = zend_type_to_string(return_type);
12801281
zend_error_noreturn(E_COMPILE_ERROR,
12811282
"Generators may only declare a return type containing " \
1282-
"Generator, Iterator, Traversable, or iterable, %s is not permitted",
1283+
"Generator, Iterator, Traversable, iterable, or mixed, %s is not permitted",
12831284
ZSTR_VAL(str));
12841285
}
12851286
}

0 commit comments

Comments
 (0)