Preferred bug tracker

Please visit the preferred bug tracker to report your issue.

This queue is for tickets about the Perl-Critic CPAN distribution.

Report information
The Basics

Nobody in particular
sandals [...]

Broken in:
Fixed in:
(no value)

Subject: ProhibitUnreachableCode does not consider when conditional
I have a function using for/when as follows: sub _compute_unit { my ($class, $res, $value, $unit, $ptsize) = @_; for ($unit) { return $value when /^[us]$/; return $value * $res when 'i'; return $value * $res * 50 / 127 when 'c'; return $value * $res / 6 when 'P'; return $value * $res / 72 when /^[pz]/; return $value * $res * 100 / 7227 when 't'; return $value * $res * 400 / 2409 when 'T'; return $value * $res * 24 / 1621 when 'D'; return $value * $res * 288 / 1621 when 'C'; return $value * $ptsize when 'm'; return $value * $ptsize / 2 when 'n'; return $value * $ptsize / 100 when 'M'; default { return $value; } } } ProhibitUnreachableCode seems to think that the default block and all but the first when statement are unreachable. This is not the case and the function works as expected. None of the statements in this function should be considered unreachable. This is on Debian unstable/amd64. perl is: vauxhall ok % perl -V Summary of my perl5 (revision 5 version 14 subversion 2) configuration: Platform: osname=linux, osvers=3.2.0-3-amd64, archname=x86_64-linux-gnu- thread-multi uname='linux madeleine 3.2.0-3-amd64 #1 smp mon jul 23 02:45:17 utc 2012 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,-z,relro -Dlddlflags=- shared -Wl,-z,relro -Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu - Dprefix=/usr -Dprivlib=/usr/share/perl/5.14 -Darchlib=/usr/lib/perl/5.14 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 - Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local - Dsitelib=/usr/local/share/perl/5.14.2 - Dsitearch=/usr/local/lib/perl/5.14.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 -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 Compiler: 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.7.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, gnulibc_version='2.13' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E' cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib -fstack- protector' Characteristics of this binary (from libperl): Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP PERL_PRESERVE_IVUV USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API Locally applied patches: DEBPKG:debian/arm_thread_stress_timeout - Raise the timeout of ext/threads/shared/t/stress.t to accommodate slower build hosts 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/m68k_thread_stress - 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 - 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:fixes/hurd-ccflags - [a190e64] [perl #92244] Make hints/ append to $ccflags rather than overriding them 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:fixes/extutils-cbuilder-cflags - [011e8fb] [perl #89478] Append CFLAGS and LDFLAGS to their counterparts in EU::CBuilder DEBPKG:fixes/module-build-home-directory - [ #67893] Fix failing tilde test when run under a UID without a passwd entry DEBPKG:debian/patchlevel - List packaged patches for 5.14.2-14 in patchlevel.h DEBPKG:fixes/h2ph-multiarch - [e7ec705] [perl #90122] Make h2ph correctly search gcc include directories DEBPKG:fixes/index-tainting - [3b36395] [perl #64804] RT 64804: tainting with index() of a constant DEBPKG:fixes/document_makemaker_ccflags - [ #68613] Document that CCFLAGS should include $Config{ccflags} DEBPKG:fixes/sys-syslog-socket-timeout-kfreebsd.patch - [ #69997] Use a socket timeout on GNU/kFreeBSD to catch ICMP port unreachable messages DEBPKG:fixes/hurd-hints - Improve general GNU hints, needed for GNU/Hurd. DEBPKG:fixes/pod_fixes - [7698aed] Fix typos in several pod/perl*.pod files DEBPKG:debian/find_html2text - Configure CPAN::Distribution with correct name of html2text DEBPKG:fixes/digest_eval_hole - Close the eval "require $module" security hole in Digest-
Show quoted text
DEBPKG:fixes/hurd-ndbm - [f0d0a20] [perl #102680] Add GNU/Hurd hints for NDBM_File DEBPKG:fixes/sysconf.t-posix - [8040185] [perl #102888] Fix hang in ext/POSIX/t/sysconf.t on GNU/Hurd DEBPKG:fixes/hurd-largefile - [1fda587] [perl #103014] enable LFS on GNU/Hurd DEBPKG:debian/hurd_test_todo_syslog - Disable failing GNU/Hurd tests in cpan/Sys-Syslog/t/syslog.t DEBPKG:fixes/hurd_skip_itimer_virtual - [ #72754] Skip interval timer tests in Time::HiRes on GNU/Hurd DEBPKG:debian/hurd_test_skip_sigdispatch - Disable failing GNU/Hurd tests op/sigdispatch.t DEBPKG:debian/hurd_test_skip_stack - Disable failing GNU/Hurd tests dist/threads/t/stack.t DEBPKG:debian/hurd_test_skip_pipe - Disable failing GNU/Hurd tests io/pipe.t DEBPKG:debian/hurd_test_skip_io_pipe - Disable failing GNU/Hurd tests dist/IO/t/io_pipe.t DEBPKG:fixes/manpage_name_CPAN - [ #73396] cpan/CPAN: add NAME headings in modules with POD DEBPKG:fixes/manpage_name_CPANPLUS - [ #73398] cpan/CPANPLUS: add NAME headings in modules with POD DEBPKG:fixes/manpage_name_Test-Harness - [ #73399] cpan/Test-Harness: add NAME headings in modules with POD DEBPKG:fixes/manpage_name_Term-UI - [ #73400] cpan/Term-UI: add NAME headings in modules with POD DEBPKG:fixes/podlators_ae_ligature_fallback - Fix the ASCII fallback string for AE DEBPKG:fixes/fsf_postal_address - [de89470] Update references to the FSF's postal address DEBPKG:fixes/cpan_module_pod_fixes - [perl #106870] [ #73447] [ #73446] Fix POD formatting in Term-Cap and Pod- Parser DEBPKG:fixes/cgi_no_shellwords_pl - Use Text::ParseWords instead of DEBPKG:fixes/path_max_fallback - [perl #109262] Don't use _POSIX_PATH_MAX as a fallback PATH_MAX DEBPKG:debian/makemaker-pasthru - [ #28632] Make EU::MM pass LD through to recursive Makefile.PL invocations DEBPKG:fixes/propagate_tainted_errors.patch - [perl #111654] properly propagate tainted errors DEBPKG:debian/perl5db-x-terminal-emulator.patch - Invoke x-terminal-emulator rather than xterm in DEBPKG:fixes/socket_cache_propagate - [ #61577] [perl #112736] sockdomain and socktype undef on newly accepted sockets DEBPKG:fixes/ipc_open3 - [perl #114454] IPC::Open3::open3(..., '-') broken DEBPKG:fixes/string_repeat_overrun - [b675304] avoid calling memset with a negative count Built under linux Compiled at Oct 10 2012 18:48:37 %ENV: PERLDOC_PAGER="less -R" @INC: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .
Subject: Re: [ #80136] ProhibitUnreachableCode does not consider when conditional
Date: Thu, 11 Oct 2012 11:21:30 -0700
From: Jeffrey Thalhammer <>
On Oct 11, 2012, at 10:30 AM, via RT wrote:
Show quoted text
> I have a function using for/when as follows: > > <snip/> > > ProhibitUnreachableCode seems to think that the default block and all > but the first when statement are unreachable. This is not the case and > the function works as expected. None of the statements in this function > should be considered unreachable.
That use of postfix "when" looks very fixable. Thanks for bringing this to our attention. PPI and Perl::Critic are a bit behind on some of the newer language constructs. We'll do our best to keep up! -Jeff

This service runs on Request Tracker, is sponsored by The Perl Foundation, and maintained by Best Practical Solutions.

Please report any issues with to