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

provide originating context of subroutine definitions #10628

Open
p5pRT opened this issue Sep 13, 2010 · 10 comments
Open

provide originating context of subroutine definitions #10628

p5pRT opened this issue Sep 13, 2010 · 10 comments

Comments

@p5pRT
Copy link

p5pRT commented Sep 13, 2010

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

Searchable as RT77816$

@p5pRT
Copy link
Author

p5pRT commented Sep 13, 2010

From jawnsy@cpan.org

Created by jawnsy@cpan.org

I noticed that subroutine redefinition messages from perl are not as helpful as they could be.

If we redefine something in perl, we get​:

$ perl -we 'sub blah { 1; }; sub blah { 2; }'
Subroutine blah redefined at -e line 1.

Compiling a C program (using gcc) with redefinitions results in​:

$ cc -std=c99 -pedantic -Wall -g -O0 -DDEBUG -I. -fPIC -c display.c -o display.o
display.c​:20​: error​: conflicting types for ‘usage’
display.c​:5​: note​: previous declaration of ‘usage’ was here

In a brief chat with the #toolchain folks, at first glance, it might be possible to add this feature (though it could be non-trivial to handle some of the obscure cases)

  <jawnsy> question​: why isn't perl's message -- Subroutine blah redefined at -e line 1. -- more informative, like gcc's? (gcc shows the origin of the first definition)
  <jawnsy> is it something that's not possible based on how perl parses Perl, or is it just something nobody's ever thought about doing?
  <xdg> jawnsy, my guess is no one ever really considered it
  <xdg> Or maybe it's hard to find where a sub came from once it's been compiled?
  <jawnsy> xdg​: I guess at this point it's not really worth adding... maybe I should add it as a wishlist thing in perl's RT, in case anyone is so inclined
  <xdg> jawnsy, sure. I'm glancing at the core code right now in case it's trivial.
  <rafl> there is some cases where there isn't more information available
  <rafl> but most of the time it could be much more informative, yes
  <xdg> rafl, looks like every CV has ->FILE so that could help locate the original. But without line number, it might be more annoying than helpful.
  <rafl> yeah, but the line is also around somewhere. in the COPs, i guess
  <rafl> except for xsubs and such
  <xdg> right. I just don't know if there's a backreference to it.
  <rafl> but that's all just where it was compiled
  <rafl> not where it was added to the symbol table
  <xdg> jawnsy, it's probably possible. open up an RT wishlist for it and maybe someone will get to it
  <rafl> that's the same most of the time, but doesn't have to be
  <rafl> it would be fixable with line debugging enabled tho
  <rafl> because that's what %DB​::sub is intended for
  <rafl> we'd just need to update that on sub assignments to globs
  <jawnsy> not a big deal, of course. I was just trying to write similar type output for something I'm working on, and looked at gcc and perl
  <rafl> as for the place it's compiled at​: perl -MO=Concise,foo -e'sub foo { 42 }'
  <rafl> <;> nextstate(main 1 -e​:1) v ->2
  <rafl> so it's *somewhere* in the optree :)
  <xdg> Ah. CV->START->line perhaps
  <rafl> something like that, yes
  <rafl> but still.. that isn't necessarily the right answer to "where was that sub previously defined", only very often :)
  <xdg> true, but it's a pointer to what subroutine is being replaced
  <rafl> that's not too useful, i'd think
  <xdg> you'd really need to know where the symbol was assigned to
  <xdg> I'm not sure anything actually does that kind of bookkeeping

In case this actually isn't possible, then I apologize for the noise. I just thought it'd be a nice feature, and could help to make perl (the binary) more friendly for new users.

Perl Info

Flags:
    category=core
    severity=wishlist

Site configuration information for perl 5.10.1:

Configured by Debian Project at Fri Aug  6 10:46:59 UTC 2010.

Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
   
  Platform:
    osname=linux, osvers=2.6.32.17-dsa-ia32, archname=i486-linux-gnu-thread-multi
    uname='linux murphy 2.6.32.17-dsa-ia32 #1 smp tue aug 3 15:32:33 cest 2010 i686 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.1 -Dsitearch=/usr/local/lib/perl/5.10.1 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.1 -Dd_dosuid -des'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2 -g',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.4.5 20100728 (prerelease)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    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 -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib /usr/lib64
    libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=/lib/libc-2.11.2.so, so=so, useshrplib=true, libperl=libperl.so.5.10.1
    gnulibc_version='2.11.2'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector'

