Re: truncate with file name does not work (with patch)
authorPerl 5 Porters <perl5-porters@africa.nicoh.com>
Wed, 28 Aug 1996 02:37:41 +0000 (02:37 +0000)
committerAndy Dougherty <doughera@lafcol.lafayette.edu>
Wed, 28 Aug 1996 02:37:41 +0000 (02:37 +0000)
The prototype for truncate was changed so that perl won't die
with C<use strict;> when the first arg is a bareword (filehandle).
I think it was Tom (as in "tchrist") who brought this up.

Here's a patch that undoes the damage, makes it work with
C<use strict;>, and adds to the testsuite.

opcode.pl
toke.c

index 2c2bc50..50cf214 100755 (executable)
--- a/opcode.pl
+++ b/opcode.pl
@@ -477,7 +477,8 @@ recv                recv                    ck_fun          imst    F R S S
 eof            eof                     ck_eof          is      F?
 tell           tell                    ck_fun          st      F?
 seek           seek                    ck_fun          s       F S S
-truncate       truncate                ck_trunc        is      F S
+# truncate really behaves as if it had both "S S" and "F S"
+truncate       truncate                ck_trunc        is      S S
 
 fcntl          fcntl                   ck_fun          st      F S S
 ioctl          ioctl                   ck_fun          st      F S S
diff --git a/toke.c b/toke.c
index ccd4aed..6c4b7cd 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -2516,6 +2516,7 @@ yylex()
                if (hints & HINT_STRICT_SUBS &&
                    lastchar != '-' &&
                    strnNE(s,"->",2) &&
+                   last_lop_op != OP_TRUNCATE &&  /* S/F prototype in opcode.pl */
                    last_lop_op != OP_ACCEPT &&
                    last_lop_op != OP_PIPE_OP &&
                    last_lop_op != OP_SOCKPAIR)