summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-09-27 14:52:20 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-09-27 15:50:34 +0200
commit38b19d47e0a1b99cd462987be84cd7f345d983d9 (patch)
treebdce8db0325d0d5dc3659f298aff15fd89305ea2
parente8b0163e0b6632c77cb8a3e863671c87793dbfc4 (diff)
downloadphp-git-38b19d47e0a1b99cd462987be84cd7f345d983d9.tar.gz
Convert "Only arrays and Traversables can be unpacked" into Error
-rw-r--r--UPGRADING3
-rw-r--r--Zend/tests/arg_unpack/invalid_type.phpt72
-rw-r--r--Zend/zend_vm_def.h6
-rw-r--r--Zend/zend_vm_execute.h6
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)) {