[perl #122695] Fix line number for else{foo} blead
authorFather Chrysostomos <sprout@cpan.org>
Thu, 23 Oct 2014 02:32:04 +0000 (19:32 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 23 Oct 2014 02:50:48 +0000 (19:50 -0700)
where there is no space after the opening brace.

The code that was responsible for the wrong line number:

if (isSPACE(*s) || *s == '#')
    PL_copline = NOLINE;   /* invalidate current command line number */

was added in perl *2.0* (378cc40b3)!  It looked a little different
back then:

if (isspace(*s) || *s == '#')
    cmdline = NOLINE;   /* invalidate current command line number */

I don’t know what the condition was for.  I can only imagine that it
seemed logical to skip the setting of cmdline if it appeared to be
something on the same line (e.g., if($foo){bar()} as opposed to
if($foo){<newline>...}).  Clearly that doesn’t work for ‘else{foo()}’
because we end up giving that statement the line number where the
‘if’ occurs.  (cmdline/PL_copline is for remembering the first line of
a multi-line construct.)

t/comp/parser.t
t/op/runlevel.t
toke.c

index ffa4dff..09d5632 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
     chdir 't' if -d 't';
 }
 
-print "1..170\n";
+print "1..171\n";
 
 sub failed {
     my ($got, $expected, $name) = @_;
@@ -503,6 +503,12 @@ eval 'method {} {$_,undef}';
 like $@, qq/^Can't call method "method" on unblessed reference at /,
      'method BLOCK {...} does not try to disambiguate';
 
+eval '#line 1 maggapom
+      if ($a>3) { $a ++; }
+      else {printf(1/0);}';
+is $@, "Illegal division by zero at maggapom line 2.\n",
+   'else {foo} line number (no space after {) [perl #122695]';
+
 # Add new tests HERE (above this line)
 
 # bug #74022: Loop on characters in \p{OtherIDContinue}
index 3e68a23..5b6b39f 100644 (file)
@@ -169,7 +169,7 @@ foo:
   @a = sort { last foo; } @a;
 }
 EXPECT
-Label not found for "last foo" at - line 2.
+Label not found for "last foo" at - line 4.
 ########
 package TEST;
  
diff --git a/toke.c b/toke.c
index b653687..d866ef2 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -5596,8 +5596,7 @@ Perl_yylex(pTHX)
            break;
        }
        pl_yylval.ival = CopLINE(PL_curcop);
-       if (isSPACE(*s) || *s == '#')
-           PL_copline = NOLINE;   /* invalidate current command line number */
+       PL_copline = NOLINE;   /* invalidate current command line number */
        TOKEN(formbrack ? '=' : '{');
     case '}':
        if (PL_lex_brackets && PL_lex_brackstack[PL_lex_brackets-1] == XFAKEEOF)