LCOV - code coverage report
Current view: top level - /mnt/build/buildbot/bld/build-lcov/gcc/m2/gm2-compiler-boot - M2Error.c (source / functions) Coverage Total Hit
Test: gcc.info Lines: 66.4 % 571 379
Test Date: 2026-02-28 14:20:25 Functions: 77.0 % 61 47
Legend: Lines:     hit not hit

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

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.