Locally applied patches:
    DEBPKG:debian/arm_thread_stress_timeout - http://bugs.debian.org/501970 Raise the timeout of ext/threads/shared/t/stress.t to accommodate slower build hosts
    DEBPKG:debian/cpan_config_path - Set location of CPAN::Config to /etc/perl as /usr may not be writable.
    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/extutils_hacks - Various debian-specific ExtUtils changes
    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/m68k_thread_stress - http://bugs.debian.org/495826 Disable some threads tests on m68k for now due to missing TLS.
    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/perl_synopsis - http://bugs.debian.org/278323 Rearrange perl.pod
    DEBPKG:debian/prune_libs - http://bugs.debian.org/128355 Prune the list of libraries wanted to what we actually need.
    DEBPKG:debian/use_gdbm - Explicitly link against -lgdbm_compat in ODBM_File/NDBM_File. 
    DEBPKG:fixes/assorted_docs - http://bugs.debian.org/443733 [384f06a] Math::BigInt::CalcEmu documentation grammar fix
    DEBPKG:fixes/net_smtp_docs - http://bugs.debian.org/100195 [rt.cpan.org #36038] Document the Net::SMTP 'Port' option
    DEBPKG:fixes/processPL - http://bugs.debian.org/357264 [rt.cpan.org #17224] Always use PERLRUNINST when building perl modules.
    DEBPKG:debian/perlivp - http://bugs.debian.org/510895 Make perlivp skip include directories in /usr/local
    DEBPKG:fixes/pod2man-index-backslash - http://bugs.debian.org/521256 Escape backslashes in .IX entries
    DEBPKG:debian/disable-zlib-bundling - Disable zlib bundling in Compress::Raw::Zlib
    DEBPKG:fixes/kfreebsd_cppsymbols - http://bugs.debian.org/533098 [3b910a0] Add gcc predefined macros to $Config{cppsymbols} on GNU/kFreeBSD.
    DEBPKG:debian/cpanplus_definstalldirs - http://bugs.debian.org/533707 Configure CPANPLUS to use the site directories by default.
    DEBPKG:debian/cpanplus_config_path - Save local versions of CPANPLUS::Config::System into /etc/perl.
    DEBPKG:fixes/kfreebsd-filecopy-pipes - http://bugs.debian.org/537555 [16f708c] Fix File::Copy::copy with pipes on GNU/kFreeBSD
    DEBPKG:fixes/anon-tmpfile-dir - http://bugs.debian.org/528544 [perl #66452] Honor TMPDIR when open()ing an anonymous temporary file
    DEBPKG:fixes/abstract-sockets - http://bugs.debian.org/329291 [89904c0] Add support for Abstract namespace sockets.
    DEBPKG:fixes/hurd_cppsymbols - http://bugs.debian.org/544307 [eeb92b7] Add gcc predefined macros to $Config{cppsymbols} on GNU/Hurd.
    DEBPKG:fixes/autodie-flock - http://bugs.debian.org/543731 Allow for flock returning EAGAIN instead of EWOULDBLOCK on linux/parisc
    DEBPKG:fixes/archive-tar-instance-error - http://bugs.debian.org/539355 [rt.cpan.org #48879] Separate Archive::Tar instance error strings from each other
    DEBPKG:fixes/positive-gpos - http://bugs.debian.org/545234 [perl #69056] [c584a96] Fix \\G crash on first match
    DEBPKG:debian/devel-ppport-ia64-optim - http://bugs.debian.org/548943 Work around an ICE on ia64
    DEBPKG:fixes/trie-logic-match - http://bugs.debian.org/552291 [perl #69973] [0abd0d7] Fix a DoS in Unicode processing [CVE-2009-3626]
    DEBPKG:fixes/hppa-thread-eagain - http://bugs.debian.org/554218 make the threads-shared test suite more robust, fixing failures on hppa
    DEBPKG:fixes/crash-on-undefined-destroy - http://bugs.debian.org/564074 [perl #71952] [1f15e67] Fix a NULL pointer dereference when looking for a DESTROY method
    DEBPKG:fixes/tainted-errno - http://bugs.debian.org/574129 [perl #61976] [be1cf43] fix an errno stringification bug in taint mode
    DEBPKG:fixes/safe-upgrade - http://bugs.debian.org/582978 Upgrade Safe.pm to 2.25, fixing CVE-2010-1974
    DEBPKG:fixes/tell-crash - http://bugs.debian.org/578577 [f4817f3] Fix a tell() crash on bad arguments.
    DEBPKG:fixes/format-write-crash - http://bugs.debian.org/579537 [perl #22977] [421f30e] Fix a crash in format/write
    DEBPKG:fixes/arm-alignment - http://bugs.debian.org/289884 [f1c7503] Prevent gcc from optimizing the alignment test away on armel
    DEBPKG:fixes/fcgi-test - Fix a failure in CGI/t/fast.t when FCGI is installed
    DEBPKG:fixes/hurd-ccflags - http://bugs.debian.org/587901 Make hints/gnu.sh append to $ccflags rather than overriding them
    DEBPKG:patchlevel - http://bugs.debian.org/567489 List packaged patches for 5.10.1-14 in patchlevel.h


