Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Non-finite repeat count warning isn't emitted consistently #15929

Open
p5pRT opened this issue Mar 23, 2017 · 4 comments
Open

Non-finite repeat count warning isn't emitted consistently #15929

p5pRT opened this issue Mar 23, 2017 · 4 comments

Comments

@p5pRT
Copy link

p5pRT commented Mar 23, 2017

Migrated from rt.perl.org#131050 (status was 'open')

Searchable as RT131050$

@p5pRT
Copy link
Author

p5pRT commented Mar 23, 2017

From @mauke

Created by @mauke

$ perl -wE '$_ = 2 x ("inf" + 0); say "[$_]"'
Non-finite repeat count does nothing at -e line 1.
[]

Good.

$ perl -wE '$_ = 2 x "inf"; say "[$_]"'
[]

No warning here. I think this is a bug because the right operand of x should be
in numeric context anyway.

Perl Info

Flags:
    category=core
    severity=low

Site configuration information for perl 5.24.1:

Configured by mauke at Sun Feb 19 23:06:44 CET 2017.

Summary of my perl5 (revision 5 version 24 subversion 1) configuration:
   
  Platform:
    osname=linux, osvers=4.9.6-1-arch, archname=i686-linux
    uname='linux simplicio 4.9.6-1-arch #1 smp preempt thu jan 26 09:41:20 cet 2017 i686 gnulinux '
    config_args=''
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=undef, usemultiplicity=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2 -flto',
    cppflags='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
    ccversion='', gccversion='6.3.1 20170109', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234, doublekind=3
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12, longdblkind=3
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags ='-fstack-protector-strong -L/usr/local/lib'
    libpth=/usr/local/lib /usr/lib/gcc/i686-pc-linux-gnu/6.3.1/include-fixed /usr/lib /lib
    libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
    perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
    libc=libc-2.24.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.24'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -flto -L/usr/local/lib -fstack-protector-strong'



@INC for perl 5.24.1:
    /home/mauke/usr/lib/perl5/site_perl/5.24.1/i686-linux
    /home/mauke/usr/lib/perl5/site_perl/5.24.1
    /home/mauke/usr/lib/perl5/5.24.1/i686-linux
    /home/mauke/usr/lib/perl5/5.24.1


Environment for perl 5.24.1:
    HOME=/home/mauke
    LANG=en_US.UTF-8
    LANGUAGE=en_US
    LC_COLLATE=C
    LC_MONETARY=de_DE.UTF-8
    LC_TIME=de_DE.UTF-8
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/home/mauke/perl5/perlbrew/bin:/home/mauke/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
    PERLBREW_BASHRC_VERSION=0.73
    PERLBREW_HOME=/home/mauke/.perlbrew
    PERLBREW_ROOT=/home/mauke/perl5/perlbrew
    PERL_BADLANG (unset)
    PERL_UNICODE=SAL
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Jun 5, 2017

From @tonycoz

$ perl -wE '$_ = 2 x ("inf" + 0); say "[$_]"'
Non-finite repeat count does nothing at -e line 1.
[]

Good.

$ perl -wE '$_ = 2 x "inf"; say "[$_]"'
[]

No warning here. I think this is a bug because the right operand of x
should be
in numeric context anyway.

Something like​:

Inline Patch
diff --git a/pp.c b/pp.c
index 6df2101..2ad4021 100644
--- a/pp.c
+++ b/pp.c
@@ -1804,8 +1804,11 @@ PP(pp_repeat)
                 count = (IV)nv;
         }
     }
-    else
+    else {
        count = SvIV_nomg(sv);
+        if (SvNOKp(sv) && Perl_isinfnan(SvNVX(sv)))
+            infnan = TRUE;
+    }
 
     if (infnan) {
         Perl_ck_warner(aTHX_ packWARN(WARN_NUMERIC),

(it might better to just:   if \(SvNOKp\(sv\)\) goto the\_nokp\_case; \)

fixes your case, but doesn't help if the count is overloaded​:

  $ ./perl -Ilib -wE '$x = bless {}, "Foo"; say "[", "x" x $x, "]"; package Foo; use overload "0+" => sub { "Inf" };'
  []

which I don't see a fix for without making a smarter SvIV() interface.

Tony

@p5pRT
Copy link
Author

p5pRT commented Jun 5, 2017

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Nov 2, 2017

From zefram@fysh.org

Similar inconsistent behaviour​:

$ perl -lwe '@​a=qw(aa bb cc); print $a["inf"]; print $a["inf" + 0]'
aa
cc

Seems that bare "inf" is zeroish in an integer context, while an "inf"
that has been numericised is detectably non-integer.

-zefram

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants