# New Ticket Created by  Moritz Lenz 
# Please include the string:  [perl #63976]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=63976 >


Rakudo f8b6aeec564dfa79162b3f6b53302afdc2f33b19:

'8' ~~ /\d (A)*/;
my $x =  $/;
for @($x) {
    say $_.text;
    say "FAIL";
}

# OUTPUT:
8
FAIL

Here (A) never matches, but still @() returns a non-empty list, where
the one item is identical to $/.

Note that in this case the error goes away if we omit the assignment  to
a temporary variable, but there are other cases where the error appears
without any explicit assignment being used:

grammar Math {
    token TOP { ^ <expr> $ {*} };
    token expr {
        \d ( A )* {*}
    }
}

Math.parse('8');
for @($/<expr>[0]) {
    say "FAIL";
}

Some more thinking:
00:46 < moritz_> I think I've got an idea what's going on
00:46 < moritz_> @($stuff) seems to call $stuff.list
00:46 < moritz_> and there seems to be an instance where $stuff is not a
Match  object, so it'll return itself
00:47 < moritz_> something like one proxying step that should proxy the
.list  method, but doesn't
00:47 < moritz_> rakudo: grammar A { token TOP { ^ <a> $ }; rule a { \d
( A )* {*} }}; A.parse('2'); my $m = $<a>; say $m.PARROT
00:48 < p6eval> rakudo f8b6ae: OUTPUT«Perl6Scalar->A␤»
00:48 < moritz_> rakudo: grammar A { token TOP { ^ <a> $ }; rule a { \d
( A )* {*} }}; A.parse('2'); say $/.PARROT
00:48 < p6eval> rakudo f8b6ae: OUTPUT«A␤»


Reply via email to