]> granicus.if.org Git - php/commitdiff
Fix bug using not set temporary with typed generator returns
authorBob Weinand <bobwei9@hotmail.com>
Fri, 24 Jul 2015 18:30:32 +0000 (20:30 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Fri, 24 Jul 2015 18:31:18 +0000 (20:31 +0200)
Zend/tests/generators/generator_return_return_type.phpt [new file with mode: 0644]
Zend/zend_opcode.c

diff --git a/Zend/tests/generators/generator_return_return_type.phpt b/Zend/tests/generators/generator_return_return_type.phpt
new file mode 100644 (file)
index 0000000..8045422
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Generators must return a valid variable with return type specified
+--FILE--
+<?php
+
+$gen = (function (): Generator {
+    return true;
+    yield;
+})();
+
+var_dump($gen->valid());
+var_dump($gen->getReturn());
+
+?>
+--EXPECT--
+bool(false)
+bool(true)
index ba952a486791398829a8c67bf59b3b456a0b8087..c42f3807e4d5b76e0cf5bd1f4a2f7f411ed7d14f 100644 (file)
@@ -583,7 +583,7 @@ static void zend_resolve_finally_call(zend_op_array *op_array, uint32_t op_num,
                        fast_call_var = op_array->opcodes[op_array->try_catch_array[i].finally_end].op1.var;
 
                        /* generate a FAST_CALL to finally block */
-                   start_op = get_next_op_number(op_array);
+                       start_op = get_next_op_number(op_array);
 
                        opline = get_next_op(op_array);
                        opline->opcode = ZEND_FAST_CALL;
@@ -807,6 +807,10 @@ ZEND_API int pass_two(zend_op_array *op_array)
                                break;
                        case ZEND_VERIFY_RETURN_TYPE:
                                if (op_array->fn_flags & ZEND_ACC_GENERATOR) {
+                                       if (opline->op1_type != IS_UNUSED) {
+                                               (opline + 1)->op1 = opline->op1;
+                                               (opline + 1)->op1_type = opline->op1_type;
+                                       }
                                        MAKE_NOP(opline);
                                }
                                break;