(perl #130367) separate error for push etc on hash/glob
authorTony Cook <tony@develop-help.com>
Sun, 18 Dec 2016 23:49:27 +0000 (10:49 +1100)
committerTony Cook <tony@develop-help.com>
Tue, 22 Jan 2019 00:11:34 +0000 (11:11 +1100)
op.c
t/lib/croak/op

diff --git a/op.c b/op.c
index 0b46b34..39006ad 100644 (file)
--- a/op.c
+++ b/op.c
@@ -11688,6 +11688,10 @@ Perl_ck_fun(pTHX_ OP *o)
                         || SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVAV  )
                        )
                    bad_type_pv(numargs, "array", o, kid);
+                else if (kid->op_type == OP_RV2HV || kid->op_type == OP_PADHV
+                         || kid->op_type == OP_RV2GV) {
+                    bad_type_pv(1, "array", o, kid);
+                }
                else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV) {
                     yyerror_pv(Perl_form(aTHX_ "Experimental %s on scalar is now forbidden",
                                          PL_op_desc[type]), 0);
index c11803e..5f31478 100644 (file)
@@ -217,3 +217,37 @@ Execution of - aborted due to compilation errors.
 EXPECT
 Type of arg 1 to each must be hash or array (not constant item) at - line 1, near "FRED ;"
 Execution of - aborted due to compilation errors.
+########
+# NAME better messages for array-ops on non-arrays
+push %a, 1;
+pop %a;
+shift %a;
+unshift %a, 1;
+push *a, 1;
+pop *a;
+shift *a;
+unshift *a, 1;
+EXPECT
+Type of arg 1 to push must be array (not hash dereference) at - line 1, near "1;"
+Type of arg 1 to pop must be array (not hash dereference) at - line 2, near "%a;"
+Type of arg 1 to shift must be array (not hash dereference) at - line 3, near "%a;"
+Type of arg 1 to unshift must be array (not hash dereference) at - line 4, near "1;"
+Type of arg 1 to push must be array (not ref-to-glob cast) at - line 5, near "1;"
+Type of arg 1 to pop must be array (not ref-to-glob cast) at - line 6, near "*a;"
+Type of arg 1 to shift must be array (not ref-to-glob cast) at - line 7, near "*a;"
+Type of arg 1 to unshift must be array (not ref-to-glob cast) at - line 8, near "1;"
+Execution of - aborted due to compilation errors.
+########
+# NAME better messages for array-ops on non-arrays (part 2)
+# to check PADHV without hitting the reported error limit
+my %a;
+push %a, 1;
+pop %a;
+shift %a;
+unshift %a, 1;
+EXPECT
+Type of arg 1 to push must be array (not private hash) at - line 3, near "1;"
+Type of arg 1 to pop must be array (not private hash) at - line 4, near "%a;"
+Type of arg 1 to shift must be array (not private hash) at - line 5, near "%a;"
+Type of arg 1 to unshift must be array (not private hash) at - line 6, near "1;"
+Execution of - aborted due to compilation errors.