summaryrefslogtreecommitdiff
path: root/regen
diff options
context:
space:
mode:
authorDavid Cantrell <david@cantrell.org.uk>2020-01-27 16:02:05 +0000
committerKarl Williamson <khw@cpan.org>2020-11-28 17:06:04 -0700
commite926558e32f7c35e244a99ae9b8bf0cbd90bcf03 (patch)
treeccc13bf6abc334f9aebdb3293570a70d5dfa6e7b /regen
parent52f0fcf7f01b33490cb4d9804cd6405b3a3187d2 (diff)
downloadperl-e926558e32f7c35e244a99ae9b8bf0cbd90bcf03.tar.gz
Add -negative import args for 'use warnings'
Diffstat (limited to 'regen')
-rw-r--r--regen/warnings.pl62
1 files changed, 54 insertions, 8 deletions
diff --git a/regen/warnings.pl b/regen/warnings.pl
index cf07974693..498b93e285 100644
--- a/regen/warnings.pl
+++ b/regen/warnings.pl
@@ -16,7 +16,7 @@
#
# This script is normally invoked from regen.pl.
-$VERSION = '1.48';
+$VERSION = '1.49';
BEGIN {
require './regen/regen_lib.pl';
@@ -639,16 +639,24 @@ sub bits
sub import
{
- shift;
-
- my $mask = ${^WARNING_BITS} // ($^W ? $Bits{all} : $DEFAULT) ;
+ my $invocant = shift;
# append 'all' when implied (empty import list or after a lone
# "FATAL" or "NONFATAL")
push @_, 'all'
- if !@_ || (@_==1 && ($_[0] eq 'FATAL' || $_[0] eq 'NONFATAL'));
-
- ${^WARNING_BITS} = _bits($mask, @_);
+ if !@_ || (@_==1 && ($_[0] eq 'FATAL' || $_[0] eq 'NONFATAL'));
+
+ my @fatal = ();
+ foreach my $warning (@_) {
+ if($warning =~ /^(NON)?FATAL$/) {
+ @fatal = ($warning);
+ } elsif(substr($warning, 0, 1) ne '-') {
+ my $mask = ${^WARNING_BITS} // ($^W ? $Bits{all} : $DEFAULT) ;
+ ${^WARNING_BITS} = _bits($mask, @fatal, $warning);
+ } else {
+ $invocant->unimport(substr($warning, 1));
+ }
+ }
}
sub unimport
@@ -875,7 +883,10 @@ warnings - Perl pragma to control optional warnings
no warnings;
use warnings "all";
- no warnings "all";
+ no warnings "uninitialized";
+
+ # or equivalent to those last two ...
+ use warnings qw(all -uninitialized);
use warnings::register;
if (warnings::enabled()) {
@@ -962,6 +973,41 @@ be reported for the C<$x> variable.
Note that neither the B<-w> flag or the C<$^W> can be used to
disable/enable default warnings. They are still mandatory in this case.
+=head2 "Negative warnings"
+
+As a convenience, you can (as of Perl 5.34) pass arguments to the
+C<import()> method both positively and negatively. Negative warnings
+are those with a C<-> sign prepended to their names; positive warnings
+are anything else. This lets you turn on some warnings and turn off
+others in one command. So, assuming that you've already turned on a
+bunch of warnings but want to tweak them a bit in some block, you can
+do this:
+
+ {
+ use warnings qw(uninitialized -redefine);
+ ...
+ }
+
+which is equivalent to:
+
+ {
+ use warnings qw(uninitialized);
+ no warnings qw(redefine);
+ ...
+ }
+
+The argument list is processed in the order you specify. So, for example, if you
+don't want to be warned about use of experimental features, except for C<somefeature>
+that you really dislike, you can say this:
+
+ use warnings qw(all -experimental experimental::somefeature);
+
+which is equivalent to:
+
+ use warnings 'all';
+ no warnings 'experimental';
+ use warnings 'experimental::somefeature';
+
=head2 What's wrong with B<-w> and C<$^W>
Although very useful, the big problem with using B<-w> on the command