annotate gcc/ada/errutil.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- E R R U T I L --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 1991-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 with Atree; use Atree;
kono
parents:
diff changeset
27 with Err_Vars; use Err_Vars;
kono
parents:
diff changeset
28 with Erroutc; use Erroutc;
kono
parents:
diff changeset
29 with Namet; use Namet;
kono
parents:
diff changeset
30 with Opt; use Opt;
kono
parents:
diff changeset
31 with Output; use Output;
kono
parents:
diff changeset
32 with Scans; use Scans;
kono
parents:
diff changeset
33 with Sinput; use Sinput;
kono
parents:
diff changeset
34 with Stringt; use Stringt;
kono
parents:
diff changeset
35 with Stylesw; use Stylesw;
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 package body Errutil is
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 Errors_Must_Be_Ignored : Boolean := False;
kono
parents:
diff changeset
40 -- Set to True by procedure Set_Ignore_Errors (True), when calls to
kono
parents:
diff changeset
41 -- error message procedures should be ignored (when parsing irrelevant
kono
parents:
diff changeset
42 -- text in sources being preprocessed).
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 -----------------------
kono
parents:
diff changeset
45 -- Local Subprograms --
kono
parents:
diff changeset
46 -----------------------
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 procedure Error_Msg_AP (Msg : String);
kono
parents:
diff changeset
49 -- Output a message just after the previous token
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 procedure Output_Source_Line
kono
parents:
diff changeset
52 (L : Physical_Line_Number;
kono
parents:
diff changeset
53 Sfile : Source_File_Index;
kono
parents:
diff changeset
54 Errs : Boolean;
kono
parents:
diff changeset
55 Source_Type : String);
kono
parents:
diff changeset
56 -- Outputs text of source line L, in file S, together with preceding line
kono
parents:
diff changeset
57 -- number, as described above for Output_Line_Number. The Errs parameter
kono
parents:
diff changeset
58 -- indicates if there are errors attached to the line, which forces
kono
parents:
diff changeset
59 -- listing on, even in the presence of pragma List (Off).
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 procedure Set_Msg_Insertion_Column;
kono
parents:
diff changeset
62 -- Handle column number insertion (@ insertion character)
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 procedure Set_Msg_Text (Text : String; Flag : Source_Ptr);
kono
parents:
diff changeset
65 -- Add a sequence of characters to the current message. The characters may
kono
parents:
diff changeset
66 -- be one of the special insertion characters (see documentation in spec).
kono
parents:
diff changeset
67 -- Flag is the location at which the error is to be posted, which is used
kono
parents:
diff changeset
68 -- to determine whether or not the # insertion needs a file name. The
kono
parents:
diff changeset
69 -- variables Msg_Buffer, Msglen, Is_Style_Msg, Is_Warning_Msg, and
kono
parents:
diff changeset
70 -- Is_Unconditional_Msg are set on return.
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 ------------------
kono
parents:
diff changeset
73 -- Error_Msg_AP --
kono
parents:
diff changeset
74 ------------------
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 procedure Error_Msg_AP (Msg : String) is
kono
parents:
diff changeset
77 S1 : Source_Ptr;
kono
parents:
diff changeset
78 C : Character;
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 begin
kono
parents:
diff changeset
81 -- If we had saved the Scan_Ptr value after scanning the previous
kono
parents:
diff changeset
82 -- token, then we would have exactly the right place for putting
kono
parents:
diff changeset
83 -- the flag immediately at hand. However, that would add at least
kono
parents:
diff changeset
84 -- two instructions to a Scan call *just* to service the possibility
kono
parents:
diff changeset
85 -- of an Error_Msg_AP call. So instead we reconstruct that value.
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 -- We have two possibilities, start with Prev_Token_Ptr and skip over
kono
parents:
diff changeset
88 -- the current token, which is made harder by the possibility that this
kono
parents:
diff changeset
89 -- token may be in error, or start with Token_Ptr and work backwards.
kono
parents:
diff changeset
90 -- We used to take the second approach, but it's hard because of
kono
parents:
diff changeset
91 -- comments, and harder still because things that look like comments
kono
parents:
diff changeset
92 -- can appear inside strings. So now we take the first approach.
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 -- Note: in the case where there is no previous token, Prev_Token_Ptr
kono
parents:
diff changeset
95 -- is set to Source_First, which is a reasonable position for the
kono
parents:
diff changeset
96 -- error flag in this situation.
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 S1 := Prev_Token_Ptr;
kono
parents:
diff changeset
99 C := Source (S1);
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 -- If the previous token is a string literal, we need a special approach
kono
parents:
diff changeset
102 -- since there may be white space inside the literal and we don't want
kono
parents:
diff changeset
103 -- to stop on that white space.
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 -- Note that it is not worth worrying about special UTF_32 line
kono
parents:
diff changeset
106 -- terminator characters in this context, since this is only about
kono
parents:
diff changeset
107 -- error recovery anyway.
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 if Prev_Token = Tok_String_Literal then
kono
parents:
diff changeset
110 loop
kono
parents:
diff changeset
111 S1 := S1 + 1;
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 if Source (S1) = C then
kono
parents:
diff changeset
114 S1 := S1 + 1;
kono
parents:
diff changeset
115 exit when Source (S1) /= C;
kono
parents:
diff changeset
116 elsif Source (S1) in Line_Terminator then
kono
parents:
diff changeset
117 exit;
kono
parents:
diff changeset
118 end if;
kono
parents:
diff changeset
119 end loop;
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 -- Character literal also needs special handling
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 elsif Prev_Token = Tok_Char_Literal then
kono
parents:
diff changeset
124 S1 := S1 + 3;
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 -- Otherwise we search forward for the end of the current token, marked
kono
parents:
diff changeset
127 -- by a line terminator, white space, a comment symbol or if we bump
kono
parents:
diff changeset
128 -- into the following token (i.e. the current token)
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 -- Note that it is not worth worrying about special UTF_32 line
kono
parents:
diff changeset
131 -- terminator characters in this context, since this is only about
kono
parents:
diff changeset
132 -- error recovery anyway.
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 else
kono
parents:
diff changeset
135 while Source (S1) not in Line_Terminator
kono
parents:
diff changeset
136 and then Source (S1) /= ' '
kono
parents:
diff changeset
137 and then Source (S1) /= ASCII.HT
kono
parents:
diff changeset
138 and then (Source (S1) /= '-' or else Source (S1 + 1) /= '-')
kono
parents:
diff changeset
139 and then S1 /= Token_Ptr
kono
parents:
diff changeset
140 loop
kono
parents:
diff changeset
141 S1 := S1 + 1;
kono
parents:
diff changeset
142 end loop;
kono
parents:
diff changeset
143 end if;
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 -- S1 is now set to the location for the flag
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 Error_Msg (Msg, S1);
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 end Error_Msg_AP;
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 ---------------
kono
parents:
diff changeset
152 -- Error_Msg --
kono
parents:
diff changeset
153 ---------------
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 procedure Error_Msg (Msg : String; Flag_Location : Source_Ptr) is
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 Next_Msg : Error_Msg_Id;
kono
parents:
diff changeset
158 -- Pointer to next message at insertion point
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 Prev_Msg : Error_Msg_Id;
kono
parents:
diff changeset
161 -- Pointer to previous message at insertion point
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 Sptr : Source_Ptr renames Flag_Location;
kono
parents:
diff changeset
164 -- Corresponds to the Sptr value in the error message object
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 Optr : Source_Ptr renames Flag_Location;
kono
parents:
diff changeset
167 -- Corresponds to the Optr value in the error message object. Note that
kono
parents:
diff changeset
168 -- for this usage, Sptr and Optr always have the same value, since we do
kono
parents:
diff changeset
169 -- not have to worry about generic instantiations.
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 begin
kono
parents:
diff changeset
172 if Errors_Must_Be_Ignored then
kono
parents:
diff changeset
173 return;
kono
parents:
diff changeset
174 end if;
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 if Raise_Exception_On_Error /= 0 then
kono
parents:
diff changeset
177 raise Error_Msg_Exception;
kono
parents:
diff changeset
178 end if;
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 Prescan_Message (Msg);
kono
parents:
diff changeset
181 Set_Msg_Text (Msg, Sptr);
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 -- Kill continuation if parent message killed
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 if Continuation and Last_Killed then
kono
parents:
diff changeset
186 return;
kono
parents:
diff changeset
187 end if;
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 -- Return without doing anything if message is killed and this is not
kono
parents:
diff changeset
190 -- the first error message. The philosophy is that if we get a weird
kono
parents:
diff changeset
191 -- error message and we already have had a message, then we hope the
kono
parents:
diff changeset
192 -- weird message is a junk cascaded message
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 -- Immediate return if warning message and warnings are suppressed.
kono
parents:
diff changeset
195 -- Note that style messages are not warnings for this purpose.
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 if Is_Warning_Msg and then Warnings_Suppressed (Sptr) /= No_String then
kono
parents:
diff changeset
198 Cur_Msg := No_Error_Msg;
kono
parents:
diff changeset
199 return;
kono
parents:
diff changeset
200 end if;
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 -- Otherwise build error message object for new message
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 Errors.Append
kono
parents:
diff changeset
205 (New_Val =>
kono
parents:
diff changeset
206 (Text => new String'(Msg_Buffer (1 .. Msglen)),
kono
parents:
diff changeset
207 Next => No_Error_Msg,
kono
parents:
diff changeset
208 Prev => No_Error_Msg,
kono
parents:
diff changeset
209 Sfile => Get_Source_File_Index (Sptr),
kono
parents:
diff changeset
210 Sptr => Sptr,
kono
parents:
diff changeset
211 Optr => Optr,
kono
parents:
diff changeset
212 Line => Get_Physical_Line_Number (Sptr),
kono
parents:
diff changeset
213 Col => Get_Column_Number (Sptr),
kono
parents:
diff changeset
214 Warn => Is_Warning_Msg,
kono
parents:
diff changeset
215 Info => Is_Info_Msg,
kono
parents:
diff changeset
216 Check => Is_Check_Msg,
kono
parents:
diff changeset
217 Warn_Err => Warning_Mode = Treat_As_Error,
kono
parents:
diff changeset
218 Warn_Chr => Warning_Msg_Char,
kono
parents:
diff changeset
219 Style => Is_Style_Msg,
kono
parents:
diff changeset
220 Serious => Is_Serious_Error,
kono
parents:
diff changeset
221 Uncond => Is_Unconditional_Msg,
kono
parents:
diff changeset
222 Msg_Cont => Continuation,
kono
parents:
diff changeset
223 Deleted => False,
kono
parents:
diff changeset
224 Node => Empty));
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 Cur_Msg := Errors.Last;
kono
parents:
diff changeset
227 Prev_Msg := No_Error_Msg;
kono
parents:
diff changeset
228 Next_Msg := First_Error_Msg;
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 while Next_Msg /= No_Error_Msg loop
kono
parents:
diff changeset
231 exit when
kono
parents:
diff changeset
232 Errors.Table (Cur_Msg).Sfile < Errors.Table (Next_Msg).Sfile;
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 if Errors.Table (Cur_Msg).Sfile = Errors.Table (Next_Msg).Sfile then
kono
parents:
diff changeset
235 exit when Sptr < Errors.Table (Next_Msg).Sptr;
kono
parents:
diff changeset
236 end if;
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 Prev_Msg := Next_Msg;
kono
parents:
diff changeset
239 Next_Msg := Errors.Table (Next_Msg).Next;
kono
parents:
diff changeset
240 end loop;
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 -- Now we insert the new message in the error chain. The insertion
kono
parents:
diff changeset
243 -- point for the message is after Prev_Msg and before Next_Msg.
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 -- The possible insertion point for the new message is after Prev_Msg
kono
parents:
diff changeset
246 -- and before Next_Msg. However, this is where we do a special check
kono
parents:
diff changeset
247 -- for redundant parsing messages, defined as messages posted on the
kono
parents:
diff changeset
248 -- same line. The idea here is that probably such messages are junk
kono
parents:
diff changeset
249 -- from the parser recovering. In full errors mode, we don't do this
kono
parents:
diff changeset
250 -- deletion, but otherwise such messages are discarded at this stage.
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 if Prev_Msg /= No_Error_Msg
kono
parents:
diff changeset
253 and then Errors.Table (Prev_Msg).Line =
kono
parents:
diff changeset
254 Errors.Table (Cur_Msg).Line
kono
parents:
diff changeset
255 and then Errors.Table (Prev_Msg).Sfile =
kono
parents:
diff changeset
256 Errors.Table (Cur_Msg).Sfile
kono
parents:
diff changeset
257 then
kono
parents:
diff changeset
258 -- Don't delete unconditional messages and at this stage, don't
kono
parents:
diff changeset
259 -- delete continuation lines (we attempted to delete those earlier
kono
parents:
diff changeset
260 -- if the parent message was deleted.
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 if not Errors.Table (Cur_Msg).Uncond
kono
parents:
diff changeset
263 and then not Continuation
kono
parents:
diff changeset
264 then
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 -- Don't delete if prev msg is warning and new msg is an error.
kono
parents:
diff changeset
267 -- This is because we don't want a real error masked by a warning.
kono
parents:
diff changeset
268 -- In all other cases (that is parse errors for the same line that
kono
parents:
diff changeset
269 -- are not unconditional) we do delete the message. This helps to
kono
parents:
diff changeset
270 -- avoid junk extra messages from cascaded parsing errors
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 if not (Errors.Table (Prev_Msg).Warn
kono
parents:
diff changeset
273 or else
kono
parents:
diff changeset
274 Errors.Table (Prev_Msg).Style)
kono
parents:
diff changeset
275 or else
kono
parents:
diff changeset
276 (Errors.Table (Cur_Msg).Warn
kono
parents:
diff changeset
277 or else
kono
parents:
diff changeset
278 Errors.Table (Cur_Msg).Style)
kono
parents:
diff changeset
279 then
kono
parents:
diff changeset
280 -- All tests passed, delete the message by simply returning
kono
parents:
diff changeset
281 -- without any further processing.
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 if not Continuation then
kono
parents:
diff changeset
284 Last_Killed := True;
kono
parents:
diff changeset
285 end if;
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 return;
kono
parents:
diff changeset
288 end if;
kono
parents:
diff changeset
289 end if;
kono
parents:
diff changeset
290 end if;
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 -- Come here if message is to be inserted in the error chain
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 if not Continuation then
kono
parents:
diff changeset
295 Last_Killed := False;
kono
parents:
diff changeset
296 end if;
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 if Prev_Msg = No_Error_Msg then
kono
parents:
diff changeset
299 First_Error_Msg := Cur_Msg;
kono
parents:
diff changeset
300 else
kono
parents:
diff changeset
301 Errors.Table (Prev_Msg).Next := Cur_Msg;
kono
parents:
diff changeset
302 end if;
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 Errors.Table (Cur_Msg).Next := Next_Msg;
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 -- Bump appropriate statistics counts
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 if Errors.Table (Cur_Msg).Info then
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 -- Could be (usually is) both "info" and "warning"
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 if Errors.Table (Cur_Msg).Warn then
kono
parents:
diff changeset
313 Warning_Info_Messages := Warning_Info_Messages + 1;
kono
parents:
diff changeset
314 Warnings_Detected := Warnings_Detected + 1;
kono
parents:
diff changeset
315 else
kono
parents:
diff changeset
316 Report_Info_Messages := Report_Info_Messages + 1;
kono
parents:
diff changeset
317 end if;
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 elsif Errors.Table (Cur_Msg).Warn
kono
parents:
diff changeset
320 or else Errors.Table (Cur_Msg).Style
kono
parents:
diff changeset
321 then
kono
parents:
diff changeset
322 Warnings_Detected := Warnings_Detected + 1;
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 elsif Errors.Table (Cur_Msg).Check then
kono
parents:
diff changeset
325 Check_Messages := Check_Messages + 1;
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 else
kono
parents:
diff changeset
328 Total_Errors_Detected := Total_Errors_Detected + 1;
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 if Errors.Table (Cur_Msg).Serious then
kono
parents:
diff changeset
331 Serious_Errors_Detected := Serious_Errors_Detected + 1;
kono
parents:
diff changeset
332 end if;
kono
parents:
diff changeset
333 end if;
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 end Error_Msg;
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 -----------------
kono
parents:
diff changeset
338 -- Error_Msg_S --
kono
parents:
diff changeset
339 -----------------
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 procedure Error_Msg_S (Msg : String) is
kono
parents:
diff changeset
342 begin
kono
parents:
diff changeset
343 Error_Msg (Msg, Scan_Ptr);
kono
parents:
diff changeset
344 end Error_Msg_S;
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 ------------------
kono
parents:
diff changeset
347 -- Error_Msg_SC --
kono
parents:
diff changeset
348 ------------------
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 procedure Error_Msg_SC (Msg : String) is
kono
parents:
diff changeset
351 begin
kono
parents:
diff changeset
352 -- If we are at end of file, post the flag after the previous token
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 if Token = Tok_EOF then
kono
parents:
diff changeset
355 Error_Msg_AP (Msg);
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 -- For all other cases the message is posted at the current token
kono
parents:
diff changeset
358 -- pointer position
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 else
kono
parents:
diff changeset
361 Error_Msg (Msg, Token_Ptr);
kono
parents:
diff changeset
362 end if;
kono
parents:
diff changeset
363 end Error_Msg_SC;
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 ------------------
kono
parents:
diff changeset
366 -- Error_Msg_SP --
kono
parents:
diff changeset
367 ------------------
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 procedure Error_Msg_SP (Msg : String) is
kono
parents:
diff changeset
370 begin
kono
parents:
diff changeset
371 -- Note: in the case where there is no previous token, Prev_Token_Ptr
kono
parents:
diff changeset
372 -- is set to Source_First, which is a reasonable position for the
kono
parents:
diff changeset
373 -- error flag in this situation
kono
parents:
diff changeset
374
kono
parents:
diff changeset
375 Error_Msg (Msg, Prev_Token_Ptr);
kono
parents:
diff changeset
376 end Error_Msg_SP;
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 --------------
kono
parents:
diff changeset
379 -- Finalize --
kono
parents:
diff changeset
380 --------------
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 procedure Finalize (Source_Type : String := "project") is
kono
parents:
diff changeset
383 Cur : Error_Msg_Id;
kono
parents:
diff changeset
384 Nxt : Error_Msg_Id;
kono
parents:
diff changeset
385 E, F : Error_Msg_Id;
kono
parents:
diff changeset
386 Err_Flag : Boolean;
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 begin
kono
parents:
diff changeset
389 -- Eliminate any duplicated error messages from the list. This is
kono
parents:
diff changeset
390 -- done after the fact to avoid problems with Change_Error_Text.
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 Cur := First_Error_Msg;
kono
parents:
diff changeset
393 while Cur /= No_Error_Msg loop
kono
parents:
diff changeset
394 Nxt := Errors.Table (Cur).Next;
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 F := Nxt;
kono
parents:
diff changeset
397 while F /= No_Error_Msg
kono
parents:
diff changeset
398 and then Errors.Table (F).Sptr = Errors.Table (Cur).Sptr
kono
parents:
diff changeset
399 loop
kono
parents:
diff changeset
400 Check_Duplicate_Message (Cur, F);
kono
parents:
diff changeset
401 F := Errors.Table (F).Next;
kono
parents:
diff changeset
402 end loop;
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 Cur := Nxt;
kono
parents:
diff changeset
405 end loop;
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 -- Brief Error mode
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 if Brief_Output or (not Full_List and not Verbose_Mode) then
kono
parents:
diff changeset
410 E := First_Error_Msg;
kono
parents:
diff changeset
411 Set_Standard_Error;
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 while E /= No_Error_Msg loop
kono
parents:
diff changeset
414 if not Errors.Table (E).Deleted then
kono
parents:
diff changeset
415 if Full_Path_Name_For_Brief_Errors then
kono
parents:
diff changeset
416 Write_Name (Full_Ref_Name (Errors.Table (E).Sfile));
kono
parents:
diff changeset
417 else
kono
parents:
diff changeset
418 Write_Name (Reference_Name (Errors.Table (E).Sfile));
kono
parents:
diff changeset
419 end if;
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 Write_Char (':');
kono
parents:
diff changeset
422 Write_Int (Int (Physical_To_Logical
kono
parents:
diff changeset
423 (Errors.Table (E).Line,
kono
parents:
diff changeset
424 Errors.Table (E).Sfile)));
kono
parents:
diff changeset
425 Write_Char (':');
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 if Errors.Table (E).Col < 10 then
kono
parents:
diff changeset
428 Write_Char ('0');
kono
parents:
diff changeset
429 end if;
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 Write_Int (Int (Errors.Table (E).Col));
kono
parents:
diff changeset
432 Write_Str (": ");
kono
parents:
diff changeset
433 Output_Msg_Text (E);
kono
parents:
diff changeset
434 Write_Eol;
kono
parents:
diff changeset
435 end if;
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 E := Errors.Table (E).Next;
kono
parents:
diff changeset
438 end loop;
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 Set_Standard_Output;
kono
parents:
diff changeset
441 end if;
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 -- Full source listing case
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 if Full_List then
kono
parents:
diff changeset
446 List_Pragmas_Index := 1;
kono
parents:
diff changeset
447 List_Pragmas_Mode := True;
kono
parents:
diff changeset
448 E := First_Error_Msg;
kono
parents:
diff changeset
449 Write_Eol;
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 -- First list initial main source file with its error messages
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 for N in 1 .. Last_Source_Line (Main_Source_File) loop
kono
parents:
diff changeset
454 Err_Flag :=
kono
parents:
diff changeset
455 E /= No_Error_Msg
kono
parents:
diff changeset
456 and then Errors.Table (E).Line = N
kono
parents:
diff changeset
457 and then Errors.Table (E).Sfile = Main_Source_File;
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 Output_Source_Line (N, Main_Source_File, Err_Flag, Source_Type);
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 if Err_Flag then
kono
parents:
diff changeset
462 Output_Error_Msgs (E);
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 Write_Eol;
kono
parents:
diff changeset
465 end if;
kono
parents:
diff changeset
466 end loop;
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 -- Then output errors, if any, for subsidiary units
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 while E /= No_Error_Msg
kono
parents:
diff changeset
471 and then Errors.Table (E).Sfile /= Main_Source_File
kono
parents:
diff changeset
472 loop
kono
parents:
diff changeset
473 Write_Eol;
kono
parents:
diff changeset
474 Output_Source_Line
kono
parents:
diff changeset
475 (Errors.Table (E).Line,
kono
parents:
diff changeset
476 Errors.Table (E).Sfile,
kono
parents:
diff changeset
477 True,
kono
parents:
diff changeset
478 Source_Type);
kono
parents:
diff changeset
479 Output_Error_Msgs (E);
kono
parents:
diff changeset
480 end loop;
kono
parents:
diff changeset
481 end if;
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 -- Verbose mode (error lines only with error flags)
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 if Verbose_Mode then
kono
parents:
diff changeset
486 E := First_Error_Msg;
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 -- Loop through error lines
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 while E /= No_Error_Msg loop
kono
parents:
diff changeset
491 Write_Eol;
kono
parents:
diff changeset
492 Output_Source_Line
kono
parents:
diff changeset
493 (Errors.Table (E).Line,
kono
parents:
diff changeset
494 Errors.Table (E).Sfile,
kono
parents:
diff changeset
495 True,
kono
parents:
diff changeset
496 Source_Type);
kono
parents:
diff changeset
497 Output_Error_Msgs (E);
kono
parents:
diff changeset
498 end loop;
kono
parents:
diff changeset
499 end if;
kono
parents:
diff changeset
500
kono
parents:
diff changeset
501 -- Output error summary if verbose or full list mode
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 if Verbose_Mode or else Full_List then
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 -- Extra blank line if error messages or source listing were output
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 if Total_Errors_Detected + Warnings_Detected > 0
kono
parents:
diff changeset
508 or else Full_List
kono
parents:
diff changeset
509 then
kono
parents:
diff changeset
510 Write_Eol;
kono
parents:
diff changeset
511 end if;
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 -- Message giving number of lines read and number of errors detected.
kono
parents:
diff changeset
514 -- This normally goes to Standard_Output. The exception is when brief
kono
parents:
diff changeset
515 -- mode is not set, verbose mode (or full list mode) is set, and
kono
parents:
diff changeset
516 -- there are errors. In this case we send the message to standard
kono
parents:
diff changeset
517 -- error to make sure that *something* appears on standard error in
kono
parents:
diff changeset
518 -- an error situation.
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 -- Historical note: Formerly, only the "# errors" suffix was sent
kono
parents:
diff changeset
521 -- to stderr, whereas "# lines:" appeared on stdout. This caused
kono
parents:
diff changeset
522 -- some problems on now-obsolete ports, but there seems to be no
kono
parents:
diff changeset
523 -- reason to revert this page since it would be incompatible.
kono
parents:
diff changeset
524
kono
parents:
diff changeset
525 if Total_Errors_Detected + Warnings_Detected /= 0
kono
parents:
diff changeset
526 and then not Brief_Output
kono
parents:
diff changeset
527 and then (Verbose_Mode or Full_List)
kono
parents:
diff changeset
528 then
kono
parents:
diff changeset
529 Set_Standard_Error;
kono
parents:
diff changeset
530 end if;
kono
parents:
diff changeset
531
kono
parents:
diff changeset
532 -- Message giving total number of lines
kono
parents:
diff changeset
533
kono
parents:
diff changeset
534 Write_Str (" ");
kono
parents:
diff changeset
535 Write_Int (Num_Source_Lines (Main_Source_File));
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 if Num_Source_Lines (Main_Source_File) = 1 then
kono
parents:
diff changeset
538 Write_Str (" line: ");
kono
parents:
diff changeset
539 else
kono
parents:
diff changeset
540 Write_Str (" lines: ");
kono
parents:
diff changeset
541 end if;
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 if Total_Errors_Detected = 0 then
kono
parents:
diff changeset
544 Write_Str ("No errors");
kono
parents:
diff changeset
545
kono
parents:
diff changeset
546 elsif Total_Errors_Detected = 1 then
kono
parents:
diff changeset
547 Write_Str ("1 error");
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 else
kono
parents:
diff changeset
550 Write_Int (Total_Errors_Detected);
kono
parents:
diff changeset
551 Write_Str (" errors");
kono
parents:
diff changeset
552 end if;
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 if Warnings_Detected - Warning_Info_Messages /= 0 then
kono
parents:
diff changeset
555 Write_Str (", ");
kono
parents:
diff changeset
556 Write_Int (Warnings_Detected - Warning_Info_Messages);
kono
parents:
diff changeset
557 Write_Str (" warning");
kono
parents:
diff changeset
558
kono
parents:
diff changeset
559 if Warnings_Detected - Warning_Info_Messages /= 1 then
kono
parents:
diff changeset
560 Write_Char ('s');
kono
parents:
diff changeset
561 end if;
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 if Warning_Mode = Treat_As_Error then
kono
parents:
diff changeset
564 Write_Str (" (treated as error");
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 if Warnings_Detected - Warning_Info_Messages /= 1 then
kono
parents:
diff changeset
567 Write_Char ('s');
kono
parents:
diff changeset
568 end if;
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 Write_Char (')');
kono
parents:
diff changeset
571 end if;
kono
parents:
diff changeset
572 end if;
kono
parents:
diff changeset
573
kono
parents:
diff changeset
574 Write_Eol;
kono
parents:
diff changeset
575 Set_Standard_Output;
kono
parents:
diff changeset
576 end if;
kono
parents:
diff changeset
577
kono
parents:
diff changeset
578 if Maximum_Messages /= 0 then
kono
parents:
diff changeset
579 if Warnings_Detected >= Maximum_Messages then
kono
parents:
diff changeset
580 Set_Standard_Error;
kono
parents:
diff changeset
581 Write_Line ("maximum number of warnings detected");
kono
parents:
diff changeset
582 Warning_Mode := Suppress;
kono
parents:
diff changeset
583 end if;
kono
parents:
diff changeset
584
kono
parents:
diff changeset
585 if Total_Errors_Detected >= Maximum_Messages then
kono
parents:
diff changeset
586 Set_Standard_Error;
kono
parents:
diff changeset
587 Write_Line ("fatal error: maximum errors reached");
kono
parents:
diff changeset
588 Set_Standard_Output;
kono
parents:
diff changeset
589 end if;
kono
parents:
diff changeset
590 end if;
kono
parents:
diff changeset
591
kono
parents:
diff changeset
592 -- Even though Warning_Info_Messages are a subclass of warnings, they
kono
parents:
diff changeset
593 -- must not be treated as errors when -gnatwe is in effect.
kono
parents:
diff changeset
594
kono
parents:
diff changeset
595 if Warning_Mode = Treat_As_Error then
kono
parents:
diff changeset
596 Total_Errors_Detected :=
kono
parents:
diff changeset
597 Total_Errors_Detected + Warnings_Detected - Warning_Info_Messages;
kono
parents:
diff changeset
598 Warnings_Detected := Warning_Info_Messages;
kono
parents:
diff changeset
599 end if;
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 -- Prevent displaying the same messages again in the future
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 First_Error_Msg := No_Error_Msg;
kono
parents:
diff changeset
604 end Finalize;
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 ----------------
kono
parents:
diff changeset
607 -- Initialize --
kono
parents:
diff changeset
608 ----------------
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 procedure Initialize is
kono
parents:
diff changeset
611 begin
kono
parents:
diff changeset
612 Errors.Init;
kono
parents:
diff changeset
613 First_Error_Msg := No_Error_Msg;
kono
parents:
diff changeset
614 Last_Error_Msg := No_Error_Msg;
kono
parents:
diff changeset
615 Serious_Errors_Detected := 0;
kono
parents:
diff changeset
616 Total_Errors_Detected := 0;
kono
parents:
diff changeset
617 Warnings_Detected := 0;
kono
parents:
diff changeset
618 Warning_Info_Messages := 0;
kono
parents:
diff changeset
619 Report_Info_Messages := 0;
kono
parents:
diff changeset
620 Cur_Msg := No_Error_Msg;
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 -- Initialize warnings table, if all warnings are suppressed, supply
kono
parents:
diff changeset
623 -- an initial dummy entry covering all possible source locations.
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 Warnings.Init;
kono
parents:
diff changeset
626
kono
parents:
diff changeset
627 if Warning_Mode = Suppress then
kono
parents:
diff changeset
628 Warnings.Append
kono
parents:
diff changeset
629 (New_Val =>
kono
parents:
diff changeset
630 (Start => Source_Ptr'First,
kono
parents:
diff changeset
631 Stop => Source_Ptr'Last,
kono
parents:
diff changeset
632 Reason => Null_String_Id));
kono
parents:
diff changeset
633 end if;
kono
parents:
diff changeset
634 end Initialize;
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 ------------------------
kono
parents:
diff changeset
637 -- Output_Source_Line --
kono
parents:
diff changeset
638 ------------------------
kono
parents:
diff changeset
639
kono
parents:
diff changeset
640 procedure Output_Source_Line
kono
parents:
diff changeset
641 (L : Physical_Line_Number;
kono
parents:
diff changeset
642 Sfile : Source_File_Index;
kono
parents:
diff changeset
643 Errs : Boolean;
kono
parents:
diff changeset
644 Source_Type : String)
kono
parents:
diff changeset
645 is
kono
parents:
diff changeset
646 S : Source_Ptr;
kono
parents:
diff changeset
647 C : Character;
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 Line_Number_Output : Boolean := False;
kono
parents:
diff changeset
650 -- Set True once line number is output
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 begin
kono
parents:
diff changeset
653 if Sfile /= Current_Error_Source_File then
kono
parents:
diff changeset
654 Write_Str ("==============Error messages for ");
kono
parents:
diff changeset
655 Write_Str (Source_Type);
kono
parents:
diff changeset
656 Write_Str (" file: ");
kono
parents:
diff changeset
657 Write_Name (Full_File_Name (Sfile));
kono
parents:
diff changeset
658 Write_Eol;
kono
parents:
diff changeset
659 Current_Error_Source_File := Sfile;
kono
parents:
diff changeset
660 end if;
kono
parents:
diff changeset
661
kono
parents:
diff changeset
662 if Errs then
kono
parents:
diff changeset
663 Output_Line_Number (Physical_To_Logical (L, Sfile));
kono
parents:
diff changeset
664 Line_Number_Output := True;
kono
parents:
diff changeset
665 end if;
kono
parents:
diff changeset
666
kono
parents:
diff changeset
667 S := Line_Start (L, Sfile);
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 loop
kono
parents:
diff changeset
670 C := Source_Text (Sfile) (S);
kono
parents:
diff changeset
671 exit when C = ASCII.LF or else C = ASCII.CR or else C = EOF;
kono
parents:
diff changeset
672
kono
parents:
diff changeset
673 if Errs then
kono
parents:
diff changeset
674 Write_Char (C);
kono
parents:
diff changeset
675 end if;
kono
parents:
diff changeset
676
kono
parents:
diff changeset
677 S := S + 1;
kono
parents:
diff changeset
678 end loop;
kono
parents:
diff changeset
679
kono
parents:
diff changeset
680 if Line_Number_Output then
kono
parents:
diff changeset
681 Write_Eol;
kono
parents:
diff changeset
682 end if;
kono
parents:
diff changeset
683 end Output_Source_Line;
kono
parents:
diff changeset
684
kono
parents:
diff changeset
685 -----------------------
kono
parents:
diff changeset
686 -- Set_Ignore_Errors --
kono
parents:
diff changeset
687 -----------------------
kono
parents:
diff changeset
688
kono
parents:
diff changeset
689 procedure Set_Ignore_Errors (To : Boolean) is
kono
parents:
diff changeset
690 begin
kono
parents:
diff changeset
691 Errors_Must_Be_Ignored := To;
kono
parents:
diff changeset
692 end Set_Ignore_Errors;
kono
parents:
diff changeset
693
kono
parents:
diff changeset
694 ------------------------------
kono
parents:
diff changeset
695 -- Set_Msg_Insertion_Column --
kono
parents:
diff changeset
696 ------------------------------
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 procedure Set_Msg_Insertion_Column is
kono
parents:
diff changeset
699 begin
kono
parents:
diff changeset
700 if RM_Column_Check then
kono
parents:
diff changeset
701 Set_Msg_Str (" in column ");
kono
parents:
diff changeset
702 Set_Msg_Int (Int (Error_Msg_Col) + 1);
kono
parents:
diff changeset
703 end if;
kono
parents:
diff changeset
704 end Set_Msg_Insertion_Column;
kono
parents:
diff changeset
705
kono
parents:
diff changeset
706 ------------------
kono
parents:
diff changeset
707 -- Set_Msg_Text --
kono
parents:
diff changeset
708 ------------------
kono
parents:
diff changeset
709
kono
parents:
diff changeset
710 procedure Set_Msg_Text (Text : String; Flag : Source_Ptr) is
kono
parents:
diff changeset
711 C : Character; -- Current character
kono
parents:
diff changeset
712 P : Natural; -- Current index;
kono
parents:
diff changeset
713
kono
parents:
diff changeset
714 begin
kono
parents:
diff changeset
715 Manual_Quote_Mode := False;
kono
parents:
diff changeset
716 Msglen := 0;
kono
parents:
diff changeset
717 Flag_Source := Get_Source_File_Index (Flag);
kono
parents:
diff changeset
718 P := Text'First;
kono
parents:
diff changeset
719
kono
parents:
diff changeset
720 while P <= Text'Last loop
kono
parents:
diff changeset
721 C := Text (P);
kono
parents:
diff changeset
722 P := P + 1;
kono
parents:
diff changeset
723
kono
parents:
diff changeset
724 -- Check for insertion character
kono
parents:
diff changeset
725
kono
parents:
diff changeset
726 if C = '%' then
kono
parents:
diff changeset
727 if P <= Text'Last and then Text (P) = '%' then
kono
parents:
diff changeset
728 P := P + 1;
kono
parents:
diff changeset
729 Set_Msg_Insertion_Name_Literal;
kono
parents:
diff changeset
730 else
kono
parents:
diff changeset
731 Set_Msg_Insertion_Name;
kono
parents:
diff changeset
732 end if;
kono
parents:
diff changeset
733
kono
parents:
diff changeset
734 elsif C = '$' then
kono
parents:
diff changeset
735
kono
parents:
diff changeset
736 -- '$' is ignored
kono
parents:
diff changeset
737
kono
parents:
diff changeset
738 null;
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 elsif C = '{' then
kono
parents:
diff changeset
741 Set_Msg_Insertion_File_Name;
kono
parents:
diff changeset
742
kono
parents:
diff changeset
743 elsif C = '}' then
kono
parents:
diff changeset
744
kono
parents:
diff changeset
745 -- '}' is ignored
kono
parents:
diff changeset
746
kono
parents:
diff changeset
747 null;
kono
parents:
diff changeset
748
kono
parents:
diff changeset
749 elsif C = '*' then
kono
parents:
diff changeset
750 Set_Msg_Insertion_Reserved_Name;
kono
parents:
diff changeset
751
kono
parents:
diff changeset
752 elsif C = '&' then
kono
parents:
diff changeset
753
kono
parents:
diff changeset
754 -- '&' is ignored
kono
parents:
diff changeset
755
kono
parents:
diff changeset
756 null;
kono
parents:
diff changeset
757
kono
parents:
diff changeset
758 elsif C = '#' then
kono
parents:
diff changeset
759 Set_Msg_Insertion_Line_Number (Error_Msg_Sloc, Flag);
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 elsif C = '\' then
kono
parents:
diff changeset
762 Continuation := True;
kono
parents:
diff changeset
763
kono
parents:
diff changeset
764 elsif C = '@' then
kono
parents:
diff changeset
765 Set_Msg_Insertion_Column;
kono
parents:
diff changeset
766
kono
parents:
diff changeset
767 elsif C = '^' then
kono
parents:
diff changeset
768 Set_Msg_Insertion_Uint;
kono
parents:
diff changeset
769
kono
parents:
diff changeset
770 elsif C = '`' then
kono
parents:
diff changeset
771 Manual_Quote_Mode := not Manual_Quote_Mode;
kono
parents:
diff changeset
772 Set_Msg_Char ('"');
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774 elsif C = '!' then
kono
parents:
diff changeset
775 null;
kono
parents:
diff changeset
776
kono
parents:
diff changeset
777 elsif C = '?' then
kono
parents:
diff changeset
778 null;
kono
parents:
diff changeset
779
kono
parents:
diff changeset
780 elsif C = '<' then
kono
parents:
diff changeset
781 null;
kono
parents:
diff changeset
782
kono
parents:
diff changeset
783 elsif C = '|' then
kono
parents:
diff changeset
784 null;
kono
parents:
diff changeset
785
kono
parents:
diff changeset
786 elsif C = ''' then
kono
parents:
diff changeset
787 Set_Msg_Char (Text (P));
kono
parents:
diff changeset
788 P := P + 1;
kono
parents:
diff changeset
789
kono
parents:
diff changeset
790 -- Upper case letter (start of reserved word if 2 or more)
kono
parents:
diff changeset
791
kono
parents:
diff changeset
792 elsif C in 'A' .. 'Z'
kono
parents:
diff changeset
793 and then P <= Text'Last
kono
parents:
diff changeset
794 and then Text (P) in 'A' .. 'Z'
kono
parents:
diff changeset
795 then
kono
parents:
diff changeset
796 P := P - 1;
kono
parents:
diff changeset
797 Set_Msg_Insertion_Reserved_Word (Text, P);
kono
parents:
diff changeset
798
kono
parents:
diff changeset
799 elsif C = '~' then
kono
parents:
diff changeset
800 Set_Msg_Str (Error_Msg_String (1 .. Error_Msg_Strlen));
kono
parents:
diff changeset
801
kono
parents:
diff changeset
802 -- Normal character with no special treatment
kono
parents:
diff changeset
803
kono
parents:
diff changeset
804 else
kono
parents:
diff changeset
805 Set_Msg_Char (C);
kono
parents:
diff changeset
806 end if;
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 end loop;
kono
parents:
diff changeset
809 end Set_Msg_Text;
kono
parents:
diff changeset
810
kono
parents:
diff changeset
811 end Errutil;