Skip Menu |
Report information
Id: 132394
Status: new
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: zefram [at]

Operating System: (no value)
PatchStatus: (no value)
Severity: low
Type: core
Perl Version: 5.27.5
Fixed In: (no value)

CC: zefram [...]
To: perlbug [...]
From: zefram [...]
Subject: state stub doesn't get init-once behaviour
Date: Sat, 04 Nov 2017 01:11:24 +0000
Download (untitled) / with headers
text/plain 4.6k
This is a bug report for perl from, generated with the help of perlbug 1.40 running under perl 5.27.5. ----------------------------------------------------------------- [Please describe your issue here] $ perl -Mfeature=state -lwe '$i = 0; sub f { state() = $i++; 1; } f(); f(); print $i' 2 "state()" is a state variable declaration of a list of no variables. It is correctly parsed as a list, causing the assignment to be a list assignment. List assignment to a "state" expression is supposed to be forbidden currently, as a temporary arrangement until we're sure which expressions should qualify for initialisation semantics (which we now are) and pending implementation of those semantics. So it is a mistake that assignment to "state()" is accepted. But worse than it being accepted, it's accepted with the wrong semantics. Since "state()" is a "state" expression at its top level, assignment to it should get one-time-initialisation semantics. But as you see above, the rhs of the assignment is evaluated each time the assignment is reached. What's going on is that "state()" yields a bare "stub" op, with no flag or other clue of its "state" nature. Note that "(state())" yields an identical stub, but should not get initialisation semantics because its "state" isn't at top level. Assignment to "(state())" is therefore currently mistakenly accepted, but gets the correct behaviour, so isn't a problem. [Please do not change anything below this line] ----------------------------------------------------------------- --- Flags: category=core severity=low --- Site configuration information for perl 5.27.5: Configured by zefram at Fri Oct 20 23:24:00 BST 2017. Summary of my perl5 (revision 5 version 27 subversion 5) configuration: Platform: osname=linux osvers=3.16.0-4-amd64 archname=x86_64-linux-thread-multi uname='linux 3.16.0-4-amd64 #1 smp debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 gnulinux ' config_args='-des -Dprefix=/home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52 -Duselargefiles -Dusethreads -Uafs -Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dusedevel -Uversiononly -Ui_db' hint=recommended useposix=true d_sigaction=define useithreads=define usemultiplicity=define use64bitint=define use64bitall=define uselongdouble=undef usemymalloc=n default_inc_excludes_dot=define bincompat5005=undef Compiler: cc='cc' ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2' optimize='-O2' cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include' ccversion='' gccversion='4.9.2' gccosandvers='' intsize=4 longsize=8 ptrsize=8 doublesize=8 byteorder=12345678 doublekind=3 d_longlong=define longlongsize=8 d_longdbl=define longdblsize=16 longdblkind=3 ivtype='long' ivsize=8 nvtype='double' nvsize=8 Off_t='off_t' lseeksize=8 alignbytes=8 prototype=define Linker and Libraries: ld='cc' ldflags =' -fstack-protector-strong -L/usr/local/lib' libpth=/usr/local/lib /usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib libs=-lpthread -lnsl -ldb -ldl -lm -lcrypt -lutil -lc perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc so=so useshrplib=true gnulibc_version='2.19' Dynamic Linking: dlsrc=dl_dlopen.xs dlext=so d_dlsymun=undef ccdlflags='-Wl,-E -Wl,-rpath,/home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/5.27.5/x86_64-linux-thread-multi/CORE' cccdlflags='-fPIC' lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong' --- @INC for perl 5.27.5: /home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/site_perl/5.27.5/x86_64-linux-thread-multi /home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/site_perl/5.27.5 /home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/5.27.5/x86_64-linux-thread-multi /home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/5.27.5 --- Environment for perl 5.27.5: HOME=/home/zefram LANG (unset) LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/bin:/home/zefram/usr/perl/util:/home/zefram/pub/x86_64-unknown-linux-gnu/bin:/home/zefram/pub/common/bin:/usr/bin:/bin:/usr/local/bin:/usr/games PERLDOC=-oman PERL_BADLANG (unset) SHELL=/usr/bin/zsh
Date: Sat, 4 Nov 2017 01:55:33 +0000
Subject: Re: [perl #132394] state stub doesn't get init-once behaviour
From: Zefram <zefram [...]>
To: perl5-porters [...]
Download (untitled) / with headers
text/plain 354b
Additional: the same thing happens with "state(undef)", "state(undef, undef)", etc.: $ perl -Mfeature=state -lwe '$i = 0; sub f { state(undef) = $i++; 1; } f(); f(); print $i' 2 "state(undef)" compiles to an "undef" op, just like "(undef)". "state(undef, undef)" compiles to a "list" op containing two "undef" ops, just like "(undef, undef)". -zefram

This service is sponsored and maintained by Best Practical Solutions and runs on infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at