Skip Menu |
Report information
Id: 128765
Status: pending release
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: the.rob.dixon [at] gmail.com
Cc:
AdminCc:

Operating System: mswin32
PatchStatus: (no value)
Severity: low
Type: core
Perl Version: 5.24.0
Fixed In: 5.27.6



Date: Thu, 28 Jul 2016 18:24:34 +0100
From: Rob Dixon <the.rob.dixon [...] gmail.com>
Subject: Custom warnings categories are disabled by any preceding `no warnings 'category'`
To: perlbug [...] perl.org
Download (untitled) / with headers
text/plain 4.1k
Download (untitled) / with headers
text/html 14.5k
This is a bug report for perl from the.rob.dixon@gmail.com,
generated with the help of perlbug 1.40 running under perl 5.24.0.


-----------------------------------------------------------------
[Please describe your issue here]

With this module in file My/Warnings.pm

    package My::Warnings;

    use warnings::register;

    sub test {
        warnings::warnif 'This is my warning';
    }

    1;

and this code in main.pl

    use strict;
    use feature 'switch';

    use warnings 'all';

    use My::Warnings;
    
    print undef;           # uninitialized warning

    given (1) { }          # experimental warning
    
    My::Warnings::test();  # custom My::Warnings warning

I get all three warnings output. However, changing it to

    use warnings 'all';
    no warnings 'experimental';

the custom category is disabled as well as the explicitly-mentioned "experimental" category.

Also, a further reenabling

    use warnings 'all';
    no warnings 'experimental';
    use warnings 'experimental';

leaves the custom category disabled while the "experimental" category is correctly reenabled.

Moving `use My::Warnings;` to before any mention of the `warnings` pragma fixes all of this, but I don't see that it should be necessary

[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
    category=core
    severity=low
---
Site configuration information for perl 5.24.0:

Configured by strawberry-perl at Tue May 10 21:33:22 2016.

Summary of my perl5 (revision 5 version 24 subversion 0) configuration:
   
  Platform:
    osname=MSWin32, osvers=6.3, archname=MSWin32-x64-multi-thread
    uname='Win32 strawberry-perl 5.24.0.1 #1 Tue May 10 21:30:49 2016 x64'
    config_args='undef'
    hint=recommended, useposix=true, d_sigaction=undef
    useithreads=define, usemultiplicity=define
    use64bitint=define, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='gcc', ccflags =' -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE  -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fwrapv -fno-strict-aliasing -mms-bitfields',
    optimize='-s -O2',
    cppflags='-DWIN32'
    ccversion='', gccversion='4.9.2', gccosandvers=''
    intsize=4, longsize=4, ptrsize=8, doublesize=8, byteorder=12345678, doublekind=3
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16, longdblkind=3
    ivtype='long long', ivsize=8, nvtype='double', nvsize=8, Off_t='long long', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='g++', ldflags ='-s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib"'
    libpth=C:\strawberry\c\lib C:\strawberry\c\x86_64-w64-mingw32\lib C:\strawberry\c\lib\gcc\x86_64-w64-mingw32\4.9.2
    libs=-lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32
    perllibs=-lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 -lcomctl32
    libc=, so=dll, useshrplib=true, libperl=libperl524.a
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_win32.xs, dlext=xs.dll, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags='-mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib"'


---
@INC for perl 5.24.0:
    C:/Strawberry/perl/site/lib/MSWin32-x64-multi-thread
    C:/Strawberry/perl/site/lib
    C:/Strawberry/perl/vendor/lib
    C:/Strawberry/perl/lib
    .

---
Environment for perl 5.24.0:
    HOME (unset)
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=C:\PHP\;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Strawberry\perl\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\c\bin;C:\Python27\;C:\Python27\Scripts;E:\Perl\source\public;C:\ProgramData\chocolatey\bin;C:\Program Files\Git\cmd;C:\ffmpeg\bin;C:\SQLite;C:\PHP;C:\tools\php;C:\rakudo\bin;C:\rakudo\share\perl6\site\bin
    PERL_BADLANG (unset)
    SHELL (unset)

RT-Send-CC: perl5-porters [...] perl.org
On Thu Jul 28 10:24:51 2016, the.rob.dixon@gmail.com wrote: Show quoted text
> This is a bug report for perl from the.rob.dixon@gmail.com, > generated with the help of perlbug 1.40 running under perl 5.24.0. > > > ----------------------------------------------------------------- > [Please describe your issue here] > > With this module in file My/Warnings.pm > > package My::Warnings; > > use warnings::register; > > sub test { > warnings::warnif 'This is my warning'; > } > > 1; > > and this code in main.pl > > use strict; > use feature 'switch'; > > use warnings 'all'; > > use My::Warnings; > > print undef; # uninitialized warning > > given (1) { } # experimental warning > > My::Warnings::test(); # custom My::Warnings warning > > I get all three warnings output. However, changing it to > > use warnings 'all'; > no warnings 'experimental'; > > the custom category is disabled as well as the explicitly-mentioned > "experimental" category.
Some time ago I suspected we had a problem like this, but I never got around to looking into it (or maybe I started and then forgot). Internally perl uses a bitfield of warning categories and every time a category gets registered the bitfield grows. Additionally, it will skip the bitfield altogether for all warnings and no warnings, respectively. In your original example, ‘use warnings 'all'’ uses the special ‘all warnings’ value, and everything works. Adding ‘no warnings 'experimental'’ switches to bitfield-mode, and when the new category is registered, and the bitfield gets bigger, the new bit just ends up as 0 by default. It seems that we need a bit that records the default value for newly-registered warnings. When a special value (such as ‘all warnings’) is converted into a bitfield, that new bit will get the appropriate value, as currently happens with categories already registered. When new categories are registered, they can copy that bit. (BTW, I’m not volunteering to do any of this. But then again I might do it.) -- Father Chrysostomos
Date: Sun, 17 Dec 2017 01:13:08 +0000
To: perl5-porters [...] perl.org
From: Zefram <zefram [...] fysh.org>
Subject: Re: [perl #128765] Custom warnings categories are disabled by any preceding `no warnings 'category'`
Download (untitled) / with headers
text/plain 123b
This was fixed by commit 006c1a1dbd541b84351332b0d315508f789f3bd1 in Perl 5.27.6. This ticket can be closed now. -zefram


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org