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

perl thinks a hash is a scalar in push/keys error messages #15774

Closed
p5pRT opened this issue Dec 17, 2016 · 9 comments
Closed

perl thinks a hash is a scalar in push/keys error messages #15774

p5pRT opened this issue Dec 17, 2016 · 9 comments

Comments

@p5pRT
Copy link

p5pRT commented Dec 17, 2016

Migrated from rt.perl.org#130367 (status was 'resolved')

Searchable as RT130367$

@p5pRT
Copy link
Author

p5pRT commented Dec 17, 2016

From @xsawyerx

Created by @xsawyerx

This is a bug report for perl from xsawyerx@​cpan.org,
generated with the help of perlbug 1.40 running under perl 5.22.1.

-----------------------------------------------------------------

When attempting to run "push" on a hash, we get the same error as when
on a scalar, except it still includes the word "scalar", even though
it's a hash. Haven't checked pop/shift/unshift, but I imagine they're
the same.

This was observed on both 5.22.1 and blead (past 5.25.8)​:

5.22.1​:

$ perl -v
This is perl 5, version 22, subversion 1 (v5.22.1) built for
x86_64-linux-gnu-thread-multi

# OK
$ perl -E'push $k,1'
push on reference is experimental at -e line 1.
Not an ARRAY reference at -e line 1.

# Should be "push on hash"
$ perl -E'push %k,1'
push on reference is experimental at -e line 1.
Not an ARRAY reference at -e line 1.

5.25.8 (blead)​:

$ ./perl -v
This is perl 5, version 25, subversion 8 (v5.25.8
(v5.25.7-136-g1451f69)) built for x86_64-linux-thread-multi

# OK
$ ./perl -Ilib -E'push $k, "hello"'
Experimental push on scalar is now forbidden at -e line 1, at EOF

# OK
$ ./perl -Ilib -E'keys $k'
Experimental keys on scalar is now forbidden at -e line 1.
Type of arg 1 to keys must be hash or array (not scalar dereference)
at -e line 1, at EOF

# Should be "push on hash"
$ ./perl -Ilib -E'push %k, 1'
Experimental push on scalar is now forbidden at -e line 1, at EOF

Perl Info

Flags:
    category=core
    severity=low

Site configuration information for perl 5.22.1:

Configured by Debian Project at Sun Mar 13 11:54:18 UTC 2016.

Summary of my perl5 (revision 5 version 22 subversion 1) configuration:

  Platform:
    osname=linux, osvers=3.16.0, archname=x86_64-linux-gnu-thread-multi
    uname='linux localhost 3.16.0 #1 smp debian 3.16.0 x86_64 gnulinux '
    config_args='-Dusethreads -Duselargefiles
-Dcc=x86_64-linux-gnu-gcc -Dcpp=x86_64-linux-gnu-cpp
-Dld=x86_64-linux-gnu-gcc -Dccflags=-DDEBIAN -Wdate-time
-D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector-strong -Wformat
-Werror=format-security -Dldflags= -Wl,-Bsymbolic-functions
-Wl,-z,relro -Dlddlflags=-shared -Wl,-Bsymbolic-functions -Wl,-z,relro
-Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.22
-Darchlib=/usr/lib/x86_64-linux-gnu/perl/5.22 -Dvendorprefix=/usr
-Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/x86_64-linux-gnu/perl5/5.22
-Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.22.1
-Dsitearch=/usr/local/lib/x86_64-linux-gnu/perl/5.22.1
-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3
-Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3
-Duse64bitint -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio
-Uusenm -Ui_libutil -Uversiononly -DDEBUGGING=-g -Doptimize=-O2 -dEs
-Duseshrplib -Dlibperl=libperl.so.5.22.1'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='x86_64-linux-gnu-gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE
-DDEBIAN -fwrapv -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 -fwrapv
-fno-strict-aliasing -pipe -I/usr/local/include'
    ccversion='', gccversion='5.3.1 20160311', 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='x86_64-linux-gnu-gcc', ldflags =' -fstack-protector-strong
