Don’t trigger warnings for qq"@builtin"
authorFather Chrysostomos <sprout@cpan.org>
Sun, 31 Jul 2016 06:51:29 +0000 (23:51 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 31 Jul 2016 13:35:05 +0000 (06:35 -0700)
commit10030f4b9e57e68d03a6b1eb1a9bed9fb389e8ac
tree96cbc577255da79085e66b4fe3cff29dfed204b8
parentaebe74f4cf6c4b5d292a30ff3da053b73c26477a
Don’t trigger warnings for qq"@builtin"

Built-in arrays should not be giving warnings about possible unin-
tended interpolation (which happens with nonexistent arrays).

Some built-in variables do not exist if they are not needed, but perl
will generally pretend that they did already exist whenever they are
fetched.  It is such variables that trigger this warning erroneously:

$ ./miniperl -we 'sub dump_isa { warn "@ISA" } @ISA = ("foo","bar"); dump_isa'
Possible unintended interpolation of @ISA in string at -e line 1.
foo bar at -e line 1.

I discovered this when writing a test for @DB::args, using -w.
warnings.pm uses @DB::args, so ‘use warnings’ code won’t get the warn-
ing, but code using -w gets it:

$ ./miniperl -we 'sub foo { package DB { () = caller 0 } print "@DB::args\n" } foo(1..3);'
Possible unintended interpolation of @DB::args in string at -e line 1.
1 2 3

The code in toke.c that decides whether this warning should take place
needs to supply the GV_ADDMG flag to gv_fetchpvn_flags, making it one
of the code paths that engages in the pretence mentioned above.

That code already had an explicit exception for @+ and @-.  This com-
mit removes it as being no longer necessary.
t/lib/warnings/toke
toke.c