@INC for perl 5.10.1:
    /etc/perl
    /usr/local/lib/perl/5.10.1
    /usr/local/share/perl/5.10.1
    /usr/lib/perl5
    /usr/share/perl5
    /usr/lib/perl/5.10
    /usr/share/perl/5.10
    /usr/local/lib/site_perl
    .


Environment for perl 5.10.1:
    HOME=/home/jon
    LANG=en_CA.UTF-8
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=~/.bin:/usr/local/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/bin
    PERL_BADLANG (unset)
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Sep 14, 2010

From jawnsy@cpan.org

Additional information was sent to me via e-mail from Brad Gilbert
<b2gills@​gmail.com>​:

This code should also look for places where the code was set by a GLOB
assignment.

  *newsub = \&oldsub
  sub newsub{} # redefinition warning

If you don't check for this, your message might say where oldsub() was
defined, which wouldn't be nearly as helpful as pointing the
programmer to where the GLOB assignment was.

@p5pRT
Copy link
Author

p5pRT commented Jun 24, 2012

From @doy

Pushed an implementation of this to the doy/better_redefinition_warnings
branch. I didn't merge it because I was having trouble with some of the
tests in XS-APItest - it seems that newCONSTSUB can sometimes generate
warnings with nonsensical line numbers. Looking at the source, they seem
to be coming from op.c​:7252-7259, which does some weird hacking around
to try to force in the right line number, which is probably getting it
wrong somehow. If people don't consider this to be too much of a problem
(or if somebody else comes up with an actual fix!), I'll go ahead and
merge this soon.

@p5pRT
Copy link
Author

p5pRT commented Jun 24, 2012

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

@p5pRT
Copy link
Author

p5pRT commented Jun 24, 2012

From @cpansprout

On Sat Jun 23 21​:32​:09 2012, doy wrote​:

Pushed an implementation of this to the doy/better_redefinition_warnings
branch. I didn't merge it because I was having trouble with some of the
tests in XS-APItest - it seems that newCONSTSUB can sometimes generate
warnings with nonsensical line numbers. Looking at the source, they seem
to be coming from op.c​:7252-7259, which does some weird hacking around
to try to force in the right line number, which is probably getting it
wrong somehow. If people don't consider this to be too much of a problem
(or if somebody else comes up with an actual fix!), I'll go ahead and
merge this soon.

Maybe 2833323 was premature. What happens if you revert 2833323?

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Jun 24, 2012

From @doy

On Sat, Jun 23, 2012 at 11​:21​:20PM -0700, Father Chrysostomos via RT wrote​:

On Sat Jun 23 21​:32​:09 2012, doy wrote​:

