Add type indicator to array/arg unpack error messages (GH-15448)

This commit is contained in:
Jorg Adam Sowa 2024-09-01 22:57:12 +02:00 committed by GitHub
parent de6658531f
commit 2a30f2ffc4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 21 additions and 21 deletions

View File

@ -10,34 +10,34 @@ function test(...$args) {
try {
test(...null);
} catch (Error $e) {
echo $e->getMessage(), "\n";
echo $e::class . ": " . $e->getMessage(), "\n";
}
try {
test(...42);
} catch (Error $e) {
echo $e->getMessage(), "\n";
echo $e::class . ": " . $e->getMessage(), "\n";
}
try {
test(...new stdClass);
} catch (Error $e) {
echo $e->getMessage(), "\n";
echo $e::class . ": " . $e->getMessage(), "\n";
}
try {
test(1, 2, 3, ..."foo", ...[4, 5]);
} catch (Error $e) {
echo $e->getMessage(), "\n";
echo $e::class . ": " . $e->getMessage(), "\n";
}
try {
test(1, 2, 3, ...new StdClass, ...3.14, ...[4, 5]);
} catch (Error $e) {
echo $e->getMessage(), "\n";
echo $e::class . ": " . $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
TypeError: Only arrays and Traversables can be unpacked, null given
TypeError: Only arrays and Traversables can be unpacked, int given
TypeError: Only arrays and Traversables can be unpacked, stdClass given
TypeError: Only arrays and Traversables can be unpacked, string given
TypeError: Only arrays and Traversables can be unpacked, stdClass given

View File

@ -9,7 +9,7 @@ var_dump([...$arr]);
--EXPECTF--
Warning: Undefined variable $arr in %s on line %d
Fatal error: Uncaught Error: Only arrays and Traversables can be unpacked in %s:%d
Fatal error: Uncaught Error: Only arrays and Traversables can be unpacked, null given in %s:%d
Stack trace:
#0 {main}
thrown in %s on line %d

View File

@ -7,4 +7,4 @@ var_dump([...42]);
?>
--EXPECTF--
Fatal error: Only arrays and Traversables can be unpacked in %s on line %d
Fatal error: Only arrays and Traversables can be unpacked, int given in %s on line %d

View File

@ -9829,7 +9829,7 @@ static bool zend_try_ct_eval_array(zval *result, zend_ast *ast) /* {{{ */
continue;
} else {
zend_error_noreturn(E_COMPILE_ERROR, "Only arrays and Traversables can be unpacked");
zend_error_noreturn(E_COMPILE_ERROR, "Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(value));
}
}

View File

@ -5280,7 +5280,7 @@ ZEND_VM_C_LABEL(send_again):
bool have_named_params = 0;
if (!ce || !ce->get_iterator) {
zend_type_error("Only arrays and Traversables can be unpacked");
zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args));
} else {
iter = ce->get_iterator(ce, args, 0);
@ -5397,7 +5397,7 @@ ZEND_VM_C_LABEL(send_again):
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) {
ZVAL_UNDEFINED_OP1();
}
zend_type_error("Only arrays and Traversables can be unpacked");
zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args));
}
FREE_OP1();
@ -6285,7 +6285,7 @@ ZEND_VM_C_LABEL(add_unpack_again):
zend_object_iterator *iter;
if (!ce || !ce->get_iterator) {
zend_type_error("Only arrays and Traversables can be unpacked");
zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1));
} else {
iter = ce->get_iterator(ce, op1, 0);
if (UNEXPECTED(!iter)) {
@ -6360,7 +6360,7 @@ ZEND_VM_C_LABEL(add_unpack_again):
op1 = Z_REFVAL_P(op1);
ZEND_VM_C_GOTO(add_unpack_again);
} else {
zend_throw_error(NULL, "Only arrays and Traversables can be unpacked");
zend_throw_error(NULL, "Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1));
}
FREE_OP1();

View File

@ -2359,7 +2359,7 @@ send_again:
bool have_named_params = 0;
if (!ce || !ce->get_iterator) {
zend_type_error("Only arrays and Traversables can be unpacked");
zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args));
} else {
iter = ce->get_iterator(ce, args, 0);
@ -2476,7 +2476,7 @@ send_again:
if (opline->op1_type == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) {
ZVAL_UNDEFINED_OP1();
}
zend_type_error("Only arrays and Traversables can be unpacked");
zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(args));
}
FREE_OP(opline->op1_type, opline->op1.var);
@ -2740,7 +2740,7 @@ add_unpack_again:
zend_object_iterator *iter;
if (!ce || !ce->get_iterator) {
zend_type_error("Only arrays and Traversables can be unpacked");
zend_type_error("Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1));
} else {
iter = ce->get_iterator(ce, op1, 0);
if (UNEXPECTED(!iter)) {
@ -2815,7 +2815,7 @@ add_unpack_again:
op1 = Z_REFVAL_P(op1);
goto add_unpack_again;
} else {
zend_throw_error(NULL, "Only arrays and Traversables can be unpacked");
zend_throw_error(NULL, "Only arrays and Traversables can be unpacked, %s given", zend_zval_value_name(op1));
}
FREE_OP(opline->op1_type, opline->op1.var);