summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Garcia-Suarez <rgarciasuarez@gmail.com>2008-04-18 10:42:17 +0000
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2008-04-18 10:42:17 +0000
commitf6f3a1fea2bda9d33f9cc5367b630a21738c9def (patch)
treed113d69c2395fb2e70865ba53b0fd509fb2de441
parent12e06b6fd7025de6faae2a6f788653cc97790444 (diff)
downloadperl-f6f3a1fea2bda9d33f9cc5367b630a21738c9def.tar.gz
Fix the line-number-in-elsif longstanding bug.
This patch does two things : - newSTATEOP now nullifies the state op it just created if OPf_SPECIAL is passed to it in flags - the parser now inserts a nullified stateop in the expression block of an elsif p4raw-id: //depot/perl@33710
-rw-r--r--op.c2
-rw-r--r--perly.act2
-rw-r--r--perly.y2
-rw-r--r--t/lib/warnings/9uninit1
4 files changed, 4 insertions, 3 deletions
diff --git a/op.c b/op.c
index ba9e2a5a9f..60c1b77a22 100644
--- a/op.c
+++ b/op.c
@@ -4419,6 +4419,8 @@ Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
}
}
+ if (flags & OPf_SPECIAL)
+ op_null((OP*)cop);
return prepend_elem(OP_LINESEQ, (OP*)cop, o);
}
diff --git a/perly.act b/perly.act
index 4ff627cc05..8df8e3c338 100644
--- a/perly.act
+++ b/perly.act
@@ -186,7 +186,7 @@ case 2:
case 27:
#line 277 "perly.y"
{ PL_parser->copline = (line_t)IVAL((ps[(1) - (6)].val.i_tkval));
- (yyval.opval) = newCONDOP(0, (ps[(3) - (6)].val.opval), scope((ps[(5) - (6)].val.opval)), (ps[(6) - (6)].val.opval));
+ (yyval.opval) = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,(ps[(3) - (6)].val.opval)), scope((ps[(5) - (6)].val.opval)), (ps[(6) - (6)].val.opval));
PL_hints |= HINT_BLOCK_SCOPE;
TOKEN_GETMAD((ps[(1) - (6)].val.i_tkval),(yyval.opval),'I');
TOKEN_GETMAD((ps[(2) - (6)].val.i_tkval),(yyval.opval),'(');
diff --git a/perly.y b/perly.y
index ad7b55209e..31dd0b361b 100644
--- a/perly.y
+++ b/perly.y
@@ -275,7 +275,7 @@ else : /* NULL */
}
| ELSIF '(' mexpr ')' mblock else
{ PL_parser->copline = (line_t)IVAL($1);
- $$ = newCONDOP(0, $3, scope($5), $6);
+ $$ = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,$3), scope($5), $6);
PL_hints |= HINT_BLOCK_SCOPE;
TOKEN_GETMAD($1,$$,'I');
TOKEN_GETMAD($2,$$,'(');
diff --git a/t/lib/warnings/9uninit b/t/lib/warnings/9uninit
index fea20f0dca..570290a0cc 100644
--- a/t/lib/warnings/9uninit
+++ b/t/lib/warnings/9uninit
@@ -1322,7 +1322,6 @@ exit $m1;
EXPECT
Use of uninitialized value $m1 in exit at - line 4.
########
-# TODO long standing bug - PL_curcop is not updated before the elsif
use warnings 'uninitialized';
my $undef;