Pushed an implementation of this to the doy/better_redefinition_warnings
branch. I didn't merge it because I was having trouble with some of the
tests in XS-APItest - it seems that newCONSTSUB can sometimes generate
warnings with nonsensical line numbers. Looking at the source, they seem
to be coming from op.c​:7252-7259, which does some weird hacking around
to try to force in the right line number, which is probably getting it
wrong somehow. If people don't consider this to be too much of a problem
(or if somebody else comes up with an actual fix!), I'll go ahead and
merge this soon.

Maybe 2833323 was premature. What happens if you revert 2833323?

SAVECOPSTASH no longer exists, and I'm not sure what to use instead. Any
pointers?

-doy

@p5pRT
Copy link
Author

p5pRT commented Jun 24, 2012

From @cpansprout

On Sat Jun 23 23​:43​:17 2012, doy@​tozt.net wrote​:

On Sat, Jun 23, 2012 at 11​:21​:20PM -0700, Father Chrysostomos via RT
wrote​:

On Sat Jun 23 21​:32​:09 2012, doy wrote​:

Pushed an implementation of this to the
doy/better_redefinition_warnings
branch. I didn't merge it because I was having trouble with some
of the
tests in XS-APItest - it seems that newCONSTSUB can sometimes generate
warnings with nonsensical line numbers. Looking at the source,
they seem
to be coming from op.c​:7252-7259, which does some weird hacking around
to try to force in the right line number, which is probably getting it
wrong somehow. If people don't consider this to be too much of a
problem
(or if somebody else comes up with an actual fix!), I'll go ahead and
merge this soon.

Maybe 2833323 was premature. What happens if you revert 2833323?

SAVECOPSTASH no longer exists, and I'm not sure what to use instead. Any
pointers?

SAVECOPSTASH_FREE will do. It doesn’t actually free anything any more.

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Jun 24, 2012

From @doy

On Sun, Jun 24, 2012 at 12​:05​:21AM -0700, Father Chrysostomos via RT wrote​:

On Sat Jun 23 23​:43​:17 2012, doy@​tozt.net wrote​:

On Sat, Jun 23, 2012 at 11​:21​:20PM -0700, Father Chrysostomos via RT wrote​:

On Sat Jun 23 21​:32​:09 2012, doy wrote​:

Pushed an implementation of this to the doy/better_redefinition_warnings
branch. I didn't merge it because I was having trouble with some of the
tests in XS-APItest - it seems that newCONSTSUB can sometimes generate
warnings with nonsensical line numbers. Looking at the source, they seem
to be coming from op.c​:7252-7259, which does some weird hacking around
to try to force in the right line number, which is probably getting it
wrong somehow. If people don't consider this to be too much of a problem
(or if somebody else comes up with an actual fix!), I'll go ahead and
merge this soon.

Maybe 2833323 was premature. What happens if you revert 2833323?

SAVECOPSTASH no longer exists, and I'm not sure what to use instead. Any
pointers?

SAVECOPSTASH_FREE will do. It doesn’t actually free anything any more.

No difference. This actually looks like an off-by-one error of some kind
- the line number in the first warning points to the previous time that
an anonymous sub was assigned to something in the script, and then the
second warning points to where the first warning should be pointing to
(which is assigning an anon sub to a glob slot). Not sure if that is
enlightening at all.

-doy

@p5pRT
Copy link
Author

p5pRT commented Jun 24, 2012

From @cpansprout

On Sun Jun 24 01​:20​:59 2012, doy@​tozt.net wrote​:

On Sun, Jun 24, 2012 at 12​:05​:21AM -0700, Father Chrysostomos via RT
wrote​:

On Sat Jun 23 23​:43​:17 2012, doy@​tozt.net wrote​:

On Sat, Jun 23, 2012 at 11​:21​:20PM -0700, Father Chrysostomos via
RT wrote​:

On Sat Jun 23 21​:32​:09 2012, doy wrote​:

Pushed an implementation of this to the
doy/better_redefinition_warnings
branch. I didn't merge it because I was having trouble with
some of the
tests in XS-APItest - it seems that newCONSTSUB can sometimes
generate
warnings with nonsensical line numbers. Looking at the source,
they seem
to be coming from op.c​:7252-7259, which does some weird
hacking around
to try to force in the right line number, which is probably
getting it
wrong somehow. If people don't consider this to be too much of
a problem
(or if somebody else comes up with an actual fix!), I'll go
ahead and
merge this soon.

