Allow a closing brace after an "use VERSION"
Vincent Pit [Sat, 28 Nov 2009 12:27:02 +0000 (13:27 +0100)]
This fixes [perl #70884] : use VERSION in BLOCK without semicolon -> syntax error

t/comp/use.t
toke.c

index fade9fe..c9b76d7 100755 (executable)
@@ -6,7 +6,7 @@ BEGIN {
     $INC{"feature.pm"} = 1; # so we don't attempt to load feature.pm
 }
 
-print "1..69\n";
+print "1..73\n";
 
 # Can't require test.pl, as we're testing the use/require mechanism here.
 
@@ -62,6 +62,18 @@ sub isnt ($$;$) {
     _ok ('isnt', @_);
 }
 
+eval "use 5";           # implicit semicolon
+is ($@, '');
+
+eval "use 5;";
+is ($@, '');
+
+eval "{use 5}";         # [perl #70884]
+is ($@, '');
+
+eval "{use 5   }";      # [perl #70884]
+is ($@, '');
+
 # new style version numbers
 
 eval q{ use v5.5.630; };
diff --git a/toke.c b/toke.c
index 173ded4..dfcb034 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -3807,7 +3807,8 @@ S_tokenize_use(pTHX_ int is_use, char *s) {
     s = SKIPSPACE1(s);
     if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
        s = force_version(s, TRUE);
-       if (*s == ';' || (s = SKIPSPACE1(s), *s == ';')) {
+       if (*s == ';' || *s == '}'
+               || (s = SKIPSPACE1(s), (*s == ';' || *s == '}'))) {
            start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.opval = NULL;
            force_next(WORD);