This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Don't Deparse "${$}abc" as "$$abc"
authorDavid Mitchell <davem@iabyn.com>
Wed, 22 Nov 2017 12:14:42 +0000 (12:14 +0000)
committerDavid Mitchell <davem@iabyn.com>
Thu, 23 Nov 2017 08:52:16 +0000 (08:52 +0000)
This fixes ./TEST -deparse op/stat.t

This only fixes multiconcat - in theory concat suffers from the same bug,
although in practice any concat expression involving at least one constant
string will be upgraded to multiconcat.

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

index 0cbb890..b19b40f 100644 (file)
@@ -4405,8 +4405,12 @@ sub do_multiconcat {
         # "foo=$foo bar=$bar "
         my $not_first;
         while (@consts) {
         # "foo=$foo bar=$bar "
         my $not_first;
         while (@consts) {
-            $rhs = dq_disambiguate($rhs, $self->dq(shift(@kids), 18))
-                if $not_first;
+            if ($not_first) {
+                my $s = $self->dq(shift(@kids), 18);
+                # don't deparse "a${$}b" as "a$$b"
+                $s = '${$}' if $s eq '$$';
+                $rhs = dq_disambiguate($rhs, $s);
+            }
             $not_first = 1;
             my $c = shift @consts;
             if (defined $c) {
             $not_first = 1;
             my $c = shift @consts;
             if (defined $c) {
index ca1bdb4..83e46e8 100644 (file)
@@ -2983,3 +2983,8 @@ $res = CORE::keys(%$r2) / 2 - 1;
 my($a, $b);
 $b = $a . $a . $a;
 (($a .= $a) .= $a) .= $a;
 my($a, $b);
 $b = $a . $a . $a;
 (($a .= $a) .= $a) .= $a;
+####
+# multiconcat: $$ within string
+my($a, $x);
+$x = "${$}abc";
+$x = "\$$a";