Maybe 2833323 was premature. What happens if you revert
2833323?

SAVECOPSTASH no longer exists, and I'm not sure what to use
instead. Any
pointers?

SAVECOPSTASH_FREE will do. It doesn’t actually free anything any
more.

No difference.

Sorry. I wasn’t thinking.

This actually looks like an off-by-one error of some
kind
- the line number in the first warning points to the previous time
that
an anonymous sub was assigned to something in the script, and then the
second warning points to where the first warning should be pointing to
(which is assigning an anon sub to a glob slot). Not sure if that is
enlightening at all.

What I see is this​:

sensical line numbers
# Failed (TODO) test 'newCONSTSUB redefinition warning + utf8'
# at ext/XS-APItest/t/newCONSTSUB.t line 70.
# 'Subroutine Ā redefined (previous definition at
ext/XS-APItest/t/newCONSTSUB.t line 16) at
ext/XS-APItest/t/newCONSTSUB.t line -1.
# '
# doesn't match '(?^u​:Subroutine \x{100} redefined \(previous
definition at ext/XS-APItest/t/newCONSTSUB.t line 63\) at )'

I’m getting line -1.

This code for setting the line number is very odd indeed.

newCONSTSUB has everything within an ENTER/LEAVE pair, in which it does
this​:

  SAVECOPLINE(PL_curcop);
  CopLINE_set(PL_curcop, PL_parser ? PL_parser->copline : NOLINE);

I don’t fully understand how the parser setup happens, but I think that
code is wrong.

It needs to set PL_curcop to &PL_compiling, because it has to modify it
temporarily. Hence, it needs to make sure the line number is set in
&PL_compiling (I’m assuming that’s the logic behind it). But then it
gets the line number from the current parser, instead of the current op.
That probably makes sense if newCONSTSUB is called at compile time, but
not run time.

But this test script gives the right line number (it does go through
newCONSTSUB; gdb told me so), and I don’t know why​:

use constant { foo => 1, bar => 2};
study *foo; # autovivify
*foo = \&{"bar"};

And then newXS_len_flags also plays around with the line number, as you saw​:

  const line_t oldline = CopLINE(PL_curcop);
  if (PL_parser && PL_parser->copline != NOLINE)
  CopLINE_set(PL_curcop, PL_parser->copline);
  report_redefined_cv(newSVpvn_flags(
  name,len,(flags&SVf_UTF8)|SVs_TEMP
  ),
  cv, const_svp);
  CopLINE_set(PL_curcop, oldline);

I’m not even sure that’s thread-safe. newXS can be called from
XSLoader​::load, which many modules call at run-time. So PL_curcop is a
an op in an op tree, which is shared between threads. And here it is
modified. Also, if fatal warnings are enabled, it will leave the line
number modified.

Also, it’s probably wrongly using the parser’s line number.

I’m not sure I want to debug this quagmire just yet. :-)

I’ve had a look at your patch, and there is one problem with it (apart
from the above). It uses the line number from the GV, which is set when
the GV is created​:

#!perl -w

$foo = 'squiggles';

sub foo { 1 }

sub foo { 2 }
__END__
Subroutine foo redefined (previous definition at - line 3) at - line 11.

I don’t even know what the line number in the GV is for. Maybe it would
be acceptable to set it when a sub is defined (after the warning, and if
CvGV(cv) == gv). I don’t know.

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Jul 6, 2013

From @cpansprout

On Sun Jun 24 11​:01​:21 2012, sprout wrote​:

I don’t even know what the line number in the GV is for. Maybe it would
be acceptable to set it when a sub is defined (after the warning, and if
CvGV(cv) == gv). I don’t know.

I do now. :-)

It is used for ‘use once’ warnings. If the GV is accessed multiple
times; e.g., for $x and then sub x, the GvFILE nad GvLINE fields are
never used. So it should be safe to overwrite them when defining subs,
for the sake of putting this warning on the right line.

--

Father Chrysostomos

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