From: Ian Goodacre Date: Sat, 14 Mar 2009 06:04:12 +0000 (+1300) Subject: Return OPERATOR('[') for '[' without falling through to case '~', avoiding misinterpr... X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=df3467db16fc4437950db94f0d3ad7ff8b2c9e46;p=p5sagit%2Fp5-mst-13.2.git Return OPERATOR('[') for '[' without falling through to case '~', avoiding misinterpreting "[~" as an OP_SMARTMATCH. --- diff --git a/t/base/lex.t b/t/base/lex.t index f45e56c..9892df5 100755 --- a/t/base/lex.t +++ b/t/base/lex.t @@ -1,6 +1,6 @@ #!./perl -print "1..56\n"; +print "1..57\n"; $x = 'x'; @@ -267,3 +267,11 @@ foo::::::bar; eval "\$x =\xE2foo"; if ($@ =~ /Unrecognized character \\xE2 in column 5/) { print "ok $test\n"; } else { print "not ok $test\n"; } $test++; + +# Is "[~" scanned correctly? +eval ' + my @a; + my $x = $a[~1] +'; +print "not " if($@); +print "ok 57\n"; diff --git a/toke.c b/toke.c index 3c3e0ad..8f5795a 100644 --- a/toke.c +++ b/toke.c @@ -4287,7 +4287,10 @@ Perl_yylex(pTHX) BOop(OP_BIT_XOR); case '[': PL_lex_brackets++; - /* FALL THROUGH */ + { + const char tmp = *s++; + OPERATOR(tmp); + } case '~': if (s[1] == '~' && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))