Mailing List Archive

logop threading breaks magic
This is a bug report for perl from zefram@fysh.org,
generated with the help of perlbug 1.44 running under perl 5.37.11.


-----------------------------------------------------------------
<!--[Please describe your issue here]-->

Here\'s a test of nested \&\& expressions\, nesting them in two ways
that should behave exactly the same\:

```
$ perl -we 'package Foo { sub TIESCALAR { bless({}) } sub FETCH { print "fetch "; 0 } } tie $a, "Foo"; print +do{ $a && 2 } && 3, "\n"; print +( $a && 2 ) && 3, "\n";'
fetch fetch fetch 0
fetch fetch 0
```

The get magic on \$a should be invoked three times\: once for the first
\&\&\, once for the second \&\&\, and once for the print\. The test case
with do\{\} is getting the right result\, and the case with parens is
getting it wrong\. If the get magic involved giving different values on
different fetches then this could result in an expression yielding the
wrong value\, not just having magical side effects happen the wrong
number of times\.

The culprit is the jump threading introduced in commit
db4d68cf2dda3f17d4e9fb440385189f55271b32 back in 5\.15\.1\. It means
that \"\(\$a \&\& \$b\) \&\& \$c\" effectively gets rewritten as \"\$a
\&\& \(\$b \&\& \$c\)\" by the peephole optimiser\. It looks like it was
intended as a pure optimisation\, and the effect on magical values was
just overlooked\. \(Magic isn\'t mentioned in the commit message\.\) The
formulation with do\{\} above doesn\'t suffer the bug because the jump
threading logic isn\'t clever enough to skip past the scope op which
will eventually be removed from the execution chain\.

<!--[Please do not change anything below this line]-->
<!------------------------------------------------------------------- -->


---
**Flags**
- category=core
- severity=low
---
**Perl configuration**
```
Site configuration information for perl 5.37.11:

Configured by zefram at Wed Apr 12 19:38:46 BST 2023.

Summary of my perl5 (revision 5 version 37 subversion 11) configuration:
Derived from: 243f8ce6f4073bdaa704088694d9fb7597ba9448
Platform:
osname=linux
osvers=5.10.0-21-amd64
archname=x86_64-linux-thread-multi
uname='linux barba.rous.org 5.10.0-21-amd64 #1 smp debian 5.10.162-1 (2023-01-21) x86_64 gnulinux '
config_args='-des -Dprefix=/home/zefram/usr/perl/perl_install/perl-git-blead-i64-f52 -Duselargefiles -Dusethreads -Uafs -Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dusedevel -Uversiononly -Ui_db -DDEBUGGING'
hint=recommended
useposix=true
d_sigaction=define
useithreads=define
usemultiplicity=define
use64bitint=define
use64bitall=define
uselongdouble=undef
usemymalloc=n
default_inc_excludes_dot=define
Compiler:
cc='cc'
ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -DDEBUGGING -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 -g'
cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
ccversion=''
gccversion='10.2.1 20210110'
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/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib
libs=-lpthread -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc
perllibs=-lpthread -ldl -lm -lcrypt -lutil -lc
libc=libc-2.31.so
so=so
useshrplib=true
libperl=libperl.so
gnulibc_version='2.31'
Dynamic Linking:
dlsrc=dl_dlopen.xs
dlext=so
d_dlsymun=undef
ccdlflags='-Wl,-E -Wl,-rpath,/home/zefram/usr/perl/perl_install/perl-git-blead-i64-f52/lib/5.37.11/x86_64-linux-thread-multi/CORE'
cccdlflags='-fPIC'
lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector-strong'

Locally applied patches:
uncommitted-changes

---
@INC for perl 5.37.11:
/home/zefram/usr/perl/pg/lib
/home/zefram/usr/perl/perl_install/perl-git-blead-i64-f52/lib/site_perl/5.37.11/x86_64-linux-thread-multi
/home/zefram/usr/perl/perl_install/perl-git-blead-i64-f52/lib/site_perl/5.37.11
/home/zefram/usr/perl/perl_install/perl-git-blead-i64-f52/lib/5.37.11/x86_64-linux-thread-multi
/home/zefram/usr/perl/perl_install/perl-git-blead-i64-f52/lib/5.37.11

---
Environment for perl 5.37.11:
HOME=/home/zefram
LANG (unset)
LANGUAGE (unset)
LD_LIBRARY_PATH=/home/zefram/usr/perl/pg
LOGDIR (unset)
PATH=/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
PERL5LIB=/home/zefram/usr/perl/pg/lib
PERL_BADLANG (unset)
SHELL=/usr/bin/zsh
```