Branch data Line data Source code
1 : : /* do not edit automatically generated by mc from M2Error. */
2 : : /* M2Error.mod error reporting interface.
3 : :
4 : : Copyright (C) 2001-2025 Free Software Foundation, Inc.
5 : : Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
6 : :
7 : : This file is part of GNU Modula-2.
8 : :
9 : : GNU Modula-2 is free software; you can redistribute it and/or modify
10 : : it under the terms of the GNU General Public License as published by
11 : : the Free Software Foundation; either version 3, or (at your option)
12 : : any later version.
13 : :
14 : : GNU Modula-2 is distributed in the hope that it will be useful, but
15 : : WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 : : General Public License for more details.
18 : :
19 : : You should have received a copy of the GNU General Public License
20 : : along with GNU Modula-2; see the file COPYING3. If not see
21 : : <http://www.gnu.org/licenses/>. */
22 : :
23 : : #define INCLUDE_MEMORY
24 : : #include "config.h"
25 : : #include "system.h"
26 : : #include "gcc-consolidation.h"
27 : :
28 : : #include <stdbool.h>
29 : : # if !defined (PROC_D)
30 : : # define PROC_D
31 : : typedef void (*PROC_t) (void);
32 : : typedef struct { PROC_t proc; } PROC;
33 : : # endif
34 : :
35 : : # if !defined (TRUE)
36 : : # define TRUE (1==1)
37 : : # endif
38 : :
39 : : # if !defined (FALSE)
40 : : # define FALSE (1==0)
41 : : # endif
42 : :
43 : : # include "GStorage.h"
44 : : # include "Gmcrts.h"
45 : : #if defined(__cplusplus)
46 : : # undef NULL
47 : : # define NULL 0
48 : : #endif
49 : : #define _M2Error_C
50 : :
51 : : #include "GM2Error.h"
52 : : # include "GNameKey.h"
53 : : # include "GDynamicStrings.h"
54 : : # include "GFIO.h"
55 : : # include "GStrLib.h"
56 : : # include "GFormatStrings.h"
57 : : # include "GM2LexBuf.h"
58 : : # include "GStorage.h"
59 : : # include "GM2Printf.h"
60 : : # include "GM2Options.h"
61 : : # include "GM2RTS.h"
62 : : # include "GSYSTEM.h"
63 : : # include "GM2Emit.h"
64 : : # include "GM2StackAddress.h"
65 : : # include "GIndexing.h"
66 : : # include "GM2Debug.h"
67 : : # include "GM2Pass.h"
68 : : # include "GSymbolTable.h"
69 : : # include "GM2ColorString.h"
70 : :
71 : : # define Debugging true
72 : : # define DebugTrace false
73 : : # define DebugError false
74 : : typedef struct M2Error__T1_r M2Error__T1;
75 : :
76 : : typedef struct M2Error__T2_r M2Error__T2;
77 : :
78 : : typedef enum {M2Error_noscope, M2Error_definition, M2Error_implementation, M2Error_program, M2Error_module, M2Error_procedure} M2Error_KindScope;
79 : :
80 : : typedef M2Error__T1 *M2Error_Error__opaque;
81 : :
82 : : typedef M2Error__T2 *M2Error_ErrorScope__opaque;
83 : :
84 : : struct M2Error__T1_r {
85 : : M2Error_Error__opaque parent;
86 : : M2Error_Error__opaque child;
87 : : M2Error_Error__opaque next;
88 : : bool note;
89 : : bool fatal;
90 : : DynamicStrings_String s;
91 : : unsigned int token;
92 : : bool color;
93 : : M2Error_ErrorScope__opaque scope;
94 : : };
95 : :
96 : : struct M2Error__T2_r {
97 : : M2Error_KindScope scopeKind;
98 : : NameKey_Name scopeName;
99 : : unsigned int symbol;
100 : : };
101 : :
102 : : static M2Error_Error__opaque head;
103 : : static bool InInternal;
104 : : static M2Error_ErrorScope__opaque lastScope;
105 : : static unsigned int scopeIndex;
106 : : static Indexing_Index scopeArray;
107 : : static M2Error_ErrorScope__opaque currentScope;
108 : : static M2StackAddress_StackOfAddress scopeStack;
109 : :
110 : : /*
111 : : InternalError - displays an internal error message together with the compiler source
112 : : file and line number.
113 : : This function is not buffered and is used when the compiler is about
114 : : to give up.
115 : : */
116 : :
117 : : extern "C" void M2Error_InternalError (const char *message_, unsigned int _message_high) __attribute__ ((noreturn));
118 : :
119 : : /*
120 : : WriteFormat0 - displays the source module and line together
121 : : with the encapsulated format string.
122 : : Used for simple error messages tied to the current token.
123 : : */
124 : :
125 : : extern "C" void M2Error_WriteFormat0 (const char *a_, unsigned int _a_high);
126 : :
127 : : /*
128 : : WriteFormat1 - displays the source module and line together
129 : : with the encapsulated format string.
130 : : Used for simple error messages tied to the current token.
131 : : */
132 : :
133 : : extern "C" void M2Error_WriteFormat1 (const char *a_, unsigned int _a_high, const unsigned char *w_, unsigned int _w_high);
134 : :
135 : : /*
136 : : WriteFormat2 - displays the module and line together with the encapsulated
137 : : format strings.
138 : : Used for simple error messages tied to the current token.
139 : : */
140 : :
141 : : extern "C" void M2Error_WriteFormat2 (const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high);
142 : :
143 : : /*
144 : : WriteFormat3 - displays the module and line together with the encapsulated
145 : : format strings.
146 : : Used for simple error messages tied to the current token.
147 : : */
148 : :
149 : : extern "C" void M2Error_WriteFormat3 (const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high, const unsigned char *w3_, unsigned int _w3_high);
150 : :
151 : : /*
152 : : NewError - creates and returns a new error handle.
153 : : */
154 : :
155 : : extern "C" M2Error_Error M2Error_NewError (unsigned int AtTokenNo);
156 : :
157 : : /*
158 : : NewWarning - creates and returns a new error handle suitable for a warning.
159 : : A warning will not stop compilation.
160 : : */
161 : :
162 : : extern "C" M2Error_Error M2Error_NewWarning (unsigned int AtTokenNo);
163 : :
164 : : /*
165 : : NewNote - creates and returns a new error handle suitable for a note.
166 : : A note will not stop compilation.
167 : : */
168 : :
169 : : extern "C" M2Error_Error M2Error_NewNote (unsigned int AtTokenNo);
170 : :
171 : : /*
172 : : ChainError - creates and returns a new error handle, this new error
173 : : is associated with, e, and is chained onto the end of, e.
174 : : If, e, is NIL then the result to NewError is returned.
175 : : */
176 : :
177 : : extern "C" M2Error_Error M2Error_ChainError (unsigned int AtTokenNo, M2Error_Error e);
178 : :
179 : : /*
180 : : MoveError - repositions an error, e, to token, AtTokenNo, and returns, e.
181 : : */
182 : :
183 : : extern "C" M2Error_Error M2Error_MoveError (M2Error_Error e, unsigned int AtTokenNo);
184 : :
185 : : /*
186 : : SetColor - informs the error module that this error will have had colors
187 : : assigned to it. If an error is issued without colors assigned
188 : : then the default colors will be assigned to the legacy error
189 : : messages.
190 : : */
191 : :
192 : : extern "C" M2Error_Error M2Error_SetColor (M2Error_Error e);
193 : : extern "C" void M2Error_ErrorFormat0 (M2Error_Error e, const char *a_, unsigned int _a_high);
194 : : extern "C" void M2Error_ErrorFormat1 (M2Error_Error e, const char *a_, unsigned int _a_high, const unsigned char *w_, unsigned int _w_high);
195 : : extern "C" void M2Error_ErrorFormat2 (M2Error_Error e, const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high);
196 : : extern "C" void M2Error_ErrorFormat3 (M2Error_Error e, const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high, const unsigned char *w3_, unsigned int _w3_high);
197 : : extern "C" void M2Error_ErrorString (M2Error_Error e, DynamicStrings_String str);
198 : :
199 : : /*
200 : : ErrorStringAt - given an error string, s, it places this
201 : : string at token position, tok.
202 : : The string is consumed.
203 : : */
204 : :
205 : : extern "C" void M2Error_ErrorStringAt (DynamicStrings_String s, unsigned int tok);
206 : :
207 : : /*
208 : : ErrorStringAt2 - given an error string, s, it places this
209 : : string at token positions, tok1 and tok2, respectively.
210 : : The string is consumed.
211 : : */
212 : :
213 : : extern "C" void M2Error_ErrorStringAt2 (DynamicStrings_String s, unsigned int tok1, unsigned int tok2);
214 : :
215 : : /*
216 : : ErrorStringsAt2 - given error strings, s1, and, s2, it places these
217 : : strings at token positions, tok1 and tok2, respectively.
218 : : Both strings are consumed.
219 : : */
220 : :
221 : : extern "C" void M2Error_ErrorStringsAt2 (DynamicStrings_String s1, DynamicStrings_String s2, unsigned int tok1, unsigned int tok2);
222 : :
223 : : /*
224 : : WarnStringAt - given an error string, s, it places this
225 : : string at token position, tok.
226 : : The string is consumed.
227 : : */
228 : :
229 : : extern "C" void M2Error_WarnStringAt (DynamicStrings_String s, unsigned int tok);
230 : :
231 : : /*
232 : : WarnStringAt2 - given an warning string, s, it places this
233 : : string at token positions, tok1 and tok2, respectively.
234 : : The string is consumed.
235 : : */
236 : :
237 : : extern "C" void M2Error_WarnStringAt2 (DynamicStrings_String s, unsigned int tok1, unsigned int tok2);
238 : :
239 : : /*
240 : : WarnStringsAt2 - given warning strings, s1, and, s2, it places these
241 : : strings at token positions, tok1 and tok2, respectively.
242 : : Both strings are consumed.
243 : : */
244 : :
245 : : extern "C" void M2Error_WarnStringsAt2 (DynamicStrings_String s1, DynamicStrings_String s2, unsigned int tok1, unsigned int tok2);
246 : :
247 : : /*
248 : : WarnFormat0 - displays the source module and line together
249 : : with the encapsulated format string.
250 : : Used for simple warning messages tied to the current token.
251 : : */
252 : :
253 : : extern "C" void M2Error_WarnFormat0 (const char *a_, unsigned int _a_high);
254 : :
255 : : /*
256 : : WarnFormat1 - displays the source module and line together
257 : : with the encapsulated format string.
258 : : Used for simple warning messages tied to the current token.
259 : : */
260 : :
261 : : extern "C" void M2Error_WarnFormat1 (const char *a_, unsigned int _a_high, const unsigned char *w_, unsigned int _w_high);
262 : :
263 : : /*
264 : : FlushErrors - switches the output channel to the error channel
265 : : and then writes out all errors.
266 : : */
267 : :
268 : : extern "C" void M2Error_FlushErrors (void);
269 : :
270 : : /*
271 : : FlushWarnings - switches the output channel to the error channel
272 : : and then writes out all warnings.
273 : : If an error is present the compilation is terminated,
274 : : if warnings only were emitted then compilation will
275 : : continue.
276 : : */
277 : :
278 : : extern "C" void M2Error_FlushWarnings (void);
279 : :
280 : : /*
281 : : ErrorAbort0 - aborts compiling, it flushes all warnings and errors before aborting.
282 : : */
283 : :
284 : : extern "C" void M2Error_ErrorAbort0 (const char *a_, unsigned int _a_high) __attribute__ ((noreturn));
285 : :
286 : : /*
287 : : AnnounceScope - return the error string s with a scope description prepended
288 : : assuming that scope has changed.
289 : : */
290 : :
291 : : extern "C" DynamicStrings_String M2Error_AnnounceScope (M2Error_Error e, DynamicStrings_String message);
292 : :
293 : : /*
294 : : EnterImplementationScope - signifies to the error routines that the front end
295 : : has started to compile implementation module scopeName.
296 : : */
297 : :
298 : : extern "C" void M2Error_EnterImplementationScope (NameKey_Name scopename);
299 : :
300 : : /*
301 : : EnterProgramScope - signifies to the error routines that the front end
302 : : has started to compile program module scopeName.
303 : : */
304 : :
305 : : extern "C" void M2Error_EnterProgramScope (NameKey_Name scopename);
306 : :
307 : : /*
308 : : EnterModuleScope - signifies to the error routines that the front end
309 : : has started to compile an inner module scopeName.
310 : : */
311 : :
312 : : extern "C" void M2Error_EnterModuleScope (NameKey_Name scopename);
313 : :
314 : : /*
315 : : EnterDefinitionScope - signifies to the error routines that the front end
316 : : has started to compile definition module scopeName.
317 : : */
318 : :
319 : : extern "C" void M2Error_EnterDefinitionScope (NameKey_Name scopename);
320 : :
321 : : /*
322 : : EnterProcedureScope - signifies to the error routines that the front end
323 : : has started to compile definition module scopeName.
324 : : */
325 : :
326 : : extern "C" void M2Error_EnterProcedureScope (NameKey_Name scopename);
327 : :
328 : : /*
329 : : DepthScope - returns the depth of the scope stack.
330 : : */
331 : :
332 : : extern "C" unsigned int M2Error_DepthScope (void);
333 : :
334 : : /*
335 : : GetAnnounceScope - return message with the error scope attached to message.
336 : : filename and message are treated as read only by this
337 : : procedure function.
338 : : */
339 : :
340 : : extern "C" DynamicStrings_String M2Error_GetAnnounceScope (DynamicStrings_String filename, DynamicStrings_String message);
341 : :
342 : : /*
343 : : DefaultProgramModule - sets up an unnamed program scope before the Ident is seen.
344 : : */
345 : :
346 : : extern "C" void M2Error_DefaultProgramModule (void);
347 : :
348 : : /*
349 : : DefaultImplementationModule - sets up an unnamed implementation
350 : : scope before the Ident is seen.
351 : : */
352 : :
353 : : extern "C" void M2Error_DefaultImplementationModule (void);
354 : :
355 : : /*
356 : : DefaultDefinitionModule - sets up an unnamed definition
357 : : scope before the Ident is seen.
358 : : */
359 : :
360 : : extern "C" void M2Error_DefaultDefinitionModule (void);
361 : :
362 : : /*
363 : : DefaultInnerModule - sets up an unnamed inner
364 : : scope before the Ident is seen.
365 : : */
366 : :
367 : : extern "C" void M2Error_DefaultInnerModule (void);
368 : :
369 : : /*
370 : : DefaultProcedure - sets up an unnamed procedure
371 : : scope before the Ident is seen.
372 : : */
373 : :
374 : : extern "C" void M2Error_DefaultProcedure (void);
375 : :
376 : : /*
377 : : EnterErrorScope - pushes the currentScope and sets currentScope to scope.
378 : : */
379 : :
380 : : extern "C" void M2Error_EnterErrorScope (M2Error_ErrorScope scope);
381 : :
382 : : /*
383 : : LeaveErrorScope - leave the current scope and pop into the previous one.
384 : : */
385 : :
386 : : extern "C" void M2Error_LeaveErrorScope (void);
387 : :
388 : : /*
389 : : GetCurrentErrorScope - returns currentScope.
390 : : */
391 : :
392 : : extern "C" M2Error_ErrorScope M2Error_GetCurrentErrorScope (void);
393 : :
394 : : /*
395 : : ResetErrorScope - should be called at the start of each pass to
396 : : reset the error scope index.
397 : : */
398 : :
399 : : extern "C" void M2Error_ResetErrorScope (void);
400 : :
401 : : /*
402 : : Cast - casts a := b
403 : : */
404 : :
405 : : static void Cast (unsigned char *a, unsigned int _a_high, const unsigned char *b_, unsigned int _b_high);
406 : : static bool TranslateNameToCharStar (char *a, unsigned int _a_high, unsigned int n);
407 : :
408 : : /*
409 : : DoFormat1 -
410 : : */
411 : :
412 : : static DynamicStrings_String DoFormat1 (const char *a_, unsigned int _a_high, const unsigned char *w_, unsigned int _w_high);
413 : :
414 : : /*
415 : : DoFormat2 -
416 : : */
417 : :
418 : : static DynamicStrings_String DoFormat2 (const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high);
419 : :
420 : : /*
421 : : WriteFormat2 - displays the module and line together with the encapsulated
422 : : format strings.
423 : : Used for simple error messages tied to the current token.
424 : : */
425 : :
426 : : static DynamicStrings_String DoFormat3 (const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high, const unsigned char *w3_, unsigned int _w3_high);
427 : :
428 : : /*
429 : : Init - initializes the error list.
430 : : */
431 : :
432 : : static void Init (void);
433 : :
434 : : /*
435 : : CheckIncludes - generates a sequence of error messages which determine the relevant
436 : : included file and line number.
437 : : For example:
438 : :
439 : : gcc a.c
440 : : In file included from b.h:1,
441 : : from a.c:1:
442 : : c.h:1: parse error before `and'
443 : :
444 : : where a.c is: #include "b.h"
445 : : b.h is: #include "c.h"
446 : : c.h is: and this and that
447 : :
448 : : we attempt to follow the error messages that gcc issues.
449 : : */
450 : :
451 : : static void CheckIncludes (unsigned int token, unsigned int depth);
452 : :
453 : : /*
454 : : FlushAll - flushes all errors in list, e.
455 : : */
456 : :
457 : : static bool FlushAll (M2Error_Error__opaque e, bool FatalStatus);
458 : :
459 : : /*
460 : : IsErrorScopeNul - returns TRUE if es is NIL or it has a NulName.
461 : : */
462 : :
463 : : static bool IsErrorScopeNul (M2Error_ErrorScope__opaque es);
464 : :
465 : : /*
466 : : IsSameScope - return TRUE if a and b refer to the same scope.
467 : : */
468 : :
469 : : static bool IsSameScope (M2Error_ErrorScope__opaque a, M2Error_ErrorScope__opaque b);
470 : :
471 : : /*
472 : : newErrorScope - create an ErrorScope of kindScope and return the object.
473 : : It is also added the a dynamic array.
474 : : */
475 : :
476 : : static M2Error_ErrorScope__opaque newErrorScope (M2Error_KindScope kind);
477 : :
478 : :
479 : : /*
480 : : Cast - casts a := b
481 : : */
482 : :
483 : 48 : static void Cast (unsigned char *a, unsigned int _a_high, const unsigned char *b_, unsigned int _b_high)
484 : : {
485 : 48 : unsigned int i;
486 : 48 : unsigned char b[_b_high+1];
487 : :
488 : : /* make a local copy of each unbounded array. */
489 : 48 : memcpy (b, b_, _b_high+1);
490 : :
491 : 48 : if (_a_high == _b_high)
492 : : {
493 : 240 : for (i=0; i<=_a_high; i++)
494 : : {
495 : 192 : const_cast<unsigned char *>(a)[i] = b[i];
496 : : }
497 : : }
498 : 48 : }
499 : :
500 : 48 : static bool TranslateNameToCharStar (char *a, unsigned int _a_high, unsigned int n)
501 : : {
502 : 48 : unsigned int argno;
503 : 48 : unsigned int i;
504 : 48 : unsigned int h;
505 : :
506 : : /*
507 : : TranslateNameToString - takes a format specification string, a, and
508 : : if they consist of of %a then this is translated
509 : : into a String and %a is replaced by %s.
510 : : */
511 : 48 : argno = 1;
512 : 48 : i = 0;
513 : 48 : h = StrLib_StrLen ((const char *) a, _a_high);
514 : 1488 : while (i < h)
515 : : {
516 : 1440 : if ((a[i] == '%') && ((i+1) < h))
517 : : {
518 : 66 : if ((a[i+1] == 'a') && (argno == n))
519 : : {
520 : 48 : const_cast<char *>(a)[i+1] = 's';
521 : 48 : return true;
522 : : }
523 : 18 : argno += 1;
524 : 18 : if (argno > n)
525 : : {
526 : : /* all done */
527 : : return false;
528 : : }
529 : : }
530 : 1392 : i += 1;
531 : : }
532 : : return false;
533 : : /* static analysis guarentees a RETURN statement will be used before here. */
534 : : __builtin_unreachable ();
535 : : }
536 : :
537 : :
538 : : /*
539 : : DoFormat1 -
540 : : */
541 : :
542 : 12 : static DynamicStrings_String DoFormat1 (const char *a_, unsigned int _a_high, const unsigned char *w_, unsigned int _w_high)
543 : : {
544 : 12 : DynamicStrings_String s;
545 : 12 : NameKey_Name n;
546 : 12 : char a[_a_high+1];
547 : 12 : unsigned char w[_w_high+1];
548 : :
549 : : /* make a local copy of each unbounded array. */
550 : 12 : memcpy (a, a_, _a_high+1);
551 : 12 : memcpy (w, w_, _w_high+1);
552 : :
553 : 12 : n = NameKey_NulName;
554 : 12 : if (TranslateNameToCharStar ((char *) a, _a_high, 1))
555 : : {
556 : 12 : Cast ((unsigned char *) &n, (sizeof (n)-1), (const unsigned char *) w, _w_high);
557 : 12 : s = DynamicStrings_Mark (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (n)));
558 : 12 : s = FormatStrings_Sprintf1 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) &s, (sizeof (s)-1));
559 : : }
560 : : else
561 : : {
562 : 0 : s = FormatStrings_Sprintf1 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) w, _w_high);
563 : : }
564 : 12 : return s;
565 : : /* static analysis guarentees a RETURN statement will be used before here. */
566 : : __builtin_unreachable ();
567 : 12 : }
568 : :
569 : :
570 : : /*
571 : : DoFormat2 -
572 : : */
573 : :
574 : 18 : static DynamicStrings_String DoFormat2 (const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high)
575 : : {
576 : 18 : NameKey_Name n;
577 : 18 : DynamicStrings_String s;
578 : 18 : DynamicStrings_String s1;
579 : 18 : DynamicStrings_String s2;
580 : 18 : unsigned int b;
581 : 18 : char a[_a_high+1];
582 : 18 : unsigned char w1[_w1_high+1];
583 : 18 : unsigned char w2[_w2_high+1];
584 : :
585 : : /* make a local copy of each unbounded array. */
586 : 18 : memcpy (a, a_, _a_high+1);
587 : 18 : memcpy (w1, w1_, _w1_high+1);
588 : 18 : memcpy (w2, w2_, _w2_high+1);
589 : :
590 : 18 : b = (unsigned int) 0;
591 : 18 : n = NameKey_NulName;
592 : 18 : if (TranslateNameToCharStar ((char *) a, _a_high, 1))
593 : : {
594 : 18 : Cast ((unsigned char *) &n, (sizeof (n)-1), (const unsigned char *) w1, _w1_high);
595 : 18 : s1 = DynamicStrings_Mark (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (n)));
596 : 18 : b |= (1 << (1 ));
597 : : }
598 : 18 : if (TranslateNameToCharStar ((char *) a, _a_high, 2))
599 : : {
600 : 18 : Cast ((unsigned char *) &n, (sizeof (n)-1), (const unsigned char *) w2, _w2_high);
601 : 18 : s2 = DynamicStrings_Mark (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (n)));
602 : 18 : b |= (1 << (2 ));
603 : : }
604 : 18 : switch (b)
605 : : {
606 : 0 : case (unsigned int) 0:
607 : 0 : s = FormatStrings_Sprintf2 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) w1, _w1_high, (const unsigned char *) w2, _w2_high);
608 : 0 : break;
609 : :
610 : 0 : case (unsigned int) ((1 << (1))):
611 : 0 : s = FormatStrings_Sprintf2 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) &s1, (sizeof (s1)-1), (const unsigned char *) w2, _w2_high);
612 : 0 : break;
613 : :
614 : 0 : case (unsigned int) ((1 << (2))):
615 : 0 : s = FormatStrings_Sprintf2 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) w1, _w1_high, (const unsigned char *) &s2, (sizeof (s2)-1));
616 : 0 : break;
617 : :
618 : 18 : case (unsigned int) ((1 << (1)) | (1 << (2))):
619 : 18 : s = FormatStrings_Sprintf2 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) &s1, (sizeof (s1)-1), (const unsigned char *) &s2, (sizeof (s2)-1));
620 : 18 : break;
621 : :
622 : :
623 : 0 : default:
624 : 0 : M2RTS_HALT (-1);
625 : : __builtin_unreachable ();
626 : 18 : break;
627 : : }
628 : 18 : return s;
629 : : /* static analysis guarentees a RETURN statement will be used before here. */
630 : : __builtin_unreachable ();
631 : 18 : }
632 : :
633 : :
634 : : /*
635 : : WriteFormat2 - displays the module and line together with the encapsulated
636 : : format strings.
637 : : Used for simple error messages tied to the current token.
638 : : */
639 : :
640 : 0 : static DynamicStrings_String DoFormat3 (const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high, const unsigned char *w3_, unsigned int _w3_high)
641 : : {
642 : 0 : NameKey_Name n;
643 : 0 : DynamicStrings_String s;
644 : 0 : DynamicStrings_String s1;
645 : 0 : DynamicStrings_String s2;
646 : 0 : DynamicStrings_String s3;
647 : 0 : unsigned int b;
648 : 0 : char a[_a_high+1];
649 : 0 : unsigned char w1[_w1_high+1];
650 : 0 : unsigned char w2[_w2_high+1];
651 : 0 : unsigned char w3[_w3_high+1];
652 : :
653 : : /* make a local copy of each unbounded array. */
654 : 0 : memcpy (a, a_, _a_high+1);
655 : 0 : memcpy (w1, w1_, _w1_high+1);
656 : 0 : memcpy (w2, w2_, _w2_high+1);
657 : 0 : memcpy (w3, w3_, _w3_high+1);
658 : :
659 : 0 : b = (unsigned int) 0;
660 : 0 : n = NameKey_NulName;
661 : 0 : if (TranslateNameToCharStar ((char *) a, _a_high, 1))
662 : : {
663 : 0 : Cast ((unsigned char *) &n, (sizeof (n)-1), (const unsigned char *) w1, _w1_high);
664 : 0 : s1 = DynamicStrings_Mark (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (n)));
665 : 0 : b |= (1 << (1 ));
666 : : }
667 : 0 : if (TranslateNameToCharStar ((char *) a, _a_high, 2))
668 : : {
669 : 0 : Cast ((unsigned char *) &n, (sizeof (n)-1), (const unsigned char *) w2, _w2_high);
670 : 0 : s2 = DynamicStrings_Mark (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (n)));
671 : 0 : b |= (1 << (2 ));
672 : : }
673 : 0 : if (TranslateNameToCharStar ((char *) a, _a_high, 3))
674 : : {
675 : 0 : Cast ((unsigned char *) &n, (sizeof (n)-1), (const unsigned char *) w3, _w3_high);
676 : 0 : s3 = DynamicStrings_Mark (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (n)));
677 : 0 : b |= (1 << (3 ));
678 : : }
679 : 0 : switch (b)
680 : : {
681 : 0 : case (unsigned int) 0:
682 : 0 : s = FormatStrings_Sprintf3 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) w1, _w1_high, (const unsigned char *) w2, _w2_high, (const unsigned char *) w3, _w3_high);
683 : 0 : break;
684 : :
685 : 0 : case (unsigned int) ((1 << (1))):
686 : 0 : s = FormatStrings_Sprintf3 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) &s1, (sizeof (s1)-1), (const unsigned char *) w2, _w2_high, (const unsigned char *) w3, _w3_high);
687 : 0 : break;
688 : :
689 : 0 : case (unsigned int) ((1 << (2))):
690 : 0 : s = FormatStrings_Sprintf3 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) w1, _w1_high, (const unsigned char *) &s2, (sizeof (s2)-1), (const unsigned char *) w3, _w3_high);
691 : 0 : break;
692 : :
693 : 0 : case (unsigned int) ((1 << (1)) | (1 << (2))):
694 : 0 : s = FormatStrings_Sprintf3 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) &s1, (sizeof (s1)-1), (const unsigned char *) &s2, (sizeof (s2)-1), (const unsigned char *) w3, _w3_high);
695 : 0 : break;
696 : :
697 : 0 : case (unsigned int) ((1 << (3))):
698 : 0 : s = FormatStrings_Sprintf3 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) w1, _w1_high, (const unsigned char *) w2, _w2_high, (const unsigned char *) &s3, (sizeof (s3)-1));
699 : 0 : break;
700 : :
701 : 0 : case (unsigned int) ((1 << (1)) | (1 << (3))):
702 : 0 : s = FormatStrings_Sprintf3 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) &s1, (sizeof (s1)-1), (const unsigned char *) w2, _w2_high, (const unsigned char *) &s3, (sizeof (s3)-1));
703 : 0 : break;
704 : :
705 : 0 : case (unsigned int) ((1 << (2)) | (1 << (3))):
706 : 0 : s = FormatStrings_Sprintf3 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) w1, _w1_high, (const unsigned char *) &s2, (sizeof (s2)-1), (const unsigned char *) &s3, (sizeof (s3)-1));
707 : 0 : break;
708 : :
709 : 0 : case (unsigned int) ((1 << (1)) | (1 << (2)) | (1 << (3))):
710 : 0 : s = FormatStrings_Sprintf3 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)), (const unsigned char *) &s1, (sizeof (s1)-1), (const unsigned char *) &s2, (sizeof (s2)-1), (const unsigned char *) &s3, (sizeof (s3)-1));
711 : 0 : break;
712 : :
713 : :
714 : 0 : default:
715 : 0 : M2RTS_HALT (-1);
716 : : __builtin_unreachable ();
717 : 0 : break;
718 : : }
719 : 0 : return s;
720 : : /* static analysis guarentees a RETURN statement will be used before here. */
721 : : __builtin_unreachable ();
722 : 0 : }
723 : :
724 : :
725 : : /*
726 : : Init - initializes the error list.
727 : : */
728 : :
729 : 15392 : static void Init (void)
730 : : {
731 : 15392 : head = static_cast<M2Error_Error__opaque> (NULL);
732 : 15392 : InInternal = false;
733 : 15392 : scopeStack = M2StackAddress_InitStackAddress ();
734 : 15392 : scopeArray = Indexing_InitIndex (1);
735 : 15392 : currentScope = static_cast<M2Error_ErrorScope__opaque> (NULL);
736 : 15392 : scopeIndex = 0;
737 : 15392 : }
738 : :
739 : :
740 : : /*
741 : : CheckIncludes - generates a sequence of error messages which determine the relevant
742 : : included file and line number.
743 : : For example:
744 : :
745 : : gcc a.c
746 : : In file included from b.h:1,
747 : : from a.c:1:
748 : : c.h:1: parse error before `and'
749 : :
750 : : where a.c is: #include "b.h"
751 : : b.h is: #include "c.h"
752 : : c.h is: and this and that
753 : :
754 : : we attempt to follow the error messages that gcc issues.
755 : : */
756 : :
757 : 3611 : static void CheckIncludes (unsigned int token, unsigned int depth)
758 : : {
759 : 3611 : DynamicStrings_String included;
760 : 3611 : unsigned int lineno;
761 : :
762 : 3611 : included = M2LexBuf_FindFileNameFromToken (token, depth+1);
763 : 3611 : if (included != NULL)
764 : : {
765 : 0 : lineno = M2LexBuf_TokenToLineNo (token, depth+1);
766 : 0 : if (depth == 0)
767 : : {
768 : 0 : M2Printf_printf2 ((const char *) "In file included from %s:%d", 27, (const unsigned char *) &included, (sizeof (included)-1), (const unsigned char *) &lineno, (sizeof (lineno)-1));
769 : : }
770 : : else
771 : : {
772 : 0 : M2Printf_printf2 ((const char *) " from %s:%d", 27, (const unsigned char *) &included, (sizeof (included)-1), (const unsigned char *) &lineno, (sizeof (lineno)-1));
773 : : }
774 : 0 : if ((M2LexBuf_FindFileNameFromToken (token, depth+2)) == NULL)
775 : : {
776 : 0 : M2Printf_printf0 ((const char *) ":\\n", 3);
777 : : }
778 : : else
779 : : {
780 : 0 : M2Printf_printf0 ((const char *) ",\\n", 3);
781 : : }
782 : 0 : CheckIncludes (token, depth+1);
783 : : }
784 : 3611 : }
785 : :
786 : :
787 : : /*
788 : : FlushAll - flushes all errors in list, e.
789 : : */
790 : :
791 : 210068 : static bool FlushAll (M2Error_Error__opaque e, bool FatalStatus)
792 : : {
793 : 210068 : M2Error_Error__opaque f;
794 : 210068 : bool written;
795 : :
796 : 210068 : written = false;
797 : 210068 : if (e != NULL)
798 : : {
799 : 6778 : do {
800 : 6778 : if ((FatalStatus == e->fatal) && (e->s != NULL))
801 : : {
802 : 3611 : currentScope = e->scope;
803 : 3611 : CheckIncludes (e->token, 0);
804 : 3611 : M2Emit_EmitError (e->fatal, e->note, e->token, M2Error_AnnounceScope (static_cast<M2Error_Error> (e), e->s));
805 : 3611 : if ((e->child != NULL) && (FlushAll (e->child, FatalStatus)))
806 : : {} /* empty. */
807 : 3611 : e->s = static_cast<DynamicStrings_String> (NULL);
808 : 3611 : written = true;
809 : : }
810 : 6778 : f = e;
811 : 6778 : e = e->next;
812 : 6778 : if (! Debugging)
813 : : {
814 : : f->s = DynamicStrings_KillString (f->s);
815 : : Storage_DEALLOCATE ((void **) &f, sizeof (M2Error__T1));
816 : : }
817 : 6778 : } while (! (e == NULL));
818 : : }
819 : 210068 : return written;
820 : : /* static analysis guarentees a RETURN statement will be used before here. */
821 : : __builtin_unreachable ();
822 : : }
823 : :
824 : :
825 : : /*
826 : : IsErrorScopeNul - returns TRUE if es is NIL or it has a NulName.
827 : : */
828 : :
829 : 3597 : static bool IsErrorScopeNul (M2Error_ErrorScope__opaque es)
830 : : {
831 : 3537 : return (es == NULL) || (es->scopeName == NameKey_NulName);
832 : : /* static analysis guarentees a RETURN statement will be used before here. */
833 : : __builtin_unreachable ();
834 : : }
835 : :
836 : :
837 : : /*
838 : : IsSameScope - return TRUE if a and b refer to the same scope.
839 : : */
840 : :
841 : 3611 : static bool IsSameScope (M2Error_ErrorScope__opaque a, M2Error_ErrorScope__opaque b)
842 : : {
843 : 3611 : if (a == b)
844 : : {
845 : : return true;
846 : : }
847 : 1247 : else if ((a == NULL) || (b == NULL))
848 : : {
849 : : /* avoid dangling else. */
850 : : return false;
851 : : }
852 : : else
853 : : {
854 : : /* avoid dangling else. */
855 : : /* this does not compare the symbol field. */
856 : 72 : return (a->scopeKind == b->scopeKind) && (a->scopeName == b->scopeName);
857 : : }
858 : : /* static analysis guarentees a RETURN statement will be used before here. */
859 : : __builtin_unreachable ();
860 : : }
861 : :
862 : :
863 : : /*
864 : : newErrorScope - create an ErrorScope of kindScope and return the object.
865 : : It is also added the a dynamic array.
866 : : */
867 : :
868 : 15705549 : static M2Error_ErrorScope__opaque newErrorScope (M2Error_KindScope kind)
869 : : {
870 : 15705549 : M2Error_ErrorScope__opaque es;
871 : 15705549 : unsigned int c;
872 : :
873 : 15705549 : if (M2Pass_IsPass0 ())
874 : : {
875 : : /* avoid dangling else. */
876 : 3155835 : Storage_ALLOCATE ((void **) &es, sizeof (M2Error__T2));
877 : 3155835 : es->scopeKind = kind;
878 : 3155835 : es->scopeName = NameKey_NulName;
879 : 3155835 : es->symbol = SymbolTable_NulSym;
880 : 3155835 : Indexing_PutIndice (scopeArray, (Indexing_HighIndice (scopeArray))+1, reinterpret_cast <void *> (es));
881 : 3155835 : if (DebugError)
882 : : {
883 : : c = Indexing_HighIndice (scopeArray);
884 : : M2Printf_printf2 ((const char *) "pass 0: %d %d\\n", 17, (const unsigned char *) &c, (sizeof (c)-1), (const unsigned char *) &kind, (sizeof (kind)-1));
885 : : }
886 : : }
887 : : else
888 : : {
889 : 12549714 : scopeIndex += 1;
890 : 12549714 : es = static_cast<M2Error_ErrorScope__opaque> (Indexing_GetIndice (scopeArray, scopeIndex));
891 : 12549714 : if (DebugError)
892 : : {
893 : : /* avoid gcc warning by using compound statement even if not strictly necessary. */
894 : : if (M2Pass_IsPass1 ())
895 : : {
896 : : M2Printf_printf3 ((const char *) "pass 1: %d %d %d\\n", 21, (const unsigned char *) &scopeIndex, (sizeof (scopeIndex)-1), (const unsigned char *) &es->scopeKind, (sizeof (es->scopeKind)-1), (const unsigned char *) &kind, (sizeof (kind)-1));
897 : : }
898 : : else
899 : : {
900 : : M2Printf_printf3 ((const char *) "pass 2: %d %d %d\\n", 21, (const unsigned char *) &scopeIndex, (sizeof (scopeIndex)-1), (const unsigned char *) &es->scopeKind, (sizeof (es->scopeKind)-1), (const unsigned char *) &kind, (sizeof (kind)-1));
901 : : }
902 : : }
903 : 12549714 : M2Debug_Assert (es->scopeKind == kind);
904 : : }
905 : 15705549 : return es;
906 : : /* static analysis guarentees a RETURN statement will be used before here. */
907 : : __builtin_unreachable ();
908 : : }
909 : :
910 : :
911 : : /*
912 : : InternalError - displays an internal error message together with the compiler source
913 : : file and line number.
914 : : This function is not buffered and is used when the compiler is about
915 : : to give up.
916 : : */
917 : :
918 : 84 : extern "C" void M2Error_InternalError (const char *message_, unsigned int _message_high)
919 : : {
920 : 84 : char message[_message_high+1];
921 : :
922 : : /* make a local copy of each unbounded array. */
923 : 84 : memcpy (message, message_, _message_high+1);
924 : :
925 : 84 : if (! InInternal)
926 : : {
927 : 84 : InInternal = true;
928 : 84 : M2Error_FlushErrors ();
929 : : }
930 : 0 : M2Emit_InternalError ((const char *) message, _message_high);
931 : 0 : M2RTS_HALT (-1);
932 : : __builtin_unreachable ();
933 : 84 : }
934 : :
935 : :
936 : : /*
937 : : WriteFormat0 - displays the source module and line together
938 : : with the encapsulated format string.
939 : : Used for simple error messages tied to the current token.
940 : : */
941 : :
942 : 66 : extern "C" void M2Error_WriteFormat0 (const char *a_, unsigned int _a_high)
943 : : {
944 : 66 : M2Error_Error__opaque e;
945 : 66 : char a[_a_high+1];
946 : :
947 : : /* make a local copy of each unbounded array. */
948 : 66 : memcpy (a, a_, _a_high+1);
949 : :
950 : 66 : e = static_cast<M2Error_Error__opaque> (M2Error_NewError (M2LexBuf_GetTokenNo ()));
951 : 66 : e->s = FormatStrings_Sprintf0 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)));
952 : 66 : }
953 : :
954 : :
955 : : /*
956 : : WriteFormat1 - displays the source module and line together
957 : : with the encapsulated format string.
958 : : Used for simple error messages tied to the current token.
959 : : */
960 : :
961 : 6 : extern "C" void M2Error_WriteFormat1 (const char *a_, unsigned int _a_high, const unsigned char *w_, unsigned int _w_high)
962 : : {
963 : 6 : M2Error_Error__opaque e;
964 : 6 : char a[_a_high+1];
965 : 6 : unsigned char w[_w_high+1];
966 : :
967 : : /* make a local copy of each unbounded array. */
968 : 6 : memcpy (a, a_, _a_high+1);
969 : 6 : memcpy (w, w_, _w_high+1);
970 : :
971 : 6 : e = static_cast<M2Error_Error__opaque> (M2Error_NewError (M2LexBuf_GetTokenNo ()));
972 : 6 : e->s = DoFormat1 ((const char *) a, _a_high, (const unsigned char *) w, _w_high);
973 : 6 : }
974 : :
975 : :
976 : : /*
977 : : WriteFormat2 - displays the module and line together with the encapsulated
978 : : format strings.
979 : : Used for simple error messages tied to the current token.
980 : : */
981 : :
982 : 18 : extern "C" void M2Error_WriteFormat2 (const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high)
983 : : {
984 : 18 : M2Error_Error__opaque e;
985 : 18 : char a[_a_high+1];
986 : 18 : unsigned char w1[_w1_high+1];
987 : 18 : unsigned char w2[_w2_high+1];
988 : :
989 : : /* make a local copy of each unbounded array. */
990 : 18 : memcpy (a, a_, _a_high+1);
991 : 18 : memcpy (w1, w1_, _w1_high+1);
992 : 18 : memcpy (w2, w2_, _w2_high+1);
993 : :
994 : 18 : e = static_cast<M2Error_Error__opaque> (M2Error_NewError (M2LexBuf_GetTokenNo ()));
995 : 18 : e->s = DoFormat2 ((const char *) a, _a_high, (const unsigned char *) w1, _w1_high, (const unsigned char *) w2, _w2_high);
996 : 18 : }
997 : :
998 : :
999 : : /*
1000 : : WriteFormat3 - displays the module and line together with the encapsulated
1001 : : format strings.
1002 : : Used for simple error messages tied to the current token.
1003 : : */
1004 : :
1005 : 0 : extern "C" void M2Error_WriteFormat3 (const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high, const unsigned char *w3_, unsigned int _w3_high)
1006 : : {
1007 : 0 : M2Error_Error__opaque e;
1008 : 0 : char a[_a_high+1];
1009 : 0 : unsigned char w1[_w1_high+1];
1010 : 0 : unsigned char w2[_w2_high+1];
1011 : 0 : unsigned char w3[_w3_high+1];
1012 : :
1013 : : /* make a local copy of each unbounded array. */
1014 : 0 : memcpy (a, a_, _a_high+1);
1015 : 0 : memcpy (w1, w1_, _w1_high+1);
1016 : 0 : memcpy (w2, w2_, _w2_high+1);
1017 : 0 : memcpy (w3, w3_, _w3_high+1);
1018 : :
1019 : 0 : e = static_cast<M2Error_Error__opaque> (M2Error_NewError (M2LexBuf_GetTokenNo ()));
1020 : 0 : e->s = DoFormat3 ((const char *) a, _a_high, (const unsigned char *) w1, _w1_high, (const unsigned char *) w2, _w2_high, (const unsigned char *) w3, _w3_high);
1021 : 0 : }
1022 : :
1023 : :
1024 : : /*
1025 : : NewError - creates and returns a new error handle.
1026 : : */
1027 : :
1028 : 3323 : extern "C" M2Error_Error M2Error_NewError (unsigned int AtTokenNo)
1029 : : {
1030 : 3323 : M2Error_Error__opaque e;
1031 : 3323 : M2Error_Error__opaque f;
1032 : :
1033 : 3323 : if (AtTokenNo == M2LexBuf_UnknownTokenNo)
1034 : : {} /* empty. */
1035 : : /* This could be used as a useful debugging hook as the front end
1036 : : has forgotten the token no. */
1037 : 3323 : Storage_ALLOCATE ((void **) &e, sizeof (M2Error__T1));
1038 : 3323 : e->s = static_cast<DynamicStrings_String> (NULL);
1039 : 3323 : e->token = AtTokenNo;
1040 : 3323 : e->next = static_cast<M2Error_Error__opaque> (NULL);
1041 : 3323 : e->parent = static_cast<M2Error_Error__opaque> (NULL);
1042 : 3323 : e->child = static_cast<M2Error_Error__opaque> (NULL);
1043 : 3323 : e->note = false;
1044 : 3323 : e->fatal = true;
1045 : 3323 : e->color = false;
1046 : : /* Assert (scopeKind # noscope) ; */
1047 : 3323 : e->scope = currentScope;
1048 : 3323 : if ((head == NULL) || (head->token > AtTokenNo))
1049 : : {
1050 : 1864 : e->next = head;
1051 : 1864 : head = e;
1052 : : }
1053 : : else
1054 : : {
1055 : : f = head;
1056 : 2281 : while ((f->next != NULL) && (f->next->token < AtTokenNo))
1057 : : {
1058 : : f = f->next;
1059 : : }
1060 : 1459 : e->next = f->next;
1061 : 1459 : f->next = e;
1062 : : }
1063 : 3323 : return static_cast<M2Error_Error> (e);
1064 : : /* static analysis guarentees a RETURN statement will be used before here. */
1065 : : __builtin_unreachable ();
1066 : : }
1067 : :
1068 : :
1069 : : /*
1070 : : NewWarning - creates and returns a new error handle suitable for a warning.
1071 : : A warning will not stop compilation.
1072 : : */
1073 : :
1074 : 594 : extern "C" M2Error_Error M2Error_NewWarning (unsigned int AtTokenNo)
1075 : : {
1076 : 594 : M2Error_Error__opaque e;
1077 : :
1078 : 594 : e = static_cast<M2Error_Error__opaque> (M2Error_NewError (AtTokenNo));
1079 : 594 : e->fatal = false;
1080 : 594 : e->note = false;
1081 : 594 : return static_cast<M2Error_Error> (e);
1082 : : /* static analysis guarentees a RETURN statement will be used before here. */
1083 : : __builtin_unreachable ();
1084 : : }
1085 : :
1086 : :
1087 : : /*
1088 : : NewNote - creates and returns a new error handle suitable for a note.
1089 : : A note will not stop compilation.
1090 : : */
1091 : :
1092 : 15 : extern "C" M2Error_Error M2Error_NewNote (unsigned int AtTokenNo)
1093 : : {
1094 : 15 : M2Error_Error__opaque e;
1095 : :
1096 : 15 : e = static_cast<M2Error_Error__opaque> (M2Error_NewError (AtTokenNo));
1097 : 15 : e->fatal = false;
1098 : 15 : e->note = true;
1099 : 15 : return static_cast<M2Error_Error> (e);
1100 : : /* static analysis guarentees a RETURN statement will be used before here. */
1101 : : __builtin_unreachable ();
1102 : : }
1103 : :
1104 : :
1105 : : /*
1106 : : ChainError - creates and returns a new error handle, this new error
1107 : : is associated with, e, and is chained onto the end of, e.
1108 : : If, e, is NIL then the result to NewError is returned.
1109 : : */
1110 : :
1111 : 390 : extern "C" M2Error_Error M2Error_ChainError (unsigned int AtTokenNo, M2Error_Error e)
1112 : : {
1113 : 390 : M2Error_Error__opaque f;
1114 : :
1115 : 390 : if (e == NULL)
1116 : : {
1117 : 0 : return M2Error_NewError (AtTokenNo);
1118 : : }
1119 : : else
1120 : : {
1121 : 390 : Storage_ALLOCATE ((void **) &f, sizeof (M2Error__T1));
1122 : 390 : f->s = static_cast<DynamicStrings_String> (NULL);
1123 : 390 : f->token = AtTokenNo;
1124 : 390 : f->next = static_cast<M2Error_Error__opaque> (e)->child;
1125 : 390 : f->parent = static_cast<M2Error_Error__opaque> (e);
1126 : 390 : f->child = static_cast<M2Error_Error__opaque> (NULL);
1127 : 390 : f->fatal = static_cast<M2Error_Error__opaque> (e)->fatal;
1128 : 390 : f->scope = static_cast<M2Error_Error__opaque> (e)->scope;
1129 : 390 : static_cast<M2Error_Error__opaque> (e)->child = f;
1130 : : }
1131 : 390 : return static_cast<M2Error_Error> (f);
1132 : : /* static analysis guarentees a RETURN statement will be used before here. */
1133 : : __builtin_unreachable ();
1134 : : }
1135 : :
1136 : :
1137 : : /*
1138 : : MoveError - repositions an error, e, to token, AtTokenNo, and returns, e.
1139 : : */
1140 : :
1141 : 0 : extern "C" M2Error_Error M2Error_MoveError (M2Error_Error e, unsigned int AtTokenNo)
1142 : : {
1143 : 0 : if (e != NULL)
1144 : : {
1145 : 0 : static_cast<M2Error_Error__opaque> (e)->token = AtTokenNo;
1146 : : }
1147 : 0 : return e;
1148 : : /* static analysis guarentees a RETURN statement will be used before here. */
1149 : : __builtin_unreachable ();
1150 : : }
1151 : :
1152 : :
1153 : : /*
1154 : : SetColor - informs the error module that this error will have had colors
1155 : : assigned to it. If an error is issued without colors assigned
1156 : : then the default colors will be assigned to the legacy error
1157 : : messages.
1158 : : */
1159 : :
1160 : 3011 : extern "C" M2Error_Error M2Error_SetColor (M2Error_Error e)
1161 : : {
1162 : 3011 : static_cast<M2Error_Error__opaque> (e)->color = true;
1163 : 3011 : return e;
1164 : : /* static analysis guarentees a RETURN statement will be used before here. */
1165 : : __builtin_unreachable ();
1166 : : }
1167 : :
1168 : 36 : extern "C" void M2Error_ErrorFormat0 (M2Error_Error e, const char *a_, unsigned int _a_high)
1169 : : {
1170 : 36 : char a[_a_high+1];
1171 : :
1172 : : /* make a local copy of each unbounded array. */
1173 : 36 : memcpy (a, a_, _a_high+1);
1174 : :
1175 : : /*
1176 : : ErrorFormat routines provide a printf capability for the error handle.
1177 : : */
1178 : 36 : if (static_cast<M2Error_Error__opaque> (e)->s == NULL)
1179 : : {
1180 : 36 : static_cast<M2Error_Error__opaque> (e)->s = FormatStrings_Sprintf0 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)));
1181 : : }
1182 : : else
1183 : : {
1184 : 0 : static_cast<M2Error_Error__opaque> (e)->s = DynamicStrings_ConCat (static_cast<M2Error_Error__opaque> (e)->s, DynamicStrings_Mark (FormatStrings_Sprintf0 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)))));
1185 : : }
1186 : 36 : }
1187 : :
1188 : 6 : extern "C" void M2Error_ErrorFormat1 (M2Error_Error e, const char *a_, unsigned int _a_high, const unsigned char *w_, unsigned int _w_high)
1189 : : {
1190 : 6 : DynamicStrings_String s1;
1191 : 6 : char a[_a_high+1];
1192 : 6 : unsigned char w[_w_high+1];
1193 : :
1194 : : /* make a local copy of each unbounded array. */
1195 : 6 : memcpy (a, a_, _a_high+1);
1196 : 6 : memcpy (w, w_, _w_high+1);
1197 : :
1198 : 12 : s1 = DoFormat1 ((const char *) a, _a_high, (const unsigned char *) w, _w_high);
1199 : 6 : if (static_cast<M2Error_Error__opaque> (e)->s == NULL)
1200 : : {
1201 : 6 : static_cast<M2Error_Error__opaque> (e)->s = s1;
1202 : : }
1203 : : else
1204 : : {
1205 : 0 : static_cast<M2Error_Error__opaque> (e)->s = DynamicStrings_ConCat (static_cast<M2Error_Error__opaque> (e)->s, DynamicStrings_Mark (s1));
1206 : : }
1207 : 6 : }
1208 : :
1209 : 0 : extern "C" void M2Error_ErrorFormat2 (M2Error_Error e, const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high)
1210 : : {
1211 : 0 : DynamicStrings_String s1;
1212 : 0 : char a[_a_high+1];
1213 : 0 : unsigned char w1[_w1_high+1];
1214 : 0 : unsigned char w2[_w2_high+1];
1215 : :
1216 : : /* make a local copy of each unbounded array. */
1217 : 0 : memcpy (a, a_, _a_high+1);
1218 : 0 : memcpy (w1, w1_, _w1_high+1);
1219 : 0 : memcpy (w2, w2_, _w2_high+1);
1220 : :
1221 : 0 : s1 = DoFormat2 ((const char *) a, _a_high, (const unsigned char *) w1, _w1_high, (const unsigned char *) w2, _w2_high);
1222 : 0 : if (static_cast<M2Error_Error__opaque> (e)->s == NULL)
1223 : : {
1224 : 0 : static_cast<M2Error_Error__opaque> (e)->s = s1;
1225 : : }
1226 : : else
1227 : : {
1228 : 0 : static_cast<M2Error_Error__opaque> (e)->s = DynamicStrings_ConCat (static_cast<M2Error_Error__opaque> (e)->s, DynamicStrings_Mark (s1));
1229 : : }
1230 : 0 : }
1231 : :
1232 : 0 : extern "C" void M2Error_ErrorFormat3 (M2Error_Error e, const char *a_, unsigned int _a_high, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high, const unsigned char *w3_, unsigned int _w3_high)
1233 : : {
1234 : 0 : DynamicStrings_String s1;
1235 : 0 : char a[_a_high+1];
1236 : 0 : unsigned char w1[_w1_high+1];
1237 : 0 : unsigned char w2[_w2_high+1];
1238 : 0 : unsigned char w3[_w3_high+1];
1239 : :
1240 : : /* make a local copy of each unbounded array. */
1241 : 0 : memcpy (a, a_, _a_high+1);
1242 : 0 : memcpy (w1, w1_, _w1_high+1);
1243 : 0 : memcpy (w2, w2_, _w2_high+1);
1244 : 0 : memcpy (w3, w3_, _w3_high+1);
1245 : :
1246 : 0 : s1 = DoFormat3 ((const char *) a, _a_high, (const unsigned char *) w1, _w1_high, (const unsigned char *) w2, _w2_high, (const unsigned char *) w3, _w3_high);
1247 : 0 : if (static_cast<M2Error_Error__opaque> (e)->s == NULL)
1248 : : {
1249 : 0 : static_cast<M2Error_Error__opaque> (e)->s = s1;
1250 : : }
1251 : : else
1252 : : {
1253 : 0 : static_cast<M2Error_Error__opaque> (e)->s = DynamicStrings_ConCat (static_cast<M2Error_Error__opaque> (e)->s, DynamicStrings_Mark (s1));
1254 : : }
1255 : 0 : }
1256 : :
1257 : 3485 : extern "C" void M2Error_ErrorString (M2Error_Error e, DynamicStrings_String str)
1258 : : {
1259 : 3485 : static_cast<M2Error_Error__opaque> (e)->s = str;
1260 : 3485 : }
1261 : :
1262 : :
1263 : : /*
1264 : : ErrorStringAt - given an error string, s, it places this
1265 : : string at token position, tok.
1266 : : The string is consumed.
1267 : : */
1268 : :
1269 : 12 : extern "C" void M2Error_ErrorStringAt (DynamicStrings_String s, unsigned int tok)
1270 : : {
1271 : 12 : M2Error_Error__opaque e;
1272 : :
1273 : 12 : e = static_cast<M2Error_Error__opaque> (M2Error_NewError (tok));
1274 : 12 : M2Error_ErrorString (static_cast<M2Error_Error> (e), s);
1275 : 12 : }
1276 : :
1277 : :
1278 : : /*
1279 : : ErrorStringAt2 - given an error string, s, it places this
1280 : : string at token positions, tok1 and tok2, respectively.
1281 : : The string is consumed.
1282 : : */
1283 : :
1284 : 0 : extern "C" void M2Error_ErrorStringAt2 (DynamicStrings_String s, unsigned int tok1, unsigned int tok2)
1285 : : {
1286 : 0 : M2Error_ErrorStringsAt2 (s, s, tok1, tok2);
1287 : 0 : }
1288 : :
1289 : :
1290 : : /*
1291 : : ErrorStringsAt2 - given error strings, s1, and, s2, it places these
1292 : : strings at token positions, tok1 and tok2, respectively.
1293 : : Both strings are consumed.
1294 : : */
1295 : :
1296 : 0 : extern "C" void M2Error_ErrorStringsAt2 (DynamicStrings_String s1, DynamicStrings_String s2, unsigned int tok1, unsigned int tok2)
1297 : : {
1298 : 0 : M2Error_Error__opaque e;
1299 : :
1300 : 0 : if (s1 == s2)
1301 : : {
1302 : 0 : s2 = DynamicStrings_Dup (s1);
1303 : : }
1304 : 0 : e = static_cast<M2Error_Error__opaque> (M2Error_NewError (tok1));
1305 : 0 : M2Error_ErrorString (static_cast<M2Error_Error> (e), s1);
1306 : 0 : M2Error_ErrorString (M2Error_ChainError (tok2, static_cast<M2Error_Error> (e)), s2);
1307 : 0 : }
1308 : :
1309 : :
1310 : : /*
1311 : : WarnStringAt - given an error string, s, it places this
1312 : : string at token position, tok.
1313 : : The string is consumed.
1314 : : */
1315 : :
1316 : 0 : extern "C" void M2Error_WarnStringAt (DynamicStrings_String s, unsigned int tok)
1317 : : {
1318 : 0 : M2Error_Error__opaque e;
1319 : :
1320 : 0 : e = static_cast<M2Error_Error__opaque> (M2Error_NewWarning (tok));
1321 : 0 : M2Error_ErrorString (static_cast<M2Error_Error> (e), s);
1322 : 0 : }
1323 : :
1324 : :
1325 : : /*
1326 : : WarnStringAt2 - given an warning string, s, it places this
1327 : : string at token positions, tok1 and tok2, respectively.
1328 : : The string is consumed.
1329 : : */
1330 : :
1331 : 0 : extern "C" void M2Error_WarnStringAt2 (DynamicStrings_String s, unsigned int tok1, unsigned int tok2)
1332 : : {
1333 : 0 : M2Error_WarnStringsAt2 (s, s, tok1, tok2);
1334 : 0 : }
1335 : :
1336 : :
1337 : : /*
1338 : : WarnStringsAt2 - given warning strings, s1, and, s2, it places these
1339 : : strings at token positions, tok1 and tok2, respectively.
1340 : : Both strings are consumed.
1341 : : */
1342 : :
1343 : 0 : extern "C" void M2Error_WarnStringsAt2 (DynamicStrings_String s1, DynamicStrings_String s2, unsigned int tok1, unsigned int tok2)
1344 : : {
1345 : 0 : M2Error_Error__opaque e;
1346 : :
1347 : 0 : if (s1 == s2)
1348 : : {
1349 : 0 : s2 = DynamicStrings_Dup (s1);
1350 : : }
1351 : 0 : e = static_cast<M2Error_Error__opaque> (M2Error_NewWarning (tok1));
1352 : 0 : M2Error_ErrorString (static_cast<M2Error_Error> (e), s1);
1353 : 0 : M2Error_ErrorString (M2Error_ChainError (tok2, static_cast<M2Error_Error> (e)), s2);
1354 : 0 : }
1355 : :
1356 : :
1357 : : /*
1358 : : WarnFormat0 - displays the source module and line together
1359 : : with the encapsulated format string.
1360 : : Used for simple warning messages tied to the current token.
1361 : : */
1362 : :
1363 : 0 : extern "C" void M2Error_WarnFormat0 (const char *a_, unsigned int _a_high)
1364 : : {
1365 : 0 : M2Error_Error__opaque e;
1366 : 0 : char a[_a_high+1];
1367 : :
1368 : : /* make a local copy of each unbounded array. */
1369 : 0 : memcpy (a, a_, _a_high+1);
1370 : :
1371 : 0 : e = static_cast<M2Error_Error__opaque> (M2Error_NewWarning (M2LexBuf_GetTokenNo ()));
1372 : 0 : e->s = FormatStrings_Sprintf0 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) a, _a_high)));
1373 : 0 : }
1374 : :
1375 : :
1376 : : /*
1377 : : WarnFormat1 - displays the source module and line together
1378 : : with the encapsulated format string.
1379 : : Used for simple warning messages tied to the current token.
1380 : : */
1381 : :
1382 : 0 : extern "C" void M2Error_WarnFormat1 (const char *a_, unsigned int _a_high, const unsigned char *w_, unsigned int _w_high)
1383 : : {
1384 : 0 : M2Error_Error__opaque e;
1385 : 0 : char a[_a_high+1];
1386 : 0 : unsigned char w[_w_high+1];
1387 : :
1388 : : /* make a local copy of each unbounded array. */
1389 : 0 : memcpy (a, a_, _a_high+1);
1390 : 0 : memcpy (w, w_, _w_high+1);
1391 : :
1392 : 0 : e = static_cast<M2Error_Error__opaque> (M2Error_NewWarning (M2LexBuf_GetTokenNo ()));
1393 : 0 : e->s = DoFormat1 ((const char *) a, _a_high, (const unsigned char *) w, _w_high);
1394 : 0 : }
1395 : :
1396 : :
1397 : : /*
1398 : : FlushErrors - switches the output channel to the error channel
1399 : : and then writes out all errors.
1400 : : */
1401 : :
1402 : 104953 : extern "C" void M2Error_FlushErrors (void)
1403 : : {
1404 : 104953 : if (DebugTrace)
1405 : : {
1406 : : M2Printf_printf0 ((const char *) "\\nFlushing all errors\\n", 23);
1407 : : M2Printf_printf0 ((const char *) "===================\\n", 21);
1408 : : }
1409 : 104953 : if (FlushAll (head, true))
1410 : : {
1411 : 1304 : M2RTS_ExitOnHalt (1);
1412 : 1304 : M2RTS_HALT (-1);
1413 : : __builtin_unreachable ();
1414 : : }
1415 : 103649 : }
1416 : :
1417 : :
1418 : : /*
1419 : : FlushWarnings - switches the output channel to the error channel
1420 : : and then writes out all warnings.
1421 : : If an error is present the compilation is terminated,
1422 : : if warnings only were emitted then compilation will
1423 : : continue.
1424 : : */
1425 : :
1426 : 104713 : extern "C" void M2Error_FlushWarnings (void)
1427 : : {
1428 : 104713 : if (FlushAll (head, false))
1429 : : {} /* empty. */
1430 : 104713 : }
1431 : :
1432 : :
1433 : : /*
1434 : : ErrorAbort0 - aborts compiling, it flushes all warnings and errors before aborting.
1435 : : */
1436 : :
1437 : 18 : extern "C" void M2Error_ErrorAbort0 (const char *a_, unsigned int _a_high)
1438 : : {
1439 : 18 : char a[_a_high+1];
1440 : :
1441 : : /* make a local copy of each unbounded array. */
1442 : 18 : memcpy (a, a_, _a_high+1);
1443 : :
1444 : 18 : M2Error_FlushWarnings ();
1445 : 18 : if (! (StrLib_StrEqual ((const char *) a, _a_high, (const char *) "", 0)))
1446 : : {
1447 : 0 : M2Error_WriteFormat0 ((const char *) a, _a_high);
1448 : : }
1449 : 18 : if (! (FlushAll (head, true)))
1450 : : {
1451 : 0 : M2Error_WriteFormat0 ((const char *) "unidentified error", 18);
1452 : 0 : if (FlushAll (head, true))
1453 : : {} /* empty. */
1454 : : }
1455 : 18 : M2RTS_ExitOnHalt (1);
1456 : 18 : M2RTS_HALT (-1);
1457 : : __builtin_unreachable ();
1458 : 18 : }
1459 : :
1460 : :
1461 : : /*
1462 : : AnnounceScope - return the error string s with a scope description prepended
1463 : : assuming that scope has changed.
1464 : : */
1465 : :
1466 : 3611 : extern "C" DynamicStrings_String M2Error_AnnounceScope (M2Error_Error e, DynamicStrings_String message)
1467 : : {
1468 : 3611 : if (! (IsSameScope (lastScope, static_cast<M2Error_Error__opaque> (e)->scope)))
1469 : : {
1470 : 1247 : lastScope = static_cast<M2Error_Error__opaque> (e)->scope;
1471 : 1247 : if (IsErrorScopeNul (lastScope))
1472 : : {
1473 : 72 : return DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "no scope active: ", 17), message);
1474 : : }
1475 : : else
1476 : : {
1477 : 1175 : M2Debug_Assert ((static_cast<M2Error_Error__opaque> (e)->scope != NULL) && (static_cast<M2Error_Error__opaque> (e)->scope->scopeKind != M2Error_noscope));
1478 : : /* filename := FindFileNameFromToken (e^.token, 0) ; */
1479 : 1175 : message = M2Error_GetAnnounceScope (static_cast<DynamicStrings_String> (NULL), message);
1480 : : }
1481 : : }
1482 : : return message;
1483 : : /* static analysis guarentees a RETURN statement will be used before here. */
1484 : : __builtin_unreachable ();
1485 : : }
1486 : :
1487 : :
1488 : : /*
1489 : : EnterImplementationScope - signifies to the error routines that the front end
1490 : : has started to compile implementation module scopeName.
1491 : : */
1492 : :
1493 : 213348 : extern "C" void M2Error_EnterImplementationScope (NameKey_Name scopename)
1494 : : {
1495 : 213348 : M2Debug_Assert (currentScope != NULL);
1496 : 213348 : M2Debug_Assert (currentScope->scopeKind == M2Error_implementation);
1497 : 213348 : if (currentScope->scopeName == NameKey_NulName)
1498 : : {
1499 : 53451 : if (DebugError)
1500 : : {
1501 : : M2Printf_printf1 ((const char *) "seen implementation: %a\\n", 25, (const unsigned char *) &scopename, (sizeof (scopename)-1));
1502 : : }
1503 : 53451 : currentScope->scopeName = scopename;
1504 : : }
1505 : 213348 : }
1506 : :
1507 : :
1508 : : /*
1509 : : EnterProgramScope - signifies to the error routines that the front end
1510 : : has started to compile program module scopeName.
1511 : : */
1512 : :
1513 : 44404 : extern "C" void M2Error_EnterProgramScope (NameKey_Name scopename)
1514 : : {
1515 : 44404 : M2Debug_Assert (currentScope != NULL);
1516 : 44404 : M2Debug_Assert (currentScope->scopeKind == M2Error_program);
1517 : 44404 : if (currentScope->scopeName == NameKey_NulName)
1518 : : {
1519 : 11248 : if (DebugError)
1520 : : {
1521 : : M2Printf_printf1 ((const char *) "seen program: %a\\n", 18, (const unsigned char *) &scopename, (sizeof (scopename)-1));
1522 : : }
1523 : 11248 : currentScope->scopeName = scopename;
1524 : : }
1525 : 44404 : }
1526 : :
1527 : :
1528 : : /*
1529 : : EnterModuleScope - signifies to the error routines that the front end
1530 : : has started to compile an inner module scopeName.
1531 : : */
1532 : :
1533 : 1680 : extern "C" void M2Error_EnterModuleScope (NameKey_Name scopename)
1534 : : {
1535 : 1680 : M2Debug_Assert (currentScope != NULL);
1536 : 1680 : M2Debug_Assert (currentScope->scopeKind == M2Error_module);
1537 : 1680 : if (currentScope->scopeName == NameKey_NulName)
1538 : : {
1539 : 426 : if (DebugError)
1540 : : {
1541 : : M2Printf_printf1 ((const char *) "seen module: %a\\n", 17, (const unsigned char *) &scopename, (sizeof (scopename)-1));
1542 : : }
1543 : 426 : currentScope->scopeName = scopename;
1544 : : }
1545 : 1680 : }
1546 : :
1547 : :
1548 : : /*
1549 : : EnterDefinitionScope - signifies to the error routines that the front end
1550 : : has started to compile definition module scopeName.
1551 : : */
1552 : :
1553 : 481118 : extern "C" void M2Error_EnterDefinitionScope (NameKey_Name scopename)
1554 : : {
1555 : 481118 : M2Debug_Assert (currentScope != NULL);
1556 : 481118 : M2Debug_Assert (currentScope->scopeKind == M2Error_definition);
1557 : 481118 : if (currentScope->scopeName == NameKey_NulName)
1558 : : {
1559 : 121004 : if (DebugError)
1560 : : {
1561 : : M2Printf_printf1 ((const char *) "seen definition: %a\\n", 21, (const unsigned char *) &scopename, (sizeof (scopename)-1));
1562 : : }
1563 : 121004 : currentScope->scopeName = scopename;
1564 : : }
1565 : 481118 : }
1566 : :
1567 : :
1568 : : /*
1569 : : EnterProcedureScope - signifies to the error routines that the front end
1570 : : has started to compile definition module scopeName.
1571 : : */
1572 : :
1573 : 9796513 : extern "C" void M2Error_EnterProcedureScope (NameKey_Name scopename)
1574 : : {
1575 : 9796513 : M2Debug_Assert (currentScope != NULL);
1576 : 9796513 : M2Debug_Assert (currentScope->scopeKind == M2Error_procedure);
1577 : 9796513 : if (currentScope->scopeName == NameKey_NulName)
1578 : : {
1579 : 2958768 : if (DebugError)
1580 : : {
1581 : : M2Printf_printf1 ((const char *) "seen procedure: %a\\n", 20, (const unsigned char *) &scopename, (sizeof (scopename)-1));
1582 : : }
1583 : 2958768 : currentScope->scopeName = scopename;
1584 : : }
1585 : 9796513 : }
1586 : :
1587 : :
1588 : : /*
1589 : : DepthScope - returns the depth of the scope stack.
1590 : : */
1591 : :
1592 : 0 : extern "C" unsigned int M2Error_DepthScope (void)
1593 : : {
1594 : 0 : return M2StackAddress_NoOfItemsInStackAddress (scopeStack);
1595 : : /* static analysis guarentees a RETURN statement will be used before here. */
1596 : : __builtin_unreachable ();
1597 : : }
1598 : :
1599 : :
1600 : : /*
1601 : : GetAnnounceScope - return message with the error scope attached to message.
1602 : : filename and message are treated as read only by this
1603 : : procedure function.
1604 : : */
1605 : :
1606 : 1175 : extern "C" DynamicStrings_String M2Error_GetAnnounceScope (DynamicStrings_String filename, DynamicStrings_String message)
1607 : : {
1608 : 1175 : DynamicStrings_String pre;
1609 : 1175 : DynamicStrings_String fmt;
1610 : 1175 : DynamicStrings_String desc;
1611 : 1175 : DynamicStrings_String quoted;
1612 : :
1613 : 1175 : if (filename == NULL)
1614 : : {
1615 : 1175 : pre = DynamicStrings_InitString ((const char *) "", 0);
1616 : : }
1617 : : else
1618 : : {
1619 : 0 : pre = FormatStrings_Sprintf1 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) "%s: ", 4)), (const unsigned char *) &filename, (sizeof (filename)-1));
1620 : : }
1621 : 1175 : if (! (IsErrorScopeNul (currentScope)))
1622 : : {
1623 : 1175 : quoted = DynamicStrings_InitString ((const char *) "", 0);
1624 : 1175 : quoted = M2ColorString_quoteOpen (quoted);
1625 : 1175 : quoted = DynamicStrings_ConCat (quoted, DynamicStrings_Mark (DynamicStrings_InitStringCharStar (NameKey_KeyToCharStar (currentScope->scopeName))));
1626 : 1175 : quoted = M2ColorString_quoteClose (quoted);
1627 : : }
1628 : 1175 : if (currentScope == NULL)
1629 : : {
1630 : 0 : desc = DynamicStrings_InitString ((const char *) "no scope active", 15);
1631 : : }
1632 : : else
1633 : : {
1634 : 1175 : switch (currentScope->scopeKind)
1635 : : {
1636 : 30 : case M2Error_definition:
1637 : 30 : desc = DynamicStrings_InitString ((const char *) "In definition module", 20);
1638 : 30 : break;
1639 : :
1640 : 24 : case M2Error_implementation:
1641 : 24 : desc = DynamicStrings_InitString ((const char *) "In implementation module", 24);
1642 : 24 : break;
1643 : :
1644 : 630 : case M2Error_program:
1645 : 630 : desc = DynamicStrings_InitString ((const char *) "In program module", 17);
1646 : 630 : break;
1647 : :
1648 : 12 : case M2Error_module:
1649 : 12 : desc = DynamicStrings_InitString ((const char *) "In inner module", 15);
1650 : 12 : break;
1651 : :
1652 : 479 : case M2Error_procedure:
1653 : 479 : desc = DynamicStrings_InitString ((const char *) "In procedure", 12);
1654 : 479 : break;
1655 : :
1656 : 0 : case M2Error_noscope:
1657 : 0 : desc = DynamicStrings_InitString ((const char *) "Unknown scope", 13);
1658 : 0 : break;
1659 : :
1660 : :
1661 : 0 : default:
1662 : 0 : CaseException ("/home/worker/buildworker/tiber-lcov/build/gcc/m2/gm2-compiler/M2Error.def", 20, 1);
1663 : 0 : __builtin_unreachable ();
1664 : : }
1665 : : }
1666 : 1175 : fmt = DynamicStrings_ConCat (pre, DynamicStrings_Mark (desc));
1667 : 1175 : if (IsErrorScopeNul (currentScope))
1668 : : {
1669 : 0 : fmt = DynamicStrings_ConCat (fmt, FormatStrings_Sprintf0 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) ": ", 2))));
1670 : : }
1671 : : else
1672 : : {
1673 : 1175 : fmt = DynamicStrings_ConCat (fmt, FormatStrings_Sprintf1 (DynamicStrings_Mark (DynamicStrings_InitString ((const char *) " %s: ", 5)), (const unsigned char *) "ed, (sizeof (quoted)-1)));
1674 : : }
1675 : 1175 : return DynamicStrings_ConCat (fmt, message);
1676 : : /* static analysis guarentees a RETURN statement will be used before here. */
1677 : : __builtin_unreachable ();
1678 : : }
1679 : :
1680 : :
1681 : : /*
1682 : : DefaultProgramModule - sets up an unnamed program scope before the Ident is seen.
1683 : : */
1684 : :
1685 : 55544 : extern "C" void M2Error_DefaultProgramModule (void)
1686 : : {
1687 : 55544 : M2StackAddress_PushAddress (scopeStack, reinterpret_cast <void *> (currentScope));
1688 : 55544 : currentScope = newErrorScope (M2Error_program);
1689 : 55544 : }
1690 : :
1691 : :
1692 : : /*
1693 : : DefaultImplementationModule - sets up an unnamed implementation
1694 : : scope before the Ident is seen.
1695 : : */
1696 : :
1697 : 266745 : extern "C" void M2Error_DefaultImplementationModule (void)
1698 : : {
1699 : 266745 : M2StackAddress_PushAddress (scopeStack, reinterpret_cast <void *> (currentScope));
1700 : 266745 : currentScope = newErrorScope (M2Error_implementation);
1701 : 266745 : }
1702 : :
1703 : :
1704 : : /*
1705 : : DefaultDefinitionModule - sets up an unnamed definition
1706 : : scope before the Ident is seen.
1707 : : */
1708 : :
1709 : 601690 : extern "C" void M2Error_DefaultDefinitionModule (void)
1710 : : {
1711 : 601690 : M2StackAddress_PushAddress (scopeStack, reinterpret_cast <void *> (currentScope));
1712 : 601690 : currentScope = newErrorScope (M2Error_definition);
1713 : 601690 : }
1714 : :
1715 : :
1716 : : /*
1717 : : DefaultInnerModule - sets up an unnamed inner
1718 : : scope before the Ident is seen.
1719 : : */
1720 : :
1721 : 2100 : extern "C" void M2Error_DefaultInnerModule (void)
1722 : : {
1723 : 2100 : M2StackAddress_PushAddress (scopeStack, reinterpret_cast <void *> (currentScope));
1724 : 2100 : currentScope = newErrorScope (M2Error_module);
1725 : 2100 : }
1726 : :
1727 : :
1728 : : /*
1729 : : DefaultProcedure - sets up an unnamed procedure
1730 : : scope before the Ident is seen.
1731 : : */
1732 : :
1733 : 14779470 : extern "C" void M2Error_DefaultProcedure (void)
1734 : : {
1735 : 14779470 : M2StackAddress_PushAddress (scopeStack, reinterpret_cast <void *> (currentScope));
1736 : 14779470 : currentScope = newErrorScope (M2Error_procedure);
1737 : 14779470 : }
1738 : :
1739 : :
1740 : : /*
1741 : : EnterErrorScope - pushes the currentScope and sets currentScope to scope.
1742 : : */
1743 : :
1744 : 81438767 : extern "C" void M2Error_EnterErrorScope (M2Error_ErrorScope scope)
1745 : : {
1746 : 81438767 : M2StackAddress_PushAddress (scopeStack, reinterpret_cast <void *> (currentScope));
1747 : 81438767 : currentScope = static_cast<M2Error_ErrorScope__opaque> (scope);
1748 : 81438767 : }
1749 : :
1750 : :
1751 : : /*
1752 : : LeaveErrorScope - leave the current scope and pop into the previous one.
1753 : : */
1754 : :
1755 : 96011644 : extern "C" void M2Error_LeaveErrorScope (void)
1756 : : {
1757 : 96011644 : currentScope = static_cast<M2Error_ErrorScope__opaque> (M2StackAddress_PopAddress (scopeStack));
1758 : 96011644 : }
1759 : :
1760 : :
1761 : : /*
1762 : : GetCurrentErrorScope - returns currentScope.
1763 : : */
1764 : :
1765 : 10307297 : extern "C" M2Error_ErrorScope M2Error_GetCurrentErrorScope (void)
1766 : : {
1767 : 10307297 : return static_cast<M2Error_ErrorScope> (currentScope);
1768 : : /* static analysis guarentees a RETURN statement will be used before here. */
1769 : : __builtin_unreachable ();
1770 : : }
1771 : :
1772 : :
1773 : : /*
1774 : : ResetErrorScope - should be called at the start of each pass to
1775 : : reset the error scope index.
1776 : : */
1777 : :
1778 : 60690 : extern "C" void M2Error_ResetErrorScope (void)
1779 : : {
1780 : 60690 : scopeIndex = 0;
1781 : 60690 : }
1782 : :
1783 : 15392 : extern "C" void _M2_M2Error_init (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1784 : : {
1785 : 15392 : Init ();
1786 : 15392 : }
1787 : :
1788 : 0 : extern "C" void _M2_M2Error_fini (__attribute__((unused)) int argc, __attribute__((unused)) char *argv[], __attribute__((unused)) char *envp[])
1789 : : {
1790 : 0 : }
|