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

View File

@ -9,7 +9,7 @@ var_dump([...$arr]);
--EXPECTF-- --EXPECTF--
Warning: Undefined variable $arr in %s on line %d 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: Stack trace:
#0 {main} #0 {main}
thrown in %s on line %d thrown in %s on line %d

View File

@ -7,4 +7,4 @@ var_dump([...42]);
?> ?>
--EXPECTF-- --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; continue;
} else { } 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; bool have_named_params = 0;
if (!ce || !ce->get_iterator) { 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 { } else {
iter = ce->get_iterator(ce, args, 0); 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)) { if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) {
ZVAL_UNDEFINED_OP1(); 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(); FREE_OP1();
@ -6285,7 +6285,7 @@ ZEND_VM_C_LABEL(add_unpack_again):
zend_object_iterator *iter; zend_object_iterator *iter;
if (!ce || !ce->get_iterator) { 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 { } else {
iter = ce->get_iterator(ce, op1, 0); iter = ce->get_iterator(ce, op1, 0);
if (UNEXPECTED(!iter)) { if (UNEXPECTED(!iter)) {
@ -6360,7 +6360,7 @@ ZEND_VM_C_LABEL(add_unpack_again):
op1 = Z_REFVAL_P(op1); op1 = Z_REFVAL_P(op1);
ZEND_VM_C_GOTO(add_unpack_again); ZEND_VM_C_GOTO(add_unpack_again);
} else { } 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(); FREE_OP1();

View File

@ -2359,7 +2359,7 @@ send_again:
bool have_named_params = 0; bool have_named_params = 0;
if (!ce || !ce->get_iterator) { 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 { } else {
iter = ce->get_iterator(ce, args, 0); 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)) { if (opline->op1_type == IS_CV && UNEXPECTED(Z_TYPE_P(args) == IS_UNDEF)) {
ZVAL_UNDEFINED_OP1(); 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); FREE_OP(opline->op1_type, opline->op1.var);
@ -2740,7 +2740,7 @@ add_unpack_again:
zend_object_iterator *iter; zend_object_iterator *iter;
if (!ce || !ce->get_iterator) { 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 { } else {
iter = ce->get_iterator(ce, op1, 0); iter = ce->get_iterator(ce, op1, 0);
if (UNEXPECTED(!iter)) { if (UNEXPECTED(!iter)) {
@ -2815,7 +2815,7 @@ add_unpack_again:
op1 = Z_REFVAL_P(op1); op1 = Z_REFVAL_P(op1);
goto add_unpack_again; goto add_unpack_again;
} else { } 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); FREE_OP(opline->op1_type, opline->op1.var);