diff --git a/Zend/tests/generators/return_from_by_ref_generator.phpt b/Zend/tests/generators/return_from_by_ref_generator.phpt index 32bebfbbde963..db43a7008fea3 100644 --- a/Zend/tests/generators/return_from_by_ref_generator.phpt +++ b/Zend/tests/generators/return_from_by_ref_generator.phpt @@ -16,5 +16,6 @@ function gen2() { gen2()->next(); ?> ---EXPECT-- +--EXPECTF-- +Notice: Only variable references should be yielded by reference in %s on line %d int(42) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 26cb95c8f94ca..c998bc612418f 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -7620,7 +7620,7 @@ ZEND_VM_HOT_NOCONST_HANDLER(198, ZEND_JMP_NULL, CONST|TMP|VAR|CV, JMP_ADDR) uint32_t short_circuiting_type = opline->extended_value & ZEND_SHORT_CIRCUITING_CHAIN_MASK; if (EXPECTED(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) { ZVAL_NULL(result); - if (OP1_TYPE == IS_CV + if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF) && (opline->extended_value & ZEND_JMP_NULL_BP_VAR_IS) == 0 ) { @@ -8196,6 +8196,10 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMPVAR|CV|UNUSED } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 39bdd2e80b8ac..133666441062b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -7638,6 +7638,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -9795,6 +9799,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMPVAR_HANDLE } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -10645,6 +10653,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLE } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -12177,6 +12189,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZE } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -19997,6 +20013,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -20437,6 +20457,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMPVAR_HANDLER( } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -20898,6 +20922,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER( } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -21298,6 +21326,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -25175,6 +25207,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(Z } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -27473,6 +27509,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMPVAR_HANDLER( } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -29372,6 +29412,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER( } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -31751,6 +31795,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -33890,6 +33938,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -35635,6 +35687,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMPVAR_HANDL } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -36177,6 +36233,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDL } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -38112,6 +38172,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(Z } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -43321,6 +43385,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZE } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -46883,6 +46951,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMPVAR_HANDLER(Z } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -48689,6 +48761,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(Z } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); } @@ -52285,6 +52361,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_ } } } else { + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } + /* If no value was specified yield null */ ZVAL_NULL(&generator->value); }