This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #77172] Deparse &{&} as &{&}, not &&
authorFather Chrysostomos <sprout@cpan.org>
Thu, 8 Dec 2011 22:35:27 +0000 (14:35 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 8 Dec 2011 22:35:27 +0000 (14:35 -0800)
&& is always tokenised as the logical-and operator, and never as the
&{&} subroutine.  B::Deparse needs to know about this.

(Oddly enough, ** can be exponentiation or the *{*} glob.)

dist/B-Deparse/Deparse.pm
dist/B-Deparse/t/deparse.t

index 10ab498..b751dc5 100644 (file)
@@ -3531,6 +3531,7 @@ sub pp_entersub {
        $args = join(", ", map($self->deparse($_, 6), @exprs));
     }
     if ($prefix or $amper) {
+       if ($kid eq '&') { $kid = "{$kid}" } # &{&} cannot be written as &&
        if ($op->flags & OPf_STACKED) {
            return $prefix . $amper . $kid . "(" . $args . ")";
        } else {
index 4d90a1b..b852a0c 100644 (file)
@@ -399,6 +399,13 @@ my $f = sub {
 # bug #43010
 &::::;
 ####
+# [perl #77172]
+package rt77172;
+sub foo {} foo & & & foo;
+>>>>
+package rt77172;
+foo(&{&} & foo());
+####
 # variables as method names
 my $bar;
 'Foo'->$bar('orz');