Front page | perl.perl5.porters |
Postings from August 2009
[perl #68758] lvalue sub flag set when impossible
From:
Zefram
Date:
August 24, 2009 05:00
Subject:
[perl #68758] lvalue sub flag set when impossible
Message ID:
rt-3.6.HEAD-2466-1251099793-1664.68758-75-0@perl.org
# New Ticket Created by Zefram
# Please include the string: [perl #68758]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=68758 >
This is a bug report for perl from zefram@fysh.org,
generated with the help of perlbug 1.36 running under perl 5.10.0.
-----------------------------------------------------------------
[Please enter your report here]
Here's a simple case of an lvalue sub:
$ perl -lwe 'my $x; sub foo :lvalue { $x } $x=1; print foo; foo=123; print $x'
1
123
Here's what happens if I try to add lvalueness to the sub after defining
the body:
$ perl -lwe 'my $x; sub foo { $x } sub foo :lvalue; $x=1; print foo; foo=123; print $x'
1
1
No error, or even warning, about using the sub call as an lvalue, but
it doesn't actually operate as an lvalue. Since the lvalue attribute
requires modifying the op tree, it would be difficult to apply to an
already-defined sub, so to attempt it should probably be an error.
For comparison, here's what happens if I try to add the attribute *before*
defining the body:
$ perl -lwe 'my $x; sub foo :lvalue; sub foo { $x } $x=1; print foo; foo=123; print $x'
Can't modify non-lvalue subroutine call in scalar assignment at -e line 1, near "123;"
Execution of -e aborted due to compilation errors.
Apparently the lvalue attribute gets lost when the body is defined
without the attribute. The assignment op sees that it's not an lvalue.
And here's a related situation:
$ perl -lwe 'my $x; sub foo :lvalue; $x=1; print foo; foo=123; print $x; sub foo { $x }'
1
1
As in the previous case, the pre-declared lvalueness is lost when the
body is defined. This time, though, by fiddling with the order of things
I'm able to trick the assignment op into thinking it's an lvalue sub.
It behaves like the lvalue-flagged non-lvalue sub that I'm reporting as
a bug. Not sure how this case ought to behave.
[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
category=core
severity=low
---
Site configuration information for perl 5.10.0:
Configured by Debian Project at Thu Jan 1 12:43:38 UTC 2009.
Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
Platform:
osname=linux, osvers=2.6.26-1-686, archname=i486-linux-gnu-thread-multi
uname='linux rebekka 2.6.26-1-686 #1 smp mon dec 15 18:15:07 utc 2008 i686 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.0 -Dsitearch=/usr/local/lib/perl/5.10.0 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.0 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
useithreads=define, usemultiplicity=define
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=undef, use64bitall=undef, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2 -g',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include'
ccversion='', gccversion='4.3.2', gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib /usr/lib64
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.7.so, so=so, useshrplib=true, libperl=libperl.so.5.10.0
gnulibc_version='2.7'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib'
Locally applied patches:
---
@INC for perl 5.10.0:
/etc/perl
/usr/local/lib/perl/5.10.0
/usr/local/share/perl/5.10.0
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.10
/usr/share/perl/5.10
/usr/local/lib/site_perl
.
---
Environment for perl 5.10.0:
HOME=/home/zefram
LANG (unset)
LANGUAGE (unset)
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/home/zefram/pub/i686-pc-linux-gnu/bin:/home/zefram/pub/common/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/local/bin:/usr/games
PERL_BADLANG (unset)
SHELL=/usr/bin/zsh
-
[perl #68758] lvalue sub flag set when impossible
by Zefram