This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
deparse ::CORE::foo barewords carefully
authorZefram <zefram@fysh.org>
Thu, 16 Nov 2017 07:04:32 +0000 (07:04 +0000)
committerZefram <zefram@fysh.org>
Thu, 16 Nov 2017 07:04:32 +0000 (07:04 +0000)
A bareword such as "::CORE::foo", where it refers to a GV, is liable to be
confused with the "CORE::foo" syntax, which can't refer to a GV but is a
way of supplying a keyword, and is illegal if the keyword doesn't exist.
Make sure to deparse it with the "::" prefix.  Fixes [perl #113714].

lib/B/Deparse.pm
lib/B/Deparse.t

index acb1922..00e31d3 100644 (file)
@@ -1778,6 +1778,7 @@ sub gv_name {
     {
        $stash = "";
     } else {
     {
        $stash = "";
     } else {
+       $stash = "::$stash" if $stash eq "CORE";
        $stash = $stash . "::";
     }
     if (!$raw and $name =~ /^(\^..|{)/) {
        $stash = $stash . "::";
     }
     if (!$raw and $name =~ /^(\^..|{)/) {
index 06b5cc7..63a4a08 100644 (file)
@@ -2856,3 +2856,6 @@ $r = qr/abc\Q$a-$b\Exyz/;
 my $str;
 $str = 'foo';
 $str =~ tr/\cA//;
 my $str;
 $str = 'foo';
 $str =~ tr/\cA//;
+####
+# CORE::foo special case in bareword parsing
+print ::CORE::foo $a;