xref: /openbsd-src/gnu/usr.bin/perl/lib/warnings.pm (revision 9f11ffb7133c203312a01e4b986886bc88c7d74b)
1# -*- buffer-read-only: t -*-
2# !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
3# This file is built by regen/warnings.pl.
4# Any changes made here will be lost!
5
6package warnings;
7
8our $VERSION = "1.42";
9
10# Verify that we're called correctly so that warnings will work.
11# Can't use Carp, since Carp uses us!
12# String regexps because constant folding = smaller optree = less memory vs regexp literal
13# see also strict.pm.
14die sprintf "Incorrect use of pragma '%s' at %s line %d.\n", __PACKAGE__, +(caller)[1,2]
15    if __FILE__ !~ ( '(?x) \b     '.__PACKAGE__.'  \.pmc? \z' )
16    && __FILE__ =~ ( '(?x) \b (?i:'.__PACKAGE__.') \.pmc? \z' );
17
18our %Offsets = (
19    # Warnings Categories added in Perl 5.008
20    'all'				=> 0,
21    'closure'				=> 2,
22    'deprecated'			=> 4,
23    'exiting'				=> 6,
24    'glob'				=> 8,
25    'io'				=> 10,
26    'closed'				=> 12,
27    'exec'				=> 14,
28    'layer'				=> 16,
29    'newline'				=> 18,
30    'pipe'				=> 20,
31    'unopened'				=> 22,
32    'misc'				=> 24,
33    'numeric'				=> 26,
34    'once'				=> 28,
35    'overflow'				=> 30,
36    'pack'				=> 32,
37    'portable'				=> 34,
38    'recursion'				=> 36,
39    'redefine'				=> 38,
40    'regexp'				=> 40,
41    'severe'				=> 42,
42    'debugging'				=> 44,
43    'inplace'				=> 46,
44    'internal'				=> 48,
45    'malloc'				=> 50,
46    'signal'				=> 52,
47    'substr'				=> 54,
48    'syntax'				=> 56,
49    'ambiguous'				=> 58,
50    'bareword'				=> 60,
51    'digit'				=> 62,
52    'parenthesis'			=> 64,
53    'precedence'			=> 66,
54    'printf'				=> 68,
55    'prototype'				=> 70,
56    'qw'				=> 72,
57    'reserved'				=> 74,
58    'semicolon'				=> 76,
59    'taint'				=> 78,
60    'threads'				=> 80,
61    'uninitialized'			=> 82,
62    'unpack'				=> 84,
63    'untie'				=> 86,
64    'utf8'				=> 88,
65    'void'				=> 90,
66
67    # Warnings Categories added in Perl 5.011
68    'imprecision'			=> 92,
69    'illegalproto'			=> 94,
70
71    # Warnings Categories added in Perl 5.013
72    'non_unicode'			=> 96,
73    'nonchar'				=> 98,
74    'surrogate'				=> 100,
75
76    # Warnings Categories added in Perl 5.017
77    'experimental'			=> 102,
78    'experimental::lexical_subs'	=> 104,
79    'experimental::regex_sets'		=> 106,
80    'experimental::smartmatch'		=> 108,
81
82    # Warnings Categories added in Perl 5.019
83    'experimental::postderef'		=> 110,
84    'experimental::signatures'		=> 112,
85    'syscalls'				=> 114,
86
87    # Warnings Categories added in Perl 5.021
88    'experimental::bitwise'		=> 116,
89    'experimental::const_attr'		=> 118,
90    'experimental::re_strict'		=> 120,
91    'experimental::refaliasing'		=> 122,
92    'experimental::win32_perlio'	=> 124,
93    'locale'				=> 126,
94    'missing'				=> 128,
95    'redundant'				=> 130,
96
97    # Warnings Categories added in Perl 5.025
98    'experimental::declared_refs'	=> 132,
99
100    # Warnings Categories added in Perl 5.027
101    'experimental::alpha_assertions'	=> 134,
102    'experimental::script_run'		=> 136,
103    'shadow'				=> 138,
104);
105
106our %Bits = (
107    'all'				=> "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55", # [0..71]
108    'ambiguous'				=> "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [29]
109    'bareword'				=> "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [30]
110    'closed'				=> "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
111    'closure'				=> "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
112    'debugging'				=> "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22]
113    'deprecated'			=> "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
114    'digit'				=> "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31]
115    'exec'				=> "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
116    'exiting'				=> "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
117    'experimental'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x55\x51\x15\x50\x01", # [51..56,58..62,66..68]
118    'experimental::alpha_assertions'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [67]
119    'experimental::bitwise'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [58]
120    'experimental::const_attr'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [59]
121    'experimental::declared_refs'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [66]
122    'experimental::lexical_subs'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [52]
123    'experimental::postderef'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [55]
124    'experimental::re_strict'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [60]
125    'experimental::refaliasing'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [61]
126    'experimental::regex_sets'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [53]
127    'experimental::script_run'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [68]
128    'experimental::signatures'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [56]
129    'experimental::smartmatch'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [54]
130    'experimental::win32_perlio'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [62]
131    'glob'				=> "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
132    'illegalproto'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [47]
133    'imprecision'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [46]
134    'inplace'				=> "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23]
135    'internal'				=> "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24]
136    'io'				=> "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [5..11,57]
137    'layer'				=> "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
138    'locale'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [63]
139    'malloc'				=> "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25]
140    'misc'				=> "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
141    'missing'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [64]
142    'newline'				=> "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
143    'non_unicode'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [48]
144    'nonchar'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [49]
145    'numeric'				=> "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
146    'once'				=> "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
147    'overflow'				=> "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
148    'pack'				=> "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [16]
149    'parenthesis'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [32]
150    'pipe'				=> "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
151    'portable'				=> "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [17]
152    'precedence'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [33]
153    'printf'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [34]
154    'prototype'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [35]
155    'qw'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [36]
156    'recursion'				=> "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18]
157    'redefine'				=> "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19]
158    'redundant'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [65]
159    'regexp'				=> "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20]
160    'reserved'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [37]
161    'semicolon'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [38]
162    'severe'				=> "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25]
163    'shadow'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [69]
164    'signal'				=> "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26]
165    'substr'				=> "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27]
166    'surrogate'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [50]
167    'syntax'				=> "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00\x00\x00\x00", # [28..38,47]
168    'syscalls'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [57]
169    'taint'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [39]
170    'threads'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [40]
171    'uninitialized'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [41]
172    'unopened'				=> "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
173    'unpack'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [42]
174    'untie'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [43]
175    'utf8'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x15\x00\x00\x00\x00\x00", # [44,48..50]
176    'void'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [45]
177);
178
179our %DeadBits = (
180    'all'				=> "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", # [0..71]
181    'ambiguous'				=> "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [29]
182    'bareword'				=> "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [30]
183    'closed'				=> "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6]
184    'closure'				=> "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1]
185    'debugging'				=> "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22]
186    'deprecated'			=> "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2]
187    'digit'				=> "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31]
188    'exec'				=> "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7]
189    'exiting'				=> "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3]
190    'experimental'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xaa\xa2\x2a\xa0\x02", # [51..56,58..62,66..68]
191    'experimental::alpha_assertions'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [67]
192    'experimental::bitwise'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [58]
193    'experimental::const_attr'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [59]
194    'experimental::declared_refs'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [66]
195    'experimental::lexical_subs'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [52]
196    'experimental::postderef'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [55]
197    'experimental::re_strict'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [60]
198    'experimental::refaliasing'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [61]
199    'experimental::regex_sets'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [53]
200    'experimental::script_run'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [68]
201    'experimental::signatures'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [56]
202    'experimental::smartmatch'		=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [54]
203    'experimental::win32_perlio'	=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [62]
204    'glob'				=> "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4]
205    'illegalproto'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [47]
206    'imprecision'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [46]
207    'inplace'				=> "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23]
208    'internal'				=> "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24]
209    'io'				=> "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [5..11,57]
210    'layer'				=> "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8]
211    'locale'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [63]
212    'malloc'				=> "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25]
213    'misc'				=> "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12]
214    'missing'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [64]
215    'newline'				=> "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9]
216    'non_unicode'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [48]
217    'nonchar'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [49]
218    'numeric'				=> "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13]
219    'once'				=> "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14]
220    'overflow'				=> "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15]
221    'pack'				=> "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [16]
222    'parenthesis'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [32]
223    'pipe'				=> "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10]
224    'portable'				=> "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [17]
225    'precedence'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [33]
226    'printf'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [34]
227    'prototype'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [35]
228    'qw'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [36]
229    'recursion'				=> "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18]
230    'redefine'				=> "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19]
231    'redundant'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [65]
232    'regexp'				=> "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20]
233    'reserved'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [37]
234    'semicolon'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [38]
235    'severe'				=> "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25]
236    'shadow'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [69]
237    'signal'				=> "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26]
238    'substr'				=> "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27]
239    'surrogate'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [50]
240    'syntax'				=> "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00\x00\x00\x00", # [28..38,47]
241    'syscalls'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [57]
242    'taint'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [39]
243    'threads'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [40]
244    'uninitialized'			=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [41]
245    'unopened'				=> "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11]
246    'unpack'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [42]
247    'untie'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [43]
248    'utf8'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x2a\x00\x00\x00\x00\x00", # [44,48..50]
249    'void'				=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [45]
250);
251
252# These are used by various things, including our own tests
253our $NONE				=  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
254our $DEFAULT				=  "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x55\x51\x55\x50\x01", # [2,4,22,23,25,52..56,58..63,66..68]
255our $LAST_BIT				=  140 ;
256our $BYTES				=  18 ;
257
258sub Croaker
259{
260    require Carp; # this initializes %CarpInternal
261    local $Carp::CarpInternal{'warnings'};
262    delete $Carp::CarpInternal{'warnings'};
263    Carp::croak(@_);
264}
265
266sub _expand_bits {
267    my $bits = shift;
268    my $want_len = ($LAST_BIT + 7) >> 3;
269    my $len = length($bits);
270    if ($len != $want_len) {
271	if ($bits eq "") {
272	    $bits = "\x00" x $want_len;
273	} elsif ($len > $want_len) {
274	    substr $bits, $want_len, $len-$want_len, "";
275	} else {
276	    my $a = vec($bits, $Offsets{all} >> 1, 2);
277	    $a |= $a << 2;
278	    $a |= $a << 4;
279	    $bits .= chr($a) x ($want_len - $len);
280	}
281    }
282    return $bits;
283}
284
285sub _bits {
286    my $mask = shift ;
287    my $catmask ;
288    my $fatal = 0 ;
289    my $no_fatal = 0 ;
290
291    $mask = _expand_bits($mask);
292    foreach my $word ( @_ ) {
293	if ($word eq 'FATAL') {
294	    $fatal = 1;
295	    $no_fatal = 0;
296	}
297	elsif ($word eq 'NONFATAL') {
298	    $fatal = 0;
299	    $no_fatal = 1;
300	}
301	elsif ($catmask = $Bits{$word}) {
302	    $mask |= $catmask ;
303	    $mask |= $DeadBits{$word} if $fatal ;
304	    $mask = ~(~$mask | $DeadBits{$word}) if $no_fatal ;
305	}
306	else
307	  { Croaker("Unknown warnings category '$word'")}
308    }
309
310    return $mask ;
311}
312
313sub bits
314{
315    # called from B::Deparse.pm
316    push @_, 'all' unless @_ ;
317    return _bits("", @_) ;
318}
319
320sub import
321{
322    shift;
323
324    my $mask = ${^WARNING_BITS} // ($^W ? $Bits{all} : $DEFAULT) ;
325
326    # append 'all' when implied (empty import list or after a lone
327    # "FATAL" or "NONFATAL")
328    push @_, 'all'
329	if !@_ || (@_==1 && ($_[0] eq 'FATAL' || $_[0] eq 'NONFATAL'));
330
331    ${^WARNING_BITS} = _bits($mask, @_);
332}
333
334sub unimport
335{
336    shift;
337
338    my $catmask ;
339    my $mask = ${^WARNING_BITS} // ($^W ? $Bits{all} : $DEFAULT) ;
340
341    # append 'all' when implied (empty import list or after a lone "FATAL")
342    push @_, 'all' if !@_ || @_==1 && $_[0] eq 'FATAL';
343
344    $mask = _expand_bits($mask);
345    foreach my $word ( @_ ) {
346	if ($word eq 'FATAL') {
347	    next;
348	}
349	elsif ($catmask = $Bits{$word}) {
350	    $mask = ~(~$mask | $catmask | $DeadBits{$word});
351	}
352	else
353	  { Croaker("Unknown warnings category '$word'")}
354    }
355
356    ${^WARNING_BITS} = $mask ;
357}
358
359my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = ();
360
361sub LEVEL () { 8 };
362sub MESSAGE () { 4 };
363sub FATAL () { 2 };
364sub NORMAL () { 1 };
365
366sub __chk
367{
368    my $category ;
369    my $offset ;
370    my $isobj = 0 ;
371    my $wanted = shift;
372    my $has_message = $wanted & MESSAGE;
373    my $has_level   = $wanted & LEVEL  ;
374
375    if ($has_level) {
376	if (@_ != ($has_message ? 3 : 2)) {
377	    my $sub = (caller 1)[3];
378	    my $syntax = $has_message
379		? "category, level, 'message'"
380		: 'category, level';
381	    Croaker("Usage: $sub($syntax)");
382        }
383    }
384    elsif (not @_ == 1 || @_ == ($has_message ? 2 : 0)) {
385	my $sub = (caller 1)[3];
386	my $syntax = $has_message ? "[category,] 'message'" : '[category]';
387	Croaker("Usage: $sub($syntax)");
388    }
389
390    my $message = pop if $has_message;
391
392    if (@_) {
393	# check the category supplied.
394	$category = shift ;
395	if (my $type = ref $category) {
396	    Croaker("not an object")
397		if exists $builtin_type{$type};
398	    $category = $type;
399	    $isobj = 1 ;
400	}
401	$offset = $Offsets{$category};
402	Croaker("Unknown warnings category '$category'")
403	    unless defined $offset;
404    }
405    else {
406	$category = (caller(1))[0] ;
407	$offset = $Offsets{$category};
408	Croaker("package '$category' not registered for warnings")
409	    unless defined $offset ;
410    }
411
412    my $i;
413
414    if ($isobj) {
415	my $pkg;
416	$i = 2;
417	while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
418	    last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
419	}
420	$i -= 2 ;
421    }
422    elsif ($has_level) {
423	$i = 2 + shift;
424    }
425    else {
426	$i = _error_loc(); # see where Carp will allocate the error
427    }
428
429    # Default to 0 if caller returns nothing.  Default to $DEFAULT if it
430    # explicitly returns undef.
431    my(@callers_bitmask) = (caller($i))[9] ;
432    my $callers_bitmask =
433	 @callers_bitmask ? $callers_bitmask[0] // $DEFAULT : 0 ;
434    length($callers_bitmask) > ($offset >> 3) or $offset = $Offsets{all};
435
436    my @results;
437    foreach my $type (FATAL, NORMAL) {
438	next unless $wanted & $type;
439
440	push @results, vec($callers_bitmask, $offset + $type - 1, 1);
441    }
442
443    # &enabled and &fatal_enabled
444    return $results[0] unless $has_message;
445
446    # &warnif, and the category is neither enabled as warning nor as fatal
447    return if ($wanted & (NORMAL | FATAL | MESSAGE))
448		      == (NORMAL | FATAL | MESSAGE)
449	&& !($results[0] || $results[1]);
450
451    # If we have an explicit level, bypass Carp.
452    if ($has_level and @callers_bitmask) {
453	# logic copied from util.c:mess_sv
454	my $stuff = " at " . join " line ", (caller $i)[1,2];
455	$stuff .= sprintf ", <%s> %s %d",
456			   *${^LAST_FH}{NAME},
457			   ($/ eq "\n" ? "line" : "chunk"), $.
458	    if $. && ${^LAST_FH};
459	die "$message$stuff.\n" if $results[0];
460	return warn "$message$stuff.\n";
461    }
462
463    require Carp;
464    Carp::croak($message) if $results[0];
465    # will always get here for &warn. will only get here for &warnif if the
466    # category is enabled
467    Carp::carp($message);
468}
469
470sub _mkMask
471{
472    my ($bit) = @_;
473    my $mask = "";
474
475    vec($mask, $bit, 1) = 1;
476    return $mask;
477}
478
479sub register_categories
480{
481    my @names = @_;
482
483    for my $name (@names) {
484	if (! defined $Bits{$name}) {
485	    $Offsets{$name}  = $LAST_BIT;
486	    $Bits{$name}     = _mkMask($LAST_BIT++);
487	    $DeadBits{$name} = _mkMask($LAST_BIT++);
488	    if (length($Bits{$name}) > length($Bits{all})) {
489		$Bits{all} .= "\x55";
490		$DeadBits{all} .= "\xaa";
491	    }
492	}
493    }
494}
495
496sub _error_loc {
497    require Carp;
498    goto &Carp::short_error_loc; # don't introduce another stack frame
499}
500
501sub enabled
502{
503    return __chk(NORMAL, @_);
504}
505
506sub fatal_enabled
507{
508    return __chk(FATAL, @_);
509}
510
511sub warn
512{
513    return __chk(FATAL | MESSAGE, @_);
514}
515
516sub warnif
517{
518    return __chk(NORMAL | FATAL | MESSAGE, @_);
519}
520
521sub enabled_at_level
522{
523    return __chk(NORMAL | LEVEL, @_);
524}
525
526sub fatal_enabled_at_level
527{
528    return __chk(FATAL | LEVEL, @_);
529}
530
531sub warn_at_level
532{
533    return __chk(FATAL | MESSAGE | LEVEL, @_);
534}
535
536sub warnif_at_level
537{
538    return __chk(NORMAL | FATAL | MESSAGE | LEVEL, @_);
539}
540
541# These are not part of any public interface, so we can delete them to save
542# space.
543delete @warnings::{qw(NORMAL FATAL MESSAGE LEVEL)};
544
5451;
546__END__
547=head1 NAME
548
549warnings - Perl pragma to control optional warnings
550
551=head1 SYNOPSIS
552
553    use warnings;
554    no warnings;
555
556    use warnings "all";
557    no warnings "all";
558
559    use warnings::register;
560    if (warnings::enabled()) {
561        warnings::warn("some warning");
562    }
563
564    if (warnings::enabled("void")) {
565        warnings::warn("void", "some warning");
566    }
567
568    if (warnings::enabled($object)) {
569        warnings::warn($object, "some warning");
570    }
571
572    warnings::warnif("some warning");
573    warnings::warnif("void", "some warning");
574    warnings::warnif($object, "some warning");
575
576=head1 DESCRIPTION
577
578The C<warnings> pragma gives control over which warnings are enabled in
579which parts of a Perl program.  It's a more flexible alternative for
580both the command line flag B<-w> and the equivalent Perl variable,
581C<$^W>.
582
583This pragma works just like the C<strict> pragma.
584This means that the scope of the warning pragma is limited to the
585enclosing block.  It also means that the pragma setting will not
586leak across files (via C<use>, C<require> or C<do>).  This allows
587authors to independently define the degree of warning checks that will
588be applied to their module.
589
590By default, optional warnings are disabled, so any legacy code that
591doesn't attempt to control the warnings will work unchanged.
592
593All warnings are enabled in a block by either of these:
594
595    use warnings;
596    use warnings 'all';
597
598Similarly all warnings are disabled in a block by either of these:
599
600    no warnings;
601    no warnings 'all';
602
603For example, consider the code below:
604
605    use warnings;
606    my @a;
607    {
608        no warnings;
609	my $b = @a[0];
610    }
611    my $c = @a[0];
612
613The code in the enclosing block has warnings enabled, but the inner
614block has them disabled.  In this case that means the assignment to the
615scalar C<$c> will trip the C<"Scalar value @a[0] better written as $a[0]">
616warning, but the assignment to the scalar C<$b> will not.
617
618=head2 Default Warnings and Optional Warnings
619
620Before the introduction of lexical warnings, Perl had two classes of
621warnings: mandatory and optional.
622
623As its name suggests, if your code tripped a mandatory warning, you
624would get a warning whether you wanted it or not.
625For example, the code below would always produce an C<"isn't numeric">
626warning about the "2:".
627
628    my $a = "2:" + 3;
629
630With the introduction of lexical warnings, mandatory warnings now become
631I<default> warnings.  The difference is that although the previously
632mandatory warnings are still enabled by default, they can then be
633subsequently enabled or disabled with the lexical warning pragma.  For
634example, in the code below, an C<"isn't numeric"> warning will only
635be reported for the C<$a> variable.
636
637    my $a = "2:" + 3;
638    no warnings;
639    my $b = "2:" + 3;
640
641Note that neither the B<-w> flag or the C<$^W> can be used to
642disable/enable default warnings.  They are still mandatory in this case.
643
644=head2 What's wrong with B<-w> and C<$^W>
645
646Although very useful, the big problem with using B<-w> on the command
647line to enable warnings is that it is all or nothing.  Take the typical
648scenario when you are writing a Perl program.  Parts of the code you
649will write yourself, but it's very likely that you will make use of
650pre-written Perl modules.  If you use the B<-w> flag in this case, you
651end up enabling warnings in pieces of code that you haven't written.
652
653Similarly, using C<$^W> to either disable or enable blocks of code is
654fundamentally flawed.  For a start, say you want to disable warnings in
655a block of code.  You might expect this to be enough to do the trick:
656
657     {
658         local ($^W) = 0;
659	 my $a =+ 2;
660	 my $b; chop $b;
661     }
662
663When this code is run with the B<-w> flag, a warning will be produced
664for the C<$a> line:  C<"Reversed += operator">.
665
666The problem is that Perl has both compile-time and run-time warnings.  To
667disable compile-time warnings you need to rewrite the code like this:
668
669     {
670         BEGIN { $^W = 0 }
671	 my $a =+ 2;
672	 my $b; chop $b;
673     }
674
675The other big problem with C<$^W> is the way you can inadvertently
676change the warning setting in unexpected places in your code.  For example,
677when the code below is run (without the B<-w> flag), the second call
678to C<doit> will trip a C<"Use of uninitialized value"> warning, whereas
679the first will not.
680
681    sub doit
682    {
683        my $b; chop $b;
684    }
685
686    doit();
687
688    {
689        local ($^W) = 1;
690        doit()
691    }
692
693This is a side-effect of C<$^W> being dynamically scoped.
694
695Lexical warnings get around these limitations by allowing finer control
696over where warnings can or can't be tripped.
697
698=head2 Controlling Warnings from the Command Line
699
700There are three Command Line flags that can be used to control when
701warnings are (or aren't) produced:
702
703=over 5
704
705=item B<-w>
706X<-w>
707
708This is  the existing flag.  If the lexical warnings pragma is B<not>
709used in any of you code, or any of the modules that you use, this flag
710will enable warnings everywhere.  See L<Backward Compatibility> for
711details of how this flag interacts with lexical warnings.
712
713=item B<-W>
714X<-W>
715
716If the B<-W> flag is used on the command line, it will enable all warnings
717throughout the program regardless of whether warnings were disabled
718locally using C<no warnings> or C<$^W =0>.
719This includes all files that get
720included via C<use>, C<require> or C<do>.
721Think of it as the Perl equivalent of the "lint" command.
722
723=item B<-X>
724X<-X>
725
726Does the exact opposite to the B<-W> flag, i.e. it disables all warnings.
727
728=back
729
730=head2 Backward Compatibility
731
732If you are used to working with a version of Perl prior to the
733introduction of lexically scoped warnings, or have code that uses both
734lexical warnings and C<$^W>, this section will describe how they interact.
735
736How Lexical Warnings interact with B<-w>/C<$^W>:
737
738=over 5
739
740=item 1.
741
742If none of the three command line flags (B<-w>, B<-W> or B<-X>) that
743control warnings is used and neither C<$^W> nor the C<warnings> pragma
744are used, then default warnings will be enabled and optional warnings
745disabled.
746This means that legacy code that doesn't attempt to control the warnings
747will work unchanged.
748
749=item 2.
750
751The B<-w> flag just sets the global C<$^W> variable as in 5.005.  This
752means that any legacy code that currently relies on manipulating C<$^W>
753to control warning behavior will still work as is.
754
755=item 3.
756
757Apart from now being a boolean, the C<$^W> variable operates in exactly
758the same horrible uncontrolled global way, except that it cannot
759disable/enable default warnings.
760
761=item 4.
762
763If a piece of code is under the control of the C<warnings> pragma,
764both the C<$^W> variable and the B<-w> flag will be ignored for the
765scope of the lexical warning.
766
767=item 5.
768
769The only way to override a lexical warnings setting is with the B<-W>
770or B<-X> command line flags.
771
772=back
773
774The combined effect of 3 & 4 is that it will allow code which uses
775the C<warnings> pragma to control the warning behavior of $^W-type
776code (using a C<local $^W=0>) if it really wants to, but not vice-versa.
777
778=head2 Category Hierarchy
779X<warning, categories>
780
781A hierarchy of "categories" have been defined to allow groups of warnings
782to be enabled/disabled in isolation.
783
784The current hierarchy is:
785
786    all -+
787         |
788         +- closure
789         |
790         +- deprecated
791         |
792         +- exiting
793         |
794         +- experimental --+
795         |                 |
796         |                 +- experimental::alpha_assertions
797         |                 |
798         |                 +- experimental::bitwise
799         |                 |
800         |                 +- experimental::const_attr
801         |                 |
802         |                 +- experimental::declared_refs
803         |                 |
804         |                 +- experimental::lexical_subs
805         |                 |
806         |                 +- experimental::postderef
807         |                 |
808         |                 +- experimental::re_strict
809         |                 |
810         |                 +- experimental::refaliasing
811         |                 |
812         |                 +- experimental::regex_sets
813         |                 |
814         |                 +- experimental::script_run
815         |                 |
816         |                 +- experimental::signatures
817         |                 |
818         |                 +- experimental::smartmatch
819         |                 |
820         |                 +- experimental::win32_perlio
821         |
822         +- glob
823         |
824         +- imprecision
825         |
826         +- io ------------+
827         |                 |
828         |                 +- closed
829         |                 |
830         |                 +- exec
831         |                 |
832         |                 +- layer
833         |                 |
834         |                 +- newline
835         |                 |
836         |                 +- pipe
837         |                 |
838         |                 +- syscalls
839         |                 |
840         |                 +- unopened
841         |
842         +- locale
843         |
844         +- misc
845         |
846         +- missing
847         |
848         +- numeric
849         |
850         +- once
851         |
852         +- overflow
853         |
854         +- pack
855         |
856         +- portable
857         |
858         +- recursion
859         |
860         +- redefine
861         |
862         +- redundant
863         |
864         +- regexp
865         |
866         +- severe --------+
867         |                 |
868         |                 +- debugging
869         |                 |
870         |                 +- inplace
871         |                 |
872         |                 +- internal
873         |                 |
874         |                 +- malloc
875         |
876         +- shadow
877         |
878         +- signal
879         |
880         +- substr
881         |
882         +- syntax --------+
883         |                 |
884         |                 +- ambiguous
885         |                 |
886         |                 +- bareword
887         |                 |
888         |                 +- digit
889         |                 |
890         |                 +- illegalproto
891         |                 |
892         |                 +- parenthesis
893         |                 |
894         |                 +- precedence
895         |                 |
896         |                 +- printf
897         |                 |
898         |                 +- prototype
899         |                 |
900         |                 +- qw
901         |                 |
902         |                 +- reserved
903         |                 |
904         |                 +- semicolon
905         |
906         +- taint
907         |
908         +- threads
909         |
910         +- uninitialized
911         |
912         +- unpack
913         |
914         +- untie
915         |
916         +- utf8 ----------+
917         |                 |
918         |                 +- non_unicode
919         |                 |
920         |                 +- nonchar
921         |                 |
922         |                 +- surrogate
923         |
924         +- void
925
926Just like the "strict" pragma any of these categories can be combined
927
928    use warnings qw(void redefine);
929    no warnings qw(io syntax untie);
930
931Also like the "strict" pragma, if there is more than one instance of the
932C<warnings> pragma in a given scope the cumulative effect is additive.
933
934    use warnings qw(void); # only "void" warnings enabled
935    ...
936    use warnings qw(io);   # only "void" & "io" warnings enabled
937    ...
938    no warnings qw(void);  # only "io" warnings enabled
939
940To determine which category a specific warning has been assigned to see
941L<perldiag>.
942
943Note: Before Perl 5.8.0, the lexical warnings category "deprecated" was a
944sub-category of the "syntax" category.  It is now a top-level category
945in its own right.
946
947Note: Before 5.21.0, the "missing" lexical warnings category was
948internally defined to be the same as the "uninitialized" category. It
949is now a top-level category in its own right.
950
951=head2 Fatal Warnings
952X<warning, fatal>
953
954The presence of the word "FATAL" in the category list will escalate
955warnings in those categories into fatal errors in that lexical scope.
956
957B<NOTE:> FATAL warnings should be used with care, particularly
958C<< FATAL => 'all' >>.
959
960Libraries using L<warnings::warn|/FUNCTIONS> for custom warning categories
961generally don't expect L<warnings::warn|/FUNCTIONS> to be fatal and can wind up
962in an unexpected state as a result.  For XS modules issuing categorized
963warnings, such unanticipated exceptions could also expose memory leak bugs.
964
965Moreover, the Perl interpreter itself has had serious bugs involving
966fatalized warnings.  For a summary of resolved and unresolved problems as
967of January 2015, please see
968L<this perl5-porters post|http://www.nntp.perl.org/group/perl.perl5.porters/2015/01/msg225235.html>.
969
970While some developers find fatalizing some warnings to be a useful
971defensive programming technique, using C<< FATAL => 'all' >> to fatalize
972all possible warning categories -- including custom ones -- is particularly
973risky.  Therefore, the use of C<< FATAL => 'all' >> is
974L<discouraged|perlpolicy/discouraged>.
975
976The L<strictures|strictures/VERSION-2> module on CPAN offers one example of
977a warnings subset that the module's authors believe is relatively safe to
978fatalize.
979
980B<NOTE:> users of FATAL warnings, especially those using
981C<< FATAL => 'all' >>, should be fully aware that they are risking future
982portability of their programs by doing so.  Perl makes absolutely no
983commitments to not introduce new warnings or warnings categories in the
984future; indeed, we explicitly reserve the right to do so.  Code that may
985not warn now may warn in a future release of Perl if the Perl5 development
986team deems it in the best interests of the community to do so.  Should code
987using FATAL warnings break due to the introduction of a new warning we will
988NOT consider it an incompatible change.  Users of FATAL warnings should
989take special caution during upgrades to check to see if their code triggers
990any new warnings and should pay particular attention to the fine print of
991the documentation of the features they use to ensure they do not exploit
992features that are documented as risky, deprecated, or unspecified, or where
993the documentation says "so don't do that", or anything with the same sense
994and spirit.  Use of such features in combination with FATAL warnings is
995ENTIRELY AT THE USER'S RISK.
996
997The following documentation describes how to use FATAL warnings but the
998perl5 porters strongly recommend that you understand the risks before doing
999so, especially for library code intended for use by others, as there is no
1000way for downstream users to change the choice of fatal categories.
1001
1002In the code below, the use of C<time>, C<length>
1003and C<join> can all produce a C<"Useless use of xxx in void context">
1004warning.
1005
1006    use warnings;
1007
1008    time;
1009
1010    {
1011        use warnings FATAL => qw(void);
1012        length "abc";
1013    }
1014
1015    join "", 1,2,3;
1016
1017    print "done\n";
1018
1019When run it produces this output
1020
1021    Useless use of time in void context at fatal line 3.
1022    Useless use of length in void context at fatal line 7.
1023
1024The scope where C<length> is used has escalated the C<void> warnings
1025category into a fatal error, so the program terminates immediately when it
1026encounters the warning.
1027
1028To explicitly turn off a "FATAL" warning you just disable the warning
1029it is associated with.  So, for example, to disable the "void" warning
1030in the example above, either of these will do the trick:
1031
1032    no warnings qw(void);
1033    no warnings FATAL => qw(void);
1034
1035If you want to downgrade a warning that has been escalated into a fatal
1036error back to a normal warning, you can use the "NONFATAL" keyword.  For
1037example, the code below will promote all warnings into fatal errors,
1038except for those in the "syntax" category.
1039
1040    use warnings FATAL => 'all', NONFATAL => 'syntax';
1041
1042As of Perl 5.20, instead of C<< use warnings FATAL => 'all'; >> you can
1043use:
1044
1045   use v5.20;       # Perl 5.20 or greater is required for the following
1046   use warnings 'FATAL';  # short form of "use warnings FATAL => 'all';"
1047
1048If you want your program to be compatible with versions of Perl before
10495.20, you must use C<< use warnings FATAL => 'all'; >> instead.  (In
1050previous versions of Perl, the behavior of the statements
1051C<< use warnings 'FATAL'; >>, C<< use warnings 'NONFATAL'; >> and
1052C<< no warnings 'FATAL'; >> was unspecified; they did not behave as if
1053they included the C<< => 'all' >> portion.  As of 5.20, they do.)
1054
1055=head2 Reporting Warnings from a Module
1056X<warning, reporting> X<warning, registering>
1057
1058The C<warnings> pragma provides a number of functions that are useful for
1059module authors.  These are used when you want to report a module-specific
1060warning to a calling module has enabled warnings via the C<warnings>
1061pragma.
1062
1063Consider the module C<MyMod::Abc> below.
1064
1065    package MyMod::Abc;
1066
1067    use warnings::register;
1068
1069    sub open {
1070        my $path = shift;
1071        if ($path !~ m#^/#) {
1072            warnings::warn("changing relative path to /var/abc")
1073                if warnings::enabled();
1074            $path = "/var/abc/$path";
1075        }
1076    }
1077
1078    1;
1079
1080The call to C<warnings::register> will create a new warnings category
1081called "MyMod::Abc", i.e. the new category name matches the current
1082package name.  The C<open> function in the module will display a warning
1083message if it gets given a relative path as a parameter.  This warnings
1084will only be displayed if the code that uses C<MyMod::Abc> has actually
1085enabled them with the C<warnings> pragma like below.
1086
1087    use MyMod::Abc;
1088    use warnings 'MyMod::Abc';
1089    ...
1090    abc::open("../fred.txt");
1091
1092It is also possible to test whether the pre-defined warnings categories are
1093set in the calling module with the C<warnings::enabled> function.  Consider
1094this snippet of code:
1095
1096    package MyMod::Abc;
1097
1098    sub open {
1099        if (warnings::enabled("deprecated")) {
1100            warnings::warn("deprecated",
1101                           "open is deprecated, use new instead");
1102        }
1103        new(@_);
1104    }
1105
1106    sub new
1107    ...
1108    1;
1109
1110The function C<open> has been deprecated, so code has been included to
1111display a warning message whenever the calling module has (at least) the
1112"deprecated" warnings category enabled.  Something like this, say.
1113
1114    use warnings 'deprecated';
1115    use MyMod::Abc;
1116    ...
1117    MyMod::Abc::open($filename);
1118
1119Either the C<warnings::warn> or C<warnings::warnif> function should be
1120used to actually display the warnings message.  This is because they can
1121make use of the feature that allows warnings to be escalated into fatal
1122errors.  So in this case
1123
1124    use MyMod::Abc;
1125    use warnings FATAL => 'MyMod::Abc';
1126    ...
1127    MyMod::Abc::open('../fred.txt');
1128
1129the C<warnings::warnif> function will detect this and die after
1130displaying the warning message.
1131
1132The three warnings functions, C<warnings::warn>, C<warnings::warnif>
1133and C<warnings::enabled> can optionally take an object reference in place
1134of a category name.  In this case the functions will use the class name
1135of the object as the warnings category.
1136
1137Consider this example:
1138
1139    package Original;
1140
1141    no warnings;
1142    use warnings::register;
1143
1144    sub new
1145    {
1146        my $class = shift;
1147        bless [], $class;
1148    }
1149
1150    sub check
1151    {
1152        my $self = shift;
1153        my $value = shift;
1154
1155        if ($value % 2 && warnings::enabled($self))
1156          { warnings::warn($self, "Odd numbers are unsafe") }
1157    }
1158
1159    sub doit
1160    {
1161        my $self = shift;
1162        my $value = shift;
1163        $self->check($value);
1164        # ...
1165    }
1166
1167    1;
1168
1169    package Derived;
1170
1171    use warnings::register;
1172    use Original;
1173    our @ISA = qw( Original );
1174    sub new
1175    {
1176        my $class = shift;
1177        bless [], $class;
1178    }
1179
1180
1181    1;
1182
1183The code below makes use of both modules, but it only enables warnings from
1184C<Derived>.
1185
1186    use Original;
1187    use Derived;
1188    use warnings 'Derived';
1189    my $a = Original->new();
1190    $a->doit(1);
1191    my $b = Derived->new();
1192    $a->doit(1);
1193
1194When this code is run only the C<Derived> object, C<$b>, will generate
1195a warning.
1196
1197    Odd numbers are unsafe at main.pl line 7
1198
1199Notice also that the warning is reported at the line where the object is first
1200used.
1201
1202When registering new categories of warning, you can supply more names to
1203warnings::register like this:
1204
1205    package MyModule;
1206    use warnings::register qw(format precision);
1207
1208    ...
1209
1210    warnings::warnif('MyModule::format', '...');
1211
1212=head1 FUNCTIONS
1213
1214Note: The functions with names ending in C<_at_level> were added in Perl
12155.28.
1216
1217=over 4
1218
1219=item use warnings::register
1220
1221Creates a new warnings category with the same name as the package where
1222the call to the pragma is used.
1223
1224=item warnings::enabled()
1225
1226Use the warnings category with the same name as the current package.
1227
1228Return TRUE if that warnings category is enabled in the calling module.
1229Otherwise returns FALSE.
1230
1231=item warnings::enabled($category)
1232
1233Return TRUE if the warnings category, C<$category>, is enabled in the
1234calling module.
1235Otherwise returns FALSE.
1236
1237=item warnings::enabled($object)
1238
1239Use the name of the class for the object reference, C<$object>, as the
1240warnings category.
1241
1242Return TRUE if that warnings category is enabled in the first scope
1243where the object is used.
1244Otherwise returns FALSE.
1245
1246=item warnings::enabled_at_level($category, $level)
1247
1248Like C<warnings::enabled>, but $level specifies the exact call frame, 0
1249being the immediate caller.
1250
1251=item warnings::fatal_enabled()
1252
1253Return TRUE if the warnings category with the same name as the current
1254package has been set to FATAL in the calling module.
1255Otherwise returns FALSE.
1256
1257=item warnings::fatal_enabled($category)
1258
1259Return TRUE if the warnings category C<$category> has been set to FATAL in
1260the calling module.
1261Otherwise returns FALSE.
1262
1263=item warnings::fatal_enabled($object)
1264
1265Use the name of the class for the object reference, C<$object>, as the
1266warnings category.
1267
1268Return TRUE if that warnings category has been set to FATAL in the first
1269scope where the object is used.
1270Otherwise returns FALSE.
1271
1272=item warnings::fatal_enabled_at_level($category, $level)
1273
1274Like C<warnings::fatal_enabled>, but $level specifies the exact call frame,
12750 being the immediate caller.
1276
1277=item warnings::warn($message)
1278
1279Print C<$message> to STDERR.
1280
1281Use the warnings category with the same name as the current package.
1282
1283If that warnings category has been set to "FATAL" in the calling module
1284then die. Otherwise return.
1285
1286=item warnings::warn($category, $message)
1287
1288Print C<$message> to STDERR.
1289
1290If the warnings category, C<$category>, has been set to "FATAL" in the
1291calling module then die. Otherwise return.
1292
1293=item warnings::warn($object, $message)
1294
1295Print C<$message> to STDERR.
1296
1297Use the name of the class for the object reference, C<$object>, as the
1298warnings category.
1299
1300If that warnings category has been set to "FATAL" in the scope where C<$object>
1301is first used then die. Otherwise return.
1302
1303=item warnings::warn_at_level($category, $level, $message)
1304
1305Like C<warnings::warn>, but $level specifies the exact call frame,
13060 being the immediate caller.
1307
1308=item warnings::warnif($message)
1309
1310Equivalent to:
1311
1312    if (warnings::enabled())
1313      { warnings::warn($message) }
1314
1315=item warnings::warnif($category, $message)
1316
1317Equivalent to:
1318
1319    if (warnings::enabled($category))
1320      { warnings::warn($category, $message) }
1321
1322=item warnings::warnif($object, $message)
1323
1324Equivalent to:
1325
1326    if (warnings::enabled($object))
1327      { warnings::warn($object, $message) }
1328
1329=item warnings::warnif_at_level($category, $level, $message)
1330
1331Like C<warnings::warnif>, but $level specifies the exact call frame,
13320 being the immediate caller.
1333
1334=item warnings::register_categories(@names)
1335
1336This registers warning categories for the given names and is primarily for
1337use by the warnings::register pragma.
1338
1339=back
1340
1341See also L<perlmodlib/Pragmatic Modules> and L<perldiag>.
1342
1343=cut
1344
1345# ex: set ro:
1346