Fix bug #16080 : an attribute list should end at '}'
Rafael Garcia-Suarez [Thu, 8 Aug 2002 19:47:44 +0000 (19:47 +0000)]
p4raw-id: //depot/perl@17704

t/op/attrs.t
toke.c

index dc604f3..264de8a 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
     require './test.pl';
 }
 
-plan tests => 37;
+plan tests => 39;
 
 $SIG{__WARN__} = sub { die @_ };
 
@@ -50,6 +50,12 @@ eval_ok 'my ($x,$y) : ;';
 eval 'my ($x,$y) : plugh;';
 like $@, qr/^Invalid SCALAR attribute: ["']?plugh["']? at/;
 
+# bug #16080
+eval '{my $x : plugh}';
+like $@, qr/^Invalid SCALAR attribute: ["']?plugh["']? at/;
+eval '{my ($x,$y) : plugh(})}';
+like $@, qr/^Invalid SCALAR attribute: ["']?plugh\(}\)["']? at/;
+
 sub A::MODIFY_SCALAR_ATTRIBUTES { return }
 eval 'my A $x : plugh;';
 like $@, qr/^SCALAR package attribute may clash with future reserved word: ["']?plugh["']? at/;
diff --git a/toke.c b/toke.c
index 761f0e7..6bacaea 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -3049,7 +3049,7 @@ Perl_yylex(pTHX)
                    break;      /* require real whitespace or :'s */
            }
            tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
-           if (*s != ';' && *s != tmp && (tmp != '=' || *s != ')')) {
+           if (*s != ';' && *s != '}' && *s != tmp && (tmp != '=' || *s != ')')) {
                char q = ((*s == '\'') ? '"' : '\'');
                /* If here for an expression, and parsed no attrs, back off. */
                if (tmp == '=' && !attrs) {