This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove ‘Runaway prototype’ warning
authorFather Chrysostomos <sprout@cpan.org>
Thu, 24 May 2012 04:51:45 +0000 (21:51 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 30 May 2012 06:55:21 +0000 (23:55 -0700)
This has been here since commit 8472ac73d, which was merged into blead
in commit 55d729e4e15, if I understand the history correctly.

This warning is undocumented, and triggerable only by stash
manipulation.

It appears to be an internal check, similar to a ‘panic’ error, but
its wording doesn’t suggest anything of the sort.

A ‘sub foo;’ declaration doesn’t actually create the sub yet, but
simply puts -1 in the stash element.  ‘sub foo($);’ puts '$' in the
stash element.

If newATTRSUB sees something there it doesn’t recognise, it unhelp-
fully carps ‘Runaway prototype’, but it is pretty random:

This is OK:

$ perl -e 'BEGIN{$::{foo}=undef} sub foo;'

But this is not:

$ perl -e 'BEGIN{$::{foo}=-1; $::{foo}=undef} sub foo;'
Runaway prototype at -e line 1.

Also, it only happens when the sub has no body, not for ‘sub foo {}’:

$ perl -e 'BEGIN{$::{foo}=56} sub foo{}'
$ perl -e 'BEGIN{$::{foo}=56} sub foo;'
Runaway prototype at -e line 1.

This warning is random, incomprehensible, and not at all helpful, so
we should just remove it.

op.c
t/lib/warnings/op
t/porting/diag.t

diff --git a/op.c b/op.c
index fb21eb3..6845eba 100644 (file)
--- a/op.c
+++ b/op.c
@@ -6578,11 +6578,6 @@ Perl_newATTRSUB_flags(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     if (SvTYPE(gv) != SVt_PVGV) {      /* Maybe prototype now, and had at
                                           maximum a prototype before. */
        if (SvTYPE(gv) > SVt_NULL) {
-           if (!SvPOK((const SV *)gv)
-               && !(SvIOK((const SV *)gv) && SvIVX((const SV *)gv) == -1))
-           {
-               Perl_ck_warner_d(aTHX_ packWARN(WARN_PROTOTYPE), "Runaway prototype");
-           }
            cv_ckproto_len_flags((const CV *)gv, NULL, ps, ps_len, ps_utf8);
        }
        if (ps) {
index de74d2e..6dfcf5d 100644 (file)
@@ -97,7 +97,6 @@
         sub fred() ;
         sub fred($) {}
 
-    Runaway prototype          [newSUB]        TODO
     oops: oopsAV               [oopsAV]        TODO
     oops: oopsHV               [oopsHV]        TODO
     
index 58bed95..c075626 100644 (file)
@@ -427,7 +427,6 @@ Perl %s required--this is only %s, stopped
 ptr wrong %p != %p fl=%x nl=%p e=%p for %d
 Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)
 Reversed %c= operator
-Runaway prototype
 %s(%f) failed
 %sCompilation failed in regexp
 %sCompilation failed in require