This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Stop prototype declaration from clobbering constants
authorFather Chrysostomos <sprout@cpan.org>
Sun, 31 Aug 2014 13:27:45 +0000 (06:27 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 31 Aug 2014 13:58:25 +0000 (06:58 -0700)
commit59e6df9f1cf4cd5c46c36d625e538b870dba7a22
tree18f6334fa49c3b3dd7254be924ce3bbd6ff1aa03
parent172a6a76e8c24d5e8b67519dedce8baeb429e5d0
Stop prototype declaration from clobbering constants

$ perl -e 'use constant f=>3; sub f($); warn eval "&f"'
Runaway prototype at -e line 1.
Prototype mismatch:: none vs ($) at -e line 1.
Undefined subroutine &main::f called at (eval 1) line 1.
...caught at -e line 1.
$ perl -e 'sub f (){3} sub f($); warn eval "&f"'
Prototype mismatch: sub main::f () vs ($) at -e line 1.
3 at -e line 1.

(The ‘Runaway prototype’ warning was removed in acfcf464b177, in which
I stated wrongly that the warning could only come about with stash
manipulation.  I suppose the warning was really warning me that the
implementation was broken, which it was until this commit.)

When constant refs in the symbol table were introduced in 5.10.0
(a bisect points to e040ff70dc), one code path in newATTRSUB--that
assumes that a stash entry that is not a GV is not a defined sub,
but either a forward declaration or no sub at all--was not updated to
account for this new way of storing constants.
op.c
t/op/sub.t