Fix a syntax incompatibility introduced by the // operator.
Rafael Garcia-Suarez [Thu, 12 Sep 2002 19:33:06 +0000 (19:33 +0000)]
(Note that C<print $fh //> is still a syntax error, it
wasn't with perl 5.8.0.)

p4raw-id: //depot/perl@17900

t/op/dor.t
toke.c

index 2f918fc..979419b 100644 (file)
@@ -10,7 +10,7 @@ BEGIN {
 package main;
 require './test.pl';
 
-plan( tests => 25 );
+plan( tests => 30 );
 
 my($x);
 
@@ -59,3 +59,16 @@ for (qw(getc pos readline readlink undef umask <> <FOO> <$foo> -f)) {
     eval "sub { $_ // 0 }";
     is($@, '', "$_ // ... compiles");
 }
+
+# Test for some ambiguous syntaxes
+
+eval q# sub f ($) { } f $x / 2; #;
+is( $@, '' );
+eval q# sub f ($):lvalue { $y } f $x /= 2; #;
+is( $@, '' );
+eval q# sub f ($) { } f $x /2; #;
+like( $@, qr/^Search pattern not terminated/ );
+eval q# sub { print $fh / 2 } #;
+is( $@, '' );
+eval q# sub { print $fh /2 } #;
+like( $@, qr/^Search pattern not terminated/ );
diff --git a/toke.c b/toke.c
index 0e1e65a..fa0f1ac 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -3554,14 +3554,9 @@ Perl_yylex(pTHX)
                PL_expect = XTERM;              /* e.g. print $fh .3 */
            else if (strchr("?-+", *s) && !isSPACE(s[1]) && s[1] != '=')
                PL_expect = XTERM;              /* e.g. print $fh -1 */
-           else if (*s == '/') {
-               if(s[1] == '/') {
-                   PL_expect=XOPERATOR;
-               }
-               else {
-                   PL_expect=XTERM;
-               }
-           }
+           else if (*s == '/' && !isSPACE(s[1]) && s[1] != '=' && s[1] != '/')
+               PL_expect = XTERM;              /* e.g. print $fh /.../
+                                                XXX except DORDOR operator */
            else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
                PL_expect = XTERM;              /* print $fh <<"EOF" */
        }