-L/usr/local/lib'
    libpth=/usr/local/lib
/usr/lib/gcc/x86_64-linux-gnu/5/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=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=libc-2.21.so, so=so, useshrplib=true, libperl=libperl.so.5.22
    gnulibc_version='2.21'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib
-fstack-protector-strong'

Locally applied patches:
    DEBPKG:debian/cpan_definstalldirs - Provide a sensible INSTALLDIRS
default for modules installed from CPAN.
    DEBPKG:debian/db_file_ver - http://bugs.debian.org/340047 Remove
overly restrictive DB_File version check.
    DEBPKG:debian/doc_info - Replace generic man(1) instructions with
Debian-specific information.
    DEBPKG:debian/enc2xs_inc - http://bugs.debian.org/290336 Tweak
enc2xs to follow symlinks and ignore missing @INC directories.
    DEBPKG:debian/errno_ver - http://bugs.debian.org/343351 Remove
Errno version check due to upgrade problems with long-running
processes.
    DEBPKG:debian/libperl_embed_doc - http://bugs.debian.org/186778
Note that libperl-dev package is required for embedded linking
    DEBPKG:fixes/respect_umask - Respect umask during installation
    DEBPKG:debian/writable_site_dirs - Set umask approproately for
site install directories
    DEBPKG:debian/extutils_set_libperl_path - EU:MM: set location of
libperl.a under /usr/lib
    DEBPKG:debian/no_packlist_perllocal - Don't install .packlist or
perllocal.pod for perl or vendor
    DEBPKG:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to
the binary targets.
    DEBPKG:debian/instmodsh_doc - Debian policy doesn't install
.packlist files for core or vendor.
    DEBPKG:debian/ld_run_path - Remove standard libs from LD_RUN_PATH
as per Debian policy.
    DEBPKG:debian/libnet_config_path - Set location of libnet.cfg to
/etc/perl/Net as /usr may not be writable.
    DEBPKG:debian/mod_paths - Tweak @INC ordering for Debian
    DEBPKG:debian/prune_libs - http://bugs.debian.org/128355 Prune the
