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

Setting $[ = 0 should not generate a warning #15107

Closed
p5pRT opened this issue Dec 28, 2015 · 15 comments
Closed

Setting $[ = 0 should not generate a warning #15107

p5pRT opened this issue Dec 28, 2015 · 15 comments

Comments

@p5pRT
Copy link

p5pRT commented Dec 28, 2015

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

Searchable as RT127063$

@p5pRT
Copy link
Author

p5pRT commented Dec 28, 2015

From @jimav

This is a bug report for perl from jim.avera@​gmail.com,
generated with the help of perlbug 1.40 running under perl 5.20.2.


  perl -we 'local $[ = 0;'
  Use of assignment to $[ is deprecated at -e line 1.

This warning makes some old code noisy even if the only thing the code does
is to set $[ to zero to to protect against callers leaving $[ in another
state (which was possible Perl 4, at least).

An example is the html2ps utility distributed with Ubuntu (in this particular
case it is wholly unnecessary but nevertheless the $[=0 seems to have been
inherited from some Getopt examples from way back).

Regardless, it would be nice if the warning was only issued when $[ is set to
something other than zero.



Flags​:
  category=core
  severity=low


Site configuration information for perl 5.20.2​:

Configured by Debian Project at Thu May 14 17​:30​:11 UTC 2015.

Summary of my perl5 (revision 5 version 20 subversion 2) configuration​:
 
  Platform​:
  osname=linux, osvers=3.2.0-77-generic, archname=x86_64-linux-gnu-thread-multi
  uname='linux allspice 3.2.0-77-generic #112-ubuntu smp tue feb 10 15​:22​:22 utc 2015 x86_64 x86_64 x86_64 gnulinux '
  config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -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.20 -Darchlib=/usr/lib/x86_64-linux-gnu/perl/5.20 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/x86_64-linux-gnu/perl5/5.20 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.20.2 -Dsitearch=/usr/local/lib/x86_64-linux-gnu/perl/5.20.2 -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 -Duseshrplib -Dlibperl=libperl.so.5.20.2 -des'
  hint=recommended, useposix=true, d_sigaction=define
  useithreads=define, usemultiplicity=define
  use64bitint=define, use64bitall=define, uselongdouble=undef
  usemymalloc=n, bincompat5005=undef
  Compiler​:
  cc='cc', 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='4.9.2', gccosandvers=''
  intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
  d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
  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 -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=-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.20
  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'

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/prefix_changes - Fiddle with *PREFIX and variables written to the makefile
  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/module_build_man_extensions - http​://bugs.debian.org/479460 Adjust Module​::Build manual page extensions for the Debian Perl policy
  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.20.2-6 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​:fixes/regcomp-mips-optim - [perl #122817] http​://bugs.debian.org/754054 Downgrade the optimization of regcomp.c on mips and mipsel due to a gcc-4.9 bug
  DEBPKG​:debian/makemaker-pasthru - http​://bugs.debian.org/758471 Pass LD settings through to subdirectories
  DEBPKG​:fixes/perldoc-less-R - [rt.cpan.org #98636] http​://bugs.debian.org/758689 Tell the 'less' pager to allow terminal escape sequences
  DEBPKG​:fixes/pod_man_reproducible_date - http​://bugs.debian.org/759405 Support POD_MAN_DATE in Pod​::Man for the left-hand footer
  DEBPKG​:fixes/io_uncompress_gunzip_inmemory - http​://bugs.debian.org/747363 [rt.cpan.org #95494] Fix gunzip to in-memory file handle
  DEBPKG​:fixes/socket_test_recv_fix - http​://bugs.debian.org/758718 [perl #122657] Compare recv return value to peername in socket test
  DEBPKG​:fixes/hurd_socket_recv_todo - http​://bugs.debian.org/758718 [perl #122657] TODO checking the result of recv() on hurd
  DEBPKG​:fixes/regexp-performance - [0fa70a0] http​://bugs.debian.org/777556 [perl #123743] simpify and speed up /.*.../ handling
  DEBPKG​:fixes/failed_require_diagnostics - http​://bugs.debian.org/781120 [perl #123270] Report inaccesible file on failed require
  DEBPKG​:fixes/array-cloning - http​://bugs.debian.org/779357 [perl #124127] [902d169] fix cloning arrays with unused elements
  DEBPKG​:fixes/perldb-threads - http​://bugs.debian.org/779357 [perl #124127] [41ef2c6] lib/perl5db.pl​: Restore noop lock prototype
  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/gcc5-errno - http​://bugs.debian.org/778060 [perl #123784] [816b056] Fix Errno.pm generation for gcc-5.0
  DEBPKG​:fixes/h2ph-hex-constants - http​://bugs.debian.org/778060 [perl #123784] [3bea78d] h2ph​: correct handling of hex constants for the preamble
  DEBPKG​:fixes/h2ph-test-inc - http​://bugs.debian.org/778060 [perl #123784] [3359391] lib/h2ph.t to test generated t/_h2ph_pre.ph instead of the system one
  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


@​INC for perl 5.20.2​:
  /home/jima/lib/perl
  /home/jima/perl5/lib/perl5/x86_64-linux-gnu-thread-multi
  /home/jima/perl5/lib/perl5/x86_64-linux-gnu-thread-multi
  /home/jima/perl5/lib/perl5
  /etc/perl
  /usr/local/lib/x86_64-linux-gnu/perl/5.20.2
  /usr/local/share/perl/5.20.2
  /usr/lib/x86_64-linux-gnu/perl5/5.20
  /usr/share/perl5
  /usr/lib/x86_64-linux-gnu/perl/5.20
  /usr/share/perl/5.20
  /usr/local/lib/site_perl
  .


Environment for perl 5.20.2​:
  HOME=/home/jima
  LANG=en_US.UTF-8
  LANGUAGE=en_US
  LD_LIBRARY_PATH=/home/jima/local/lib
  LOGDIR (unset)
  PATH=/home/jima/perl5/bin​:/home/jima/bin​:/home/jima/local/bin​:/home/jima/jima_tools/x86_64/bin​:/home/jima/jima_tools/bin​:/opt/Adobe/Reader9/bin​:/usr/bin​:/bin​:/usr/sbin​:/sbin​:/usr/bin/X11​:/usr/local/sbin​:/usr/games​:/usr/local/games​:/usr/lib/jvm/java-8-oracle/bin​:/usr/lib/jvm/java-8-oracle/db/bin​:/usr/lib/jvm/java-8-oracle/jre/bin​:.
  PERL5LIB=/home/jima/lib/perl​:/home/jima/perl5/lib/perl5/x86_64-linux-gnu-thread-multi​:/home/jima/perl5/lib/perl5
  PERL_BADLANG (unset)
  PERL_LOCAL_LIB_ROOT=/home/jima/perl5
  PERL_MB_OPT=--install_base /home/jima/perl5
  PERL_MM_OPT=INSTALL_BASE=/home/jima/perl5
  SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Dec 29, 2015

From @jkeenan

On Mon Dec 28 14​:19​:28 2015, jim.avera@​gmail.com wrote​:

This is a bug report for perl from jim.avera@​gmail.com,
generated with the help of perlbug 1.40 running under perl 5.20.2.

-----------------------------------------------------------------
perl -we 'local $[ = 0;'
Use of assignment to $[ is deprecated at -e line 1.

This warning makes some old code noisy even if the only thing the code
does
is to set $[ to zero to to protect against callers leaving $[ in
another
state (which was possible Perl 4, at least).

An example is the html2ps utility distributed with Ubuntu (in this
particular
case it is wholly unnecessary but nevertheless the $[=0 seems to have
been
inherited from some Getopt examples from way back).

Regardless, it would be nice if the warning was only issued when $[ is
set to
something other than zero.

To facilitate discussion of this ticket, here's the current documentation in blead pod/perlvar.pod for $[​:

##########
This variable stores the index of the first element in an array, and
of the first character in a substring. The default is 0, but you could
theoretically set it to 1 to make Perl behave more like B<awk> (or Fortran)
when subscripting and when evaluating the index() and substr() functions.

As of release 5 of Perl, assignment to C<$[> is treated as a compiler
directive, and cannot influence the behavior of any other file.
(That's why you can only assign compile-time constants to it.)
Its use is highly discouraged.

Prior to Perl v5.10.0, assignment to C<$[> could be seen from outer lexical
scopes in the same file, unlike other compile-time directives (such as
L<strict>). Using local() on it would bind its value strictly to a lexical
block. Now it is always lexically scoped.

As of Perl v5.16.0, it is implemented by the L<arybase> module. See
L<arybase> for more details on its behaviour.

Under C<use v5.16>, or C<no feature "array_base">, C<$[> no longer has any
effect, and always contains 0. Assigning 0 to it is permitted, but any
other value will produce an error.

Mnemonic​: [ begins subscripts.

Deprecated in Perl v5.12.0.
#####

Thank you very much.

--
James E Keenan (jkeenan@​cpan.org)

@p5pRT
Copy link
Author

p5pRT commented Dec 29, 2015

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

@p5pRT
Copy link
Author

p5pRT commented Dec 29, 2015

From zefram@fysh.org

On Mon Dec 28 14​:19​:28 2015, jim.avera@​gmail.com wrote​:
This warning makes some old code noisy even if the only thing the code does
is to set $[ to zero to to protect against callers leaving $[ in another
state (which was possible Perl 4, at least).

It is not possible in Perl 5. $[ has been lexically scoped since 5.000.
The only purpose of assigning to $[ in Perl 5 is if the code is actually
Perl 4 code, and needs to remain runnable on Perl 4.

-zefram

@p5pRT
Copy link
Author

p5pRT commented Dec 29, 2015

From @Leont

On Tue, Dec 29, 2015 at 1​:33 AM, Zefram <zefram@​fysh.org> wrote​:

The only purpose of assigning to $[ in Perl 5 is if the code is actually
Perl 4 code, and needs to remain runnable on Perl 4.

Actually, I think a2p can still output $[ = 1, and that may have been the
biggest use-case for a long time. I don't think anyone is really using a2p
any more though.

Leon

@p5pRT
Copy link
Author

p5pRT commented Dec 29, 2015

From zefram@fysh.org

Leon Timmermans wrote​:

Actually, I think a2p can still output $[ = 1,

No, I fixed that six years ago. We then removed from the core the ability
to have a non-zero base index (though it remains available from modules).
All that remains in the core is the vestigial acceptance of setting $[
to 0, which has no semantic effect. a2p has also been subsequently
ejected from the core.

-zefram

@p5pRT
Copy link
Author

p5pRT commented Dec 31, 2015

From @ap

* Zefram <zefram@​fysh.org> [2015-12-29 01​:35]​:

The only purpose of assigning to $[ in Perl 5 is if the code is
actually Perl 4 code, and needs to remain runnable on Perl 4.

The only purpose of warning about `$[ = 0` is if there were plans to
change the nature of $[ in ways that make that statement not a no-op.

Otherwise there is no point in bugging users about the fact that the
programmer who wrote the code they’re using put something in it that
doesn’t have any effect (whether good or bad) but is just stylistically
discouraged by the Perl community.

That sort of thing belongs in a linter to inform the programmer writing
the code – not in a warning for the user just running the code.

Strictly speaking this is even true of `$[ = 1` but that does actually
does something so there is ever so much more of a case for a warning.

Regards,
--
Aristotle Pagaltzis // <http​://plasmasturm.org/>

@p5pRT
Copy link
Author

p5pRT commented Dec 31, 2015

From @Leont

On Tue, Dec 29, 2015 at 10​:14 PM, Zefram <zefram@​fysh.org> wrote​:

a2p has also been subsequently ejected from the core.

I know, I did that myself! :-p

Leon

@p5pRT
Copy link
Author

p5pRT commented Jan 4, 2016

From @tonycoz

On Thu Dec 31 04​:33​:34 2015, aristotle wrote​:

* Zefram <zefram@​fysh.org> [2015-12-29 01​:35]​:

The only purpose of assigning to $[ in Perl 5 is if the code is
actually Perl 4 code, and needs to remain runnable on Perl 4.

The only purpose of warning about `$[ = 0` is if there were plans to
change the nature of $[ in ways that make that statement not a no-op.

Otherwise there is no point in bugging users about the fact that the
programmer who wrote the code they’re using put something in it that
doesn’t have any effect (whether good or bad) but is just stylistically
discouraged by the Perl community.

The attached suppresses the warning.

It doesn't prevent arybase from being loaded, but arybase won't do its
op replacement when the base is zero, so there's little performance loss.

Whether this should ba applied....

I'm more of the mind of removing $[ completely, but didn't speak up when
arybase was added...

Tony

@p5pRT
Copy link
Author

p5pRT commented Jan 19, 2016

From @tonycoz

On Sun Jan 03 16​:16​:17 2016, tonyc wrote​:

The attached suppresses the warning.

Now with actual attaching!

Tony

@p5pRT
Copy link
Author

p5pRT commented Jan 19, 2016

From @tonycoz

0001-perl-127063-suppress-warning-on-assigning-0-to.patch
From c38016329d24687f91b38925c33b1dd57d79681c Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Mon, 4 Jan 2016 11:13:19 +1100
Subject: [perl #127063] suppress warning on assigning 0 to $[

---
 ext/arybase/arybase.pm |  2 +-
 ext/arybase/arybase.xs | 11 +++++++----
 t/lib/warnings/op      |  1 +
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/ext/arybase/arybase.pm b/ext/arybase/arybase.pm
index a519a4b..64efe3e 100644
--- a/ext/arybase/arybase.pm
+++ b/ext/arybase/arybase.pm
@@ -1,6 +1,6 @@
 package arybase;
 
-our $VERSION = "0.11";
+our $VERSION = "0.12";
 
 require XSLoader;
 XSLoader::load(); # This returns true, which makes require happy.
diff --git a/ext/arybase/arybase.xs b/ext/arybase/arybase.xs
index 4ff6cbd..c0673fe 100644
--- a/ext/arybase/arybase.xs
+++ b/ext/arybase/arybase.xs
@@ -165,11 +165,14 @@ STATIC void ab_process_assignment(pTHX_ OP *left, OP *right) {
 #define ab_process_assignment(l, r) \
     ab_process_assignment(aTHX_ (l), (r))
  if (ab_op_is_dollar_bracket(left) && right->op_type == OP_CONST) {
-  set_arybase_to(SvIV(cSVOPx_sv(right)));
+  IV base = SvIV(cSVOPx_sv(right));
+  set_arybase_to(base);
   ab_neuter_dollar_bracket(left);
-  Perl_ck_warner_d(aTHX_
-   packWARN(WARN_DEPRECATED), "Use of assignment to $[ is deprecated"
-  );
+  if (base) {
+    Perl_ck_warner_d(aTHX_
+     packWARN(WARN_DEPRECATED), "Use of assignment to $[ is deprecated"
+    );
+  }
  }
 }
 
diff --git a/t/lib/warnings/op b/t/lib/warnings/op
index 89de94f..2a3eeeb 100644
--- a/t/lib/warnings/op
+++ b/t/lib/warnings/op
@@ -1750,6 +1750,7 @@ $[ = 1;
 use warnings 'deprecated';
 $[ = 2;
 ($[) = 2;
+$[ = 0;
 no warnings 'deprecated';
 $[ = 3;
 ($[) = 3;
-- 
2.1.4

@p5pRT
Copy link
Author

p5pRT commented Oct 17, 2017

From @tonycoz

On Tue, 19 Jan 2016 02​:35​:36 -0800, tonyc wrote​:

On Sun Jan 03 16​:16​:17 2016, tonyc wrote​:

The attached suppresses the warning.

Now with actual attaching!

Applied as 8b56062 with a version number fixup.

Tony

@p5pRT
Copy link
Author

p5pRT commented Oct 17, 2017

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

@p5pRT
Copy link
Author

p5pRT commented Jun 23, 2018

From @khwilliamson

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

With the release yesterday of Perl 5.28.0, this and 185 other issues have been
resolved.

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

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

@p5pRT
Copy link
Author

p5pRT commented Jun 23, 2018

@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
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant