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

'warn' does not append '...caught' #14900

p5pRT opened this issue Sep 18, 2015 · 3 comments

'warn' does not append '...caught' #14900

p5pRT opened this issue Sep 18, 2015 · 3 comments


Copy link

@p5pRT p5pRT commented Sep 18, 2015

Migrated from (status was 'open')

Searchable as RT126106$

Copy link

@p5pRT p5pRT commented Sep 18, 2015

From @KES777

Created by @KES777

The doc says​:
If the output is empty and $@​ already contains a value (typically from a previous eval) that value is used after appending "\t...caught

$ perl -E '$@​ = bless {}, "Test";warn;'
Test=HASH(0x1916cb8) at -e line 1.

but I expect​:
Test=HASH(0x1916cb8) ...caught at -e line 1.

Doing some info dig I compare 'warn' with 'die' (The only one difference between them, to mine mind, must be execution does not stop after 'warn' )

perl -E '$@​ = "Test";warn;die;'
Test ...caught at -e line 1.
Test ...propagated at -e line 1.

Everything is expected here

$ perl -E '$@​ = bless {}, "Test";warn;die;'
Test=HASH(0x17facb8) at -e line 1.

Expected default behaviour, if object has no 'PROPAGATED' sub. So the second line must be also​:
Test=HASH(0x17facb8) at -e line 1.

But in both cases $@​ is used, so I expect also ...caught/...propagated. Like CASE 1

perl -E '{package Test; sub PROPAGATE { return 'YES'; } } $@​ = bless {}, "Test"; warn; die;'
Test=HASH(0xa27cb8) at -e line 1.
YES at -e line 1.

As you, maybe, have noticed (in compare to CASE 2) the die has 'at -e line 1'
Relaying on that that 'warn' must be same as 'die' except execution does not stop after it.
I expect 'YES' instead of 'Test=HASH(0xa27cb8)' for 'warn'

perl -E '{use strict;use warnings;package Test; sub PROPAGATE { return; } } $@​ = bless {}, "Test"; warn; die;'
Test=HASH(0x2325cb8) at -e line 1.
at -e line 1.

Here I expect warning about 'Use of uninitialized value...'

1. Should I open its own bug report for CASE 2, 3 and 4?
2. May I try to write draft of warn/die handling by perl from my point of view?
  (But maybe I will need a consultation of somebody to explain me warn/die today internals
  and why that done in that way instead other)

Perl Info


Site configuration information for perl 5.18.2:

Configured by Debian Project at Thu Mar 27 18:28:21 UTC 2014.

Summary of my perl5 (revision 5 version 18 subversion 2) configuration:
    osname=linux, osvers=3.2.0-58-generic, archname=x86_64-linux-gnu-thread-multi
    uname='linux brownie 3.2.0-58-generic #88-ubuntu smp tue dec 3 17:37:58 utc 2013 x86_64 x86_64 x86_64 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector --param=ssp-buffer-size=4 -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.18 -Darchlib=/usr/lib/perl/5.18 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.18.2 -Dsitearch=/usr/local/lib/perl/5.18.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 -des'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fstack-protector -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 -fstack-protector -fno-strict-aliasing -pipe -I/usr/local/include'
    ccversion='', gccversion='4.8.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 /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib /usr/lib
    libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=, so=so, useshrplib=true,
  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 - Remove overly restrictive DB_File version check.
    DEBPKG:debian/doc_info - Replace generic man(1) instructions with Debian-specific information.
    DEBPKG:debian/enc2xs_inc - Tweak enc2xs to follow symlinks and ignore missing @INC directories.
    DEBPKG:debian/errno_ver - Remove Errno version check due to upgrade problems with long-running processes.
    DEBPKG:debian/libperl_embed_doc - 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 to /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 - Adjust Module::Build manual page extensions for the Debian Perl policy
    DEBPKG:debian/prune_libs - Prune the list of libraries wanted to what we actually need.
    DEBPKG:fixes/net_smtp_docs - [ #36038] Document the Net::SMTP 'Port' option
    DEBPKG:debian/perlivp - Make perlivp skip include directories in /usr/local
    DEBPKG:debian/cpanplus_definstalldirs - 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:debian/deprecate-with-apt - Point users to Debian packages of deprecated core modules
    DEBPKG:debian/squelch-locale-warnings - 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 - List packaged patches for 5.18.2-2ubuntu1 in patchlevel.h
    DEBPKG:debian/skip-kfreebsd-crash - [perl #96272] Skip a crashing test case in t/op/threads.t on GNU/kFreeBSD
    DEBPKG:fixes/document_makemaker_ccflags - [ #68613] Document that CCFLAGS should include $Config{ccflags}
    DEBPKG:debian/find_html2text - Configure CPAN::Distribution with correct name of html2text
    DEBPKG:debian/hurd_test_skip_stack - Disable failing GNU/Hurd tests dist/threads/t/stack.t
    DEBPKG:fixes/manpage_name_Test-Harness - [ #73399] cpan/Test-Harness: add NAME headings in modules with POD
    DEBPKG:debian/makemaker-pasthru - [ #28632] Make EU::MM pass LD through to recursive Makefile.PL invocations
    DEBPKG:debian/perl5db-x-terminal-emulator.patch - Invoke x-terminal-emulator rather than xterm in
    DEBPKG:debian/cpan-missing-site-dirs - Fix CPAN::FirstTime defaults with nonexisting site dirs if a parent is writable
    DEBPKG:fixes/memoize_storable_nstore - [ #77790] Memoize::Storable: respect 'nstore' option not respected
    DEBPKG:fixes/net_ftp_failed_command - [ #37700] Net::FTP: cope gracefully with a failed command
    DEBPKG:fixes/perlbug-patchlist - [3541c11] [perl #118433] Make perlbug look up the list of local patches at run time
    DEBPKG:fixes/module_metadata_security_doc - [68cdd4b] CVE-2013-1437 documentation fix
    DEBPKG:fixes/module_metadata_taint_fix - [bff978f] [ #88576] untaint version, if needed, in Module::Metadata
    DEBPKG:fixes/IPC-SysV-spelling - [ #86736] Fix spelling of IPC_CREAT in IPC-SysV documentation
    DEBPKG:fixes/fix-undef-source -

@INC for perl 5.18.2:

Environment for perl 5.18.2:
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PERL_BADLANG (unset)
    PERL_MB_OPT=--install_base "/home/kes/perl5"

Copy link

@p5pRT p5pRT commented Sep 19, 2015


KES wrote​:

$ perl -E '$@​ = bless {}, "Test";warn;'
Test=HASH(0x1916cb8) at -e line 1.

The "...caught" is deliberately not appended to a reference.
The documentation is amiss in not saying so. But then the location
information should also not be appended. The code is amiss there.

There's a general intent that referenced objects be left intact through
the warn/die system, so that they can be used to carry more information
than a mere string message. This implies that nothing can be concatenated
to them. It follows that exception objects are responsible for producing
a complete message, with newline and everything, when they're stringified.

perl -E '{package Test; sub PROPAGATE { return 'YES'; } } $@​ = bless {}, "Test"; warn; die;'
I expect 'YES' instead of 'Test=HASH(0xa27cb8)' for 'warn'

Warning is not the same thing as propagating an unwinding exception.
It is intentional that warn doesn't invoke the PROPAGATE method.

Here I expect warning about 'Use of uninitialized value...'

That condition arises at the point of the die that sees the undef value.
The scope of your "use warnings" doesn't include the die, so the warning
isn't issued.

1. Should I open its own bug report for CASE 2, 3 and 4?

No. You've only found one situation that's amiss, which is the one you
opened with.


Copy link

@p5pRT p5pRT commented Sep 19, 2015

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

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

Successfully merging a pull request may close this issue.

None yet
1 participant