list of libraries wanted to what we actually need.
    DEBPKG:fixes/net_smtp_docs - [rt.cpan.org #36038]
http://bugs.debian.org/100195 Document the Net::SMTP 'Port' option
    DEBPKG:debian/perlivp - http://bugs.debian.org/510895 Make perlivp
skip include directories in /usr/local
    DEBPKG:debian/deprecate-with-apt - http://bugs.debian.org/747628
Point users to Debian packages of deprecated core modules
    DEBPKG:debian/squelch-locale-warnings -
http://bugs.debian.org/508764 Squelch locale warnings in Debian
package maintainer scripts
    DEBPKG:debian/skip-upstream-git-tests - Skip tests specific to the
upstream Git repository
    DEBPKG:debian/patchlevel - http://bugs.debian.org/567489 List
packaged patches for 5.22.1-9 in patchlevel.h
    DEBPKG:debian/skip-kfreebsd-crash - http://bugs.debian.org/628493
[perl #96272] Skip a crashing test case in t/op/threads.t on
GNU/kFreeBSD
    DEBPKG:fixes/document_makemaker_ccflags -
http://bugs.debian.org/628522 [rt.cpan.org #68613] Document that
CCFLAGS should include $Config{ccflags}
    DEBPKG:debian/find_html2text - http://bugs.debian.org/640479
Configure CPAN::Distribution with correct name of html2text
    DEBPKG:debian/perl5db-x-terminal-emulator.patch -
http://bugs.debian.org/668490 Invoke x-terminal-emulator rather than
xterm in perl5db.pl
    DEBPKG:debian/cpan-missing-site-dirs -
http://bugs.debian.org/688842 Fix CPAN::FirstTime defaults with
nonexisting site dirs if a parent is writable
    DEBPKG:fixes/memoize_storable_nstore - [rt.cpan.org #77790]
http://bugs.debian.org/587650 Memoize::Storable: respect 'nstore'
option not respected
    DEBPKG:debian/regen-skip - Skip a regeneration check in unrelated
git repositories
    DEBPKG:debian/makemaker-pasthru - http://bugs.debian.org/758471
Pass LD settings through to subdirectories
    DEBPKG:fixes/pod_man_reproducible_date -
http://bugs.debian.org/759405 Support POD_MAN_DATE in Pod::Man for the
left-hand footer
    DEBPKG:debian/locale-robustness - http://bugs.debian.org/782068
[perl #124310] Make t/run/locale.t survive missing locales masked by
LC_ALL
    DEBPKG:fixes/podman-utc - http://bugs.debian.org/780259 Make the
embedded date from Pod::Man reproducible
    DEBPKG:fixes/podman-utc-docs - http://bugs.debian.org/780259
Documentation and test suite updates for UTC fix
    DEBPKG:fixes/podman-empty-date - http://bugs.debian.org/780259
Support an empty POD_MAN_DATE environment variable
    DEBPKG:fixes/podman-pipe - http://bugs.debian.org/777405 Better
errors for man pages from standard input
    DEBPKG:debian/pod2man-customized - Update porting/customized.dat
for pod2man modifications
    DEBPKG:debian/makemaker-manext - http://bugs.debian.org/247370
Make EU::MakeMaker honour MANnEXT settings in generated manpage
headers
    DEBPKG:debian/makemaker_customized - Update
t/porting/customized.dat for files patched in Debian
    DEBPKG:debian/do-not-record-build-date - [6baa8db]
http://bugs.debian.org/774422 [perl #125830] Allow overriding the
compile time in "perl -V" output
    DEBPKG:fixes/podman-source-date-epoch -
http://bugs.debian.org/801621 Make Pod::Man honor the
SOURCE_DATE_EPOCH environment variable
    DEBPKG:fixes/podman-source-date-epoch-cleanups -
http://bugs.debian.org/801621 Coding style and documentation for
SOURCE_EPOCH_DATE
    DEBPKG:fixes/podman-source-date-epoch-testfix -
http://bugs.debian.org/807086 Guard for building with
SOURCE_DATE_EPOCH or POD_MAN_DATE set
    DEBPKG:debian/devel-ppport-reproducibility -
http://bugs.debian.org/801523 Sort the list of XS code files when
generating RealPPPort.xs
    DEBPKG:fixes/encode-unicode-bom - http://bugs.debian.org/798727
[rt.cpan.org #107043] Address
https://rt.cpan.org/Public/Bug/Display.html?id=107043
    DEBPKG:debian/encode-unicode-bom-doc -
http://bugs.debian.org/798727 Document Debian backport of
Encode::Unicode fix
    DEBPKG:debian/kfreebsd-softupdates - http://bugs.debian.org/796798
Work around Debian Bug#796798
    DEBPKG:fixes/autodie-scope - http://bugs.debian.org/798096 Fix a
scoping issue with "no autodie" and the "system" sub
    DEBPKG:debian/debugperl-compat-fix - [perl #127212]
http://bugs.debian.org/810326 Disable PERL_TRACK_MEMPOOL for debugging
builds
    DEBPKG:fixes/CVE-2015-8607_file_spec_taint_fix -
http://bugs.debian.org/810719 [perl #126862] ensure
File::Spec::canonpath() preserves taint
    DEBPKG:fixes/mkstemp-umask - http://bugs.debian.org/810924 [perl
#127322] [e57270b] Fix umask for mkstemp(3) calls
    DEBPKG:fixes/crosscompile-no-targethost - [perl #127234] Fix the
Configure escape with usecrosscompile but no targethost
    DEBPKG:fixes/podlators-no-encode - [rt.cpan.org #111156] Degrade
gracefully if utf8 is requested but Encode is not available
    DEBPKG:debian/cross-time-hires - [rt.cpan.org #111391] Add an
environment variable to skip running configuration probes
    DEBPKG:fixes/encode-unicode-pod - Unicode.pm: Fix POD error
    DEBPKG:fixes/memoize-pod - [rt.cpan.org #89441] Fix POD errors in Memoize
    DEBPKG:fixes/ok-pod - Added encoding for pod.
    DEBPKG:fixes/CVE-2016-2381_duplicate_env - remove duplicate
environment variables from environ


@INC for perl 5.22.1:
    /home/sawyer/perl5/lib/perl5/5.22.1/x86_64-linux-gnu-thread-multi
    /home/sawyer/perl5/lib/perl5/5.22.1
    /home/sawyer/perl5/lib/perl5/x86_64-linux-gnu-thread-multi
    /home/sawyer/perl5/lib/perl5
    /home/sawyer/perl5/lib/perl5/5.22.1/x86_64-linux-gnu-thread-multi
    /home/sawyer/perl5/lib/perl5/5.22.1
    /home/sawyer/perl5/lib/perl5/x86_64-linux-gnu-thread-multi
    /home/sawyer/perl5/lib/perl5
    /etc/perl
    /usr/local/lib/x86_64-linux-gnu/perl/5.22.1
    /usr/local/share/perl/5.22.1
    /usr/lib/x86_64-linux-gnu/perl5/5.22
    /usr/share/perl5
    /usr/lib/x86_64-linux-gnu/perl/5.22
    /usr/share/perl/5.22
    /usr/local/lib/site_perl
    /usr/lib/x86_64-linux-gnu/perl-base
    .


Environment for perl 5.22.1:
    HOME=/home/sawyer
    LANG=en_US.UTF-8
    LANGUAGE=en_US
    LC_ADDRESS=en_US.UTF-8
    LC_IDENTIFICATION=en_US.UTF-8
    LC_MEASUREMENT=en_US.UTF-8
    LC_MONETARY=en_US.UTF-8
    LC_NAME=en_US.UTF-8
    LC_NUMERIC=en_US.UTF-8
    LC_PAPER=en_US.UTF-8
    LC_TELEPHONE=en_US.UTF-8
    LC_TIME=en_US.UTF-8
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/home/sawyer/.screenlayout/:/home/sawyer/perl5/bin:/home/sawyer/perl5/perlbrew/bin:/home/sawyer/.screenlayout/:/home/sawyer/perl5/bin:/home/sawyer/bin:/home/sawyer/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
    PERL5LIB=/home/sawyer/perl5/lib/perl5:/home/sawyer/perl5/lib/perl5
    PERLBREW_BASHRC_VERSION=0.76
    PERLBREW_HOME=/home/sawyer/.perlbrew
    PERLBREW_ROOT=/home/sawyer/perl5/perlbrew
    PERL_BADLANG (unset)
    PERL_LOCAL_LIB_ROOT=/home/sawyer/perl5:/home/sawyer/perl5
    PERL_MB_OPT=--install_base "/home/sawyer/perl5"
    PERL_MM_OPT=INSTALL_BASE=/home/sawyer/perl5
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Dec 19, 2016

From @tonycoz

On Sat, 17 Dec 2016 08​:01​:20 -0800, xsawyerx@​gmail.com wrote​:

When attempting to run "push" on a hash, we get the same error as when
on a scalar, except it still includes the word "scalar", even though
it's a hash. Haven't checked pop/shift/unshift, but I imagine they're
the same.

Something like the attached?

$ ./perl -e 'push %x,1;' -e 'pop %x;' -e 'push *x,1;' -e 'pop *x;'
Type of arg 1 to push must be array (not hash dereference) at -e line 1, near "1;"
Type of arg 1 to pop must be array (not hash dereference) at -e line 2, near "%x;"
Type of arg 1 to push must be array (not ref-to-glob cast) at -e line 3, near "1;"
Type of arg 1 to pop must be array (not ref-to-glob cast) at -e line 4, near "*x;"
Execution of -e aborted due to compilation errors.

which matches what older perls did for the same code​:

*x;'
Type of arg 1 to push must be array (not hash dereference) at -e line 1, near "1;"
Type of arg 1 to pop must be array (not hash dereference) at -e line 2, near "%x;"
Type of arg 1 to push must be array (not ref-to-glob cast) at -e line 3, near "1;"
Type of arg 1 to pop must be array (not ref-to-glob cast) at -e line 4, near "*x;"
Execution of -e aborted due to compilation errors.

without removing the useful message that the experimental feature has been removed.

Tony

@p5pRT
Copy link
Author

p5pRT commented Dec 19, 2016

From @tonycoz

0001-perl-130367-separate-error-for-push-etc-on-hash-glob.patch
From e6351e84883dbab5dad9844dbea7acc4f9b099cc Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Mon, 19 Dec 2016 10:49:27 +1100
Subject: (perl #130367) separate error for push etc on hash/glob

needs tests
---
 op.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/op.c b/op.c
index 722ee35..b66181d 100644
--- a/op.c
+++ b/op.c
@@ -10044,6 +10044,10 @@ Perl_ck_fun(pTHX_ OP *o)
 		         || SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVAV  )
 		        )
 		    bad_type_pv(numargs, "array", o, kid);
+                else if (kid->op_type == OP_RV2HV || kid->op_type == OP_PADHV
+                         || kid->op_type == OP_RV2GV) {
+                    bad_type_pv(1, "array", o, kid);
+                }
 		else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV) {
                     yyerror_pv(Perl_form(aTHX_ "Experimental %s on scalar is now forbidden",
                                          PL_op_desc[type]), 0);
-- 
2.1.4

@p5pRT
Copy link
Author

p5pRT commented Dec 19, 2016

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

@p5pRT
Copy link
Author

p5pRT commented Apr 8, 2018

From @xsawyerx

On Sun, 18 Dec 2016 16​:02​:50 -0800, tonyc wrote​:

On Sat, 17 Dec 2016 08​:01​:20 -0800, xsawyerx@​gmail.com wrote​:

When attempting to run "push" on a hash, we get the same error as
when
on a scalar, except it still includes the word "scalar", even though
it's a hash. Haven't checked pop/shift/unshift, but I imagine they're
the same.

Something like the attached?

I only now saw I haven't responded to this. So sorry.

Yes, this is perfect.

@p5pRT
Copy link
Author

p5pRT commented Jan 22, 2019

From @tonycoz

On Sun, 08 Apr 2018 00​:38​:54 -0700, xsawyerx@​gmail.com wrote​:

On Sun, 18 Dec 2016 16​:02​:50 -0800, tonyc wrote​:

On Sat, 17 Dec 2016 08​:01​:20 -0800, xsawyerx@​gmail.com wrote​:

When attempting to run "push" on a hash, we get the same error as
when
on a scalar, except it still includes the word "scalar", even though
it's a hash. Haven't checked pop/shift/unshift, but I imagine they're
the same.

Something like the attached?

I only now saw I haven't responded to this. So sorry.

Yes, this is perfect.

I missed your reply too.

Applied as 5d4636a with some extra tests.

Tony

@p5pRT
Copy link
Author

p5pRT commented Jan 22, 2019

@tonycoz - Status changed from 'open' to 'pending release'

@p5pRT
Copy link
Author

p5pRT commented May 22, 2019

From @khwilliamson

Thank you for filing this report. You have helped make Perl better.

With the release today of Perl 5.30.0, this and 160 other issues have been
resolved.

Perl 5.30.0 may be downloaded via​:
https://metacpan.org/release/XSAWYERX/perl-5.30.0

If you find that the problem persists, feel free to reopen this ticket.

@p5pRT
Copy link
Author

p5pRT commented May 22, 2019

@khwilliamson - Status changed from 'pending release' to 'resolved'

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

1 participant