This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Evermore AUTHORS and MAINTAIN.
[perl5.git] / README.lexwarn
CommitLineData
599cee73
PM
1Date: 29th July 1998
2
3This patch adds lexical warnings to Perl. It should apply over
45.005_50
5
6NOTE: This is a prototype. Do not assume that lexical warnings will
7 necessarily be anything like this implementation.
8
9Changes
10=======
11
12 Date: 8th April 1998
13
14 * patch now applies cleanly over 5.004_64
15
16 * added the -X switch (the inverse "lint" command)
17
18 Date: 26th Feb 1997
19
20 * By popular demand, the warnings bitmask can now be of arbitrary
21 length. The code uses an SV* to store the bitmask.
22
23 * Rationalised the warning categories a bit. This area still needs
24 a lot of work.
25
26 * Added -W switch (the "lint" command).
27
28 * Added an experimental feature to allow warnings to be excalated
29 to fatal errors.
30
31
32The "use warning" pragma
33========================
34
35 The "use warning" pragma is intended to replace both the use of the
36 command line flag "-w" and its equivalent variable $^W with a pragma
37 that works like the existing "strict" pragma.
38
39 This means that the scope of the pragma is limited to the enclosing
40 block. It also means that that a pragma setting will not leak across
41 files (via use/require/do). This will allow authors to define the
42 degree of warning checks that will be applied to their module.
43
44 By default warnings are disabled.
45
46 All warnings are enabled in a block by either of these:
47
48 use warning ;
49 use warning 'all' ;
50
51 Similarly all warnings are disabled in a block by either of these:
52
53 no warning ;
54 no warning 'all' ;
55
56 A hierarchy of "categories" have been defined to allow groups of
57 warnings to be enabled/disabled in isolation. The current
58 hierarchy is:
59
60 all - +--- unsafe -------+--- taint
61 | |
62 | +--- substr
63 | |
64 | +--- signal
65 | |
66 | +--- closure
67 | |
68 | +--- untie
69 |
70 +--- io ---------+--- pipe
71 | |
72 | +--- unopened
73 | |
74 | +--- closed
75 | |
76 | +--- newline
77 | |
78 | +--- exec
79 |
80 +--- syntax ----+--- ambiguous
81 | |
82 | +--- semicolon
83 | |
84 | +--- precedence
85 | |
86 | +--- reserved
87 | |
88 | +--- octal
89 | |
90 | +--- parenthesis
91 | |
92 | +--- deprecated
93 |
94 |--- uninitialized
95 |
96 +--- void
97 |
98 +--- recursion
99 |
100 +--- redefine
101 |
102 +--- numeric
103 |
104 +--- once
105 |
106 +--- misc
107
108 This hierarchy is very tentative. Feedback is needed.
109
110 Just like the "strict" pragma any of these categories can be
111 combined
112
113 use warning qw(void redefine) ;
114 no warning qw(io syntax untie) ;
115
116The "lint" flag, -W
117===================
118
119If the -W flag is used on the command line, it will enable all warnings
120throughout the program regardless of whether warnings were disabled
121locally using "no warning" or $^W =0. This includes any file that gets
122included during compilation via use/require.
123
124The inverse "lint" flag, -X
125===========================
126Does exactly the same as the -W flag, except it disables all warnings.
127
128
129Backward Compatability
130======================
131
132 How Lexical Warnings interact with -w/$^W
133
134 1. The -w flag just sets the global $^W variable as in 5.004
135 This means that any legacy code that currently relies on
136 manipulating $^W to control warning behaviour will still work.
137
138 2. Apart from now being a boolean, the $^W variable operates in
139 exactly the same horrible uncontrolled global way as in 5.004,
140 except...
141
142 3. If a piece of code is under the control of a lexical warning
143 pragma, the $^W variable will be ignored.
144
145 The combined effect of 2 & 3 is that it will will allow new code
146 which will use the lexical warning pragma to control old
147 $^W-type code (using a local $^W=0) if it really wants to, but
148 not vice-versa.
149
150 4. The only way to override a lexical warnings setting is with the
151 new -W or -X command line flags.
152
153
154Fatal Warnings
155==============
156
157This feature is very experimental.
158
159The presence of the word "FATAL" in the category list will escalate any
160warnings from the category specified that are detected in the lexical
161scope into fatal errors. In the code below, there are 3 places where a
162deprecated warning will be detected, the middle one will produce a
163fatal error.
164
165
166 use warning ;
167
168 $a = 1 if $a EQ $b ;
169
170 {
171 use warning qw(FATAL deprecated) ;
172 $a = 1 if $a EQ $b ;
173 }
174
175 $a = 1 if $a EQ $b ;
176
177
178TODO
179====
180
181test harness for -X (assuming it is a permanent fixture).
182win32, os2 & vms all have warnings. These need to be included.
183
184Unresolved Issues
185=================
186
187 The pragma name?
188 A few possibilities:
189 warning
190 warnings
191 warn
192
193 Hierarchy of Warnings
194 The current patch has a fairly arbitrary hierarchy.
195 Ideas for a useful hierarchy would be most welcome.
196
197 A command line option to turn off all warnings?
198 -X or -q, perhaps.
199
200 Current mandatory warnings.
201 May be useful to bring them under the control of this pragma.
202
203 Severity
204 Do we want/need a severity classification?
205 pedantic
206 high/strict/precise
207 medium/default
208 low/common
209
210 Versions
211 This is a thorhy issue. Say someone writes a script using Perl
212 5.004 and places this at the top:
213
214 use warning ;
215
216 Time passes and 5.005 comes out. It has added a few extra warnings.
217 The script prints warning messages.
218
219 A possibility is to allow the warnings that are checked to be
220 limited to those available in a given version of Perl. A possible
221 syntax could be:
222
223 use warning 5.004 ;
224
225 or
226
227 use warning 5.004 qw(void uninitialized) ;
228
229 Do we really need this amount of control?
230
231 Documentation
232 There isn't any yet.
233
234
235 perl5db.pl
236 The debugger saves and restores $^W at runtime. I haven't checked
237 whether the debugger will still work with the lexical warnings
238 patch applied.
239
240 diagnostics.pm
241 I *think* I've got diagnostics to work with the lexiacal warnings
242 patch, but there were design decisions made in diagnostics to work
243 around the limitations of $^W. Now that those limitations are gone,
244 the module should be revisited.