From 38b19d47e0a1b99cd462987be84cd7f345d983d9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 27 Sep 2019 14:52:20 +0200 Subject: [PATCH] Convert "Only arrays and Traversables can be unpacked" into Error --- UPGRADING | 3 +- Zend/tests/arg_unpack/invalid_type.phpt | 72 ++++++++++--------------- Zend/zend_vm_def.h | 6 +-- Zend/zend_vm_execute.h | 6 +-- 4 files changed, 36 insertions(+), 51 deletions(-) diff --git a/UPGRADING b/UPGRADING index 28f1fbb477..0a2b00db59 100644 --- a/UPGRADING +++ b/UPGRADING @@ -94,7 +94,8 @@ PHP 8.0 UPGRADE NOTES is already used. * Attempting to use an invalid type (array or object) as an array key or string offset. - * Attempting to write to an index of a scalar value. + * Attempting to write to an array index of a scalar value. + * Attempting to unpack a non-array/Traversable. RFC: Part of https://wiki.php.net/rfc/engine_warnings diff --git a/Zend/tests/arg_unpack/invalid_type.phpt b/Zend/tests/arg_unpack/invalid_type.phpt index 1ef545558c..ad580c37ae 100644 --- a/Zend/tests/arg_unpack/invalid_type.phpt +++ b/Zend/tests/arg_unpack/invalid_type.phpt @@ -7,53 +7,37 @@ function test(...$args) { var_dump($args); } -test(...null); -test(...42); -test(...new stdClass); - -test(1, 2, 3, ..."foo", ...[4, 5]); -test(1, 2, 3, ...new StdClass, ...3.14, ...[4, 5]); - -?> ---EXPECTF-- -Warning: Only arrays and Traversables can be unpacked in %s on line %d -array(0) { +try { + test(...null); +} catch (Error $e) { + echo $e->getMessage(), "\n"; } - -Warning: Only arrays and Traversables can be unpacked in %s on line %d -array(0) { +try { + test(...42); +} catch (Error $e) { + echo $e->getMessage(), "\n"; } - -Warning: Only arrays and Traversables can be unpacked in %s on line %d -array(0) { +try { + test(...new stdClass); +} catch (Error $e) { + echo $e->getMessage(), "\n"; } -Warning: Only arrays and Traversables can be unpacked in %s on line %d -array(5) { - [0]=> - int(1) - [1]=> - int(2) - [2]=> - int(3) - [3]=> - int(4) - [4]=> - int(5) +try { + test(1, 2, 3, ..."foo", ...[4, 5]); +} catch (Error $e) { + echo $e->getMessage(), "\n"; } - -Warning: Only arrays and Traversables can be unpacked in %s on line %d - -Warning: Only arrays and Traversables can be unpacked in %s on line %d -array(5) { - [0]=> - int(1) - [1]=> - int(2) - [2]=> - int(3) - [3]=> - int(4) - [4]=> - int(5) +try { + test(1, 2, 3, ...new StdClass, ...3.14, ...[4, 5]); +} catch (Error $e) { + echo $e->getMessage(), "\n"; } + +?> +--EXPECT-- +Only arrays and Traversables can be unpacked +Only arrays and Traversables can be unpacked +Only arrays and Traversables can be unpacked +Only arrays and Traversables can be unpacked +Only arrays and Traversables can be unpacked diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a146341b0c..7d9eab21f3 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4969,7 +4969,7 @@ ZEND_VM_C_LABEL(send_again): zend_object_iterator *iter; if (!ce || !ce->get_iterator) { - zend_error(E_WARNING, "Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked"); } else { iter = ce->get_iterator(ce, args, 0); @@ -5046,7 +5046,7 @@ ZEND_VM_C_LABEL(send_again): if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } - zend_error(E_WARNING, "Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked"); } FREE_OP1(); @@ -5752,7 +5752,7 @@ ZEND_VM_C_LABEL(add_unpack_again): zend_object_iterator *iter; if (!ce || !ce->get_iterator) { - zend_throw_error(NULL, "Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked"); } else { iter = ce->get_iterator(ce, op1, 0); if (UNEXPECTED(!iter)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d9c288c707..bf4eb31bfb 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1928,7 +1928,7 @@ send_again: zend_object_iterator *iter; if (!ce || !ce->get_iterator) { - zend_error(E_WARNING, "Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked"); } else { iter = ce->get_iterator(ce, args, 0); @@ -2005,7 +2005,7 @@ send_again: if (opline->op1_type == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) { ZVAL_UNDEFINED_OP1(); } - zend_error(E_WARNING, "Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked"); } FREE_OP(opline->op1_type, opline->op1.var); @@ -2184,7 +2184,7 @@ add_unpack_again: zend_object_iterator *iter; if (!ce || !ce->get_iterator) { - zend_throw_error(NULL, "Only arrays and Traversables can be unpacked"); + zend_type_error("Only arrays and Traversables can be unpacked"); } else { iter = ce->get_iterator(ce, op1, 0); if (UNEXPECTED(!iter)) { -- 2.40.0