]> andersk Git - splint.git/blob - src/Headers/llerror.h
a1f18b7becd6cbc264f6456ec357cf4f3d034ee5
[splint.git] / src / Headers / llerror.h
1 /*
2 ** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2001.
3 ** See ../LICENSE for license information.
4 **
5 */
6
7 # ifndef LLERROR_H
8 # define LLERROR_H
9
10 extern bool /*@alt void@*/ check (bool p_x);
11 # define check(p_x)  doCheck (p_x, cstring_fromChars (#p_x), cstring_makeLiteralTemp (__FILE__), __LINE__)
12
13 extern bool doCheck (bool p_x, cstring p_pred, cstring p_file, int p_line);
14
15 extern /*@noreturnwhenfalse@*/ void llassert (/*@sef@*/ bool p_test);
16 /*@-macroredef@*/
17 # define llassert(tst) \
18     do { if (!(tst)) { \
19            if (context_getFlag (FLG_TRYTORECOVER)) checkParseError (); \
20            lldiagmsg (message ("%s:%d: at source point", \
21                                cstring_makeLiteralTemp (__FILE__), __LINE__)); \
22            llbuglit ("llassert failed: " #tst); \
23        }} while (FALSE)
24 /*@=macroredef@*/
25
26 extern /*@noreturnwhenfalse@*/ void llassertretnull (/*@sef@*/ bool p_test);
27 # define llassertretnull(tst) \
28     do { if (!(tst)) { \
29            if (context_getFlag (FLG_TRYTORECOVER)) checkParseError (); \
30            lldiagmsg (message ("%s:%d: at source point", \
31                                cstring_makeLiteralTemp (__FILE__), __LINE__)); \
32            llbuglit ("llassert failed: " #tst); \
33        }} while (FALSE)
34
35 typedef void *tx_voidptr;
36
37 extern /*@noreturnwhenfalse@*/ void 
38 llassertretval (/*@sef@*/ bool p_test, /*@sef@*/ /*@null@*/ tx_voidptr /*@alt anytype@*/ p_val); 
39 # define llassertretval(tst,val) \
40     do { if (!(tst)) { \
41            if (context_getFlag (FLG_TRYTORECOVER)) checkParseError (); \
42            lldiagmsg (message ("%s:%d: at source point", \
43                                cstring_makeLiteralTemp (__FILE__), __LINE__)); \
44            llbuglit ("llassert failed: " #tst); \
45            /*@-type@*/ return (val); /*@=type@*/ \
46        }} while (FALSE)
47
48 /*
49 ** Use this for assertions in error-generation code (that
50 ** might lead to infinite loops of failed assertions if
51 ** the normal error generation routines are used).
52 */
53
54 extern /*@noreturnwhenfalse@*/ void llassertprotect (/*@sef@*/ bool p_test);
55 # define llassertprotect(tst) \
56     do { if (!(tst)) { \
57            fprintf (stderr, "%s:%d: at source point: ", __FILE__, __LINE__); \
58            fprintf (stderr, "protected fatal llassert failed: " #tst "\n"); \
59            llexit (EXIT_FAILURE); \
60        }} while (FALSE)
61
62 extern /*@noreturnwhenfalse@*/ void llassertfatal (/*@sef@*/ bool p_test);
63 # define llassertfatal(tst) \
64     do { if (!(tst)) \
65            llfatalbug (message("%s:%d: fatal llassert failed: " #tst, \
66                                cstring_makeLiteralTemp (__FILE__), __LINE__)); \
67        } while (FALSE)
68
69 /*
70 ** llassertprint and llassertprintret are in splintMacros.nf
71 */
72
73 extern void llmsg (/*@only@*/ cstring p_s) /*@modifies g_warningstream@*/ ;
74
75 extern void lldiagmsg (/*@only@*/ cstring p_s) /*@modifies stderr@*/ ;
76 extern void llmsgplain (/*@only@*/ cstring p_s) /*@modifies g_warningstream@*/ ;
77 extern void llhint (/*@only@*/ cstring p_s) 
78    /*@globals g_currentloc, g_warningstream;@*/ 
79    /*@modifies g_warningstream@*/ ;
80
81 extern /*@private@*/ /*@noreturn@*/ void 
82 xllfatalbug (char *p_srcFile, int p_srcLine, /*@only@*/ cstring p_s) 
83    /*@globals g_currentloc@*/
84    /*@modifies g_errorstream@*/ ;
85
86 extern /*@noreturn@*/ void llfatalbug (/*@only@*/ cstring p_s) 
87    /*@globals g_currentloc@*/
88    /*@modifies g_errorstream@*/ ;
89
90 # define llfatalbug(p_s) \
91      xllfatalbug (__FILE__, __LINE__, p_s)
92
93 extern /*@private@*/ bool xllgenerror (char *p_srcFile, int p_srcLine, flagcode p_o,
94                                        /*@only@*/ cstring p_s, fileloc p_fl)
95      /*@modifies g_warningstream@*/ ;
96
97 extern bool llgenerror (flagcode p_o, /*@only@*/ cstring p_s, fileloc p_fl) 
98      /*@modifies g_warningstream@*/ ;
99 # define llgenerror(p_o, p_s, p_fl) \
100      xllgenerror (__FILE__, __LINE__, p_o, p_s, p_fl)
101
102 extern /*@private@*/ bool 
103    xllgenhinterror (char *p_srcFile, int p_srcLine,
104                     flagcode p_o, /*@only@*/ cstring p_s, /*@only@*/ cstring p_hint, 
105                     fileloc p_fl) 
106      /*@modifies g_warningstream@*/ ;
107
108 extern bool llgenhinterror (flagcode p_o, /*@only@*/ cstring p_s, /*@only@*/ cstring p_hint, 
109                             fileloc p_fl) /*@modifies g_warningstream@*/ ;
110
111 # define llgenhinterror(p_o, p_s, p_hint, p_fl) \
112      xllgenhinterror (__FILE__, __LINE__, p_o, p_s, p_hint, p_fl)
113
114
115 extern void llerror (flagcode p_o, /*@only@*/ cstring p_s) 
116    /*@globals g_warningstream, g_currentloc@*/ 
117    /*@modifies g_warningstream@*/ ;
118 # define llerror(p_o, p_s) \
119    ((void) llgenerror (p_o, p_s, g_currentloc))
120
121 extern void llgenmsg (/*@only@*/ cstring p_s, fileloc p_fl)
122    /*@modifies g_warningstream@*/ ;
123
124 extern /*@noreturn@*/ /*@private@*/ 
125 void xllfatalerror (char *p_srcFile, int p_srcLine, /*@only@*/ cstring p_s) 
126    /*@modifies g_errorstream@*/ ;
127
128 extern /*@noreturn@*/ void llfatalerror (/*@only@*/ cstring p_s) 
129    /*@modifies g_errorstream@*/ ;
130 # define llfatalerror(p_s) xllfatalerror (__FILE__, __LINE__, p_s)
131
132 extern /*@noreturn@*/ /*@private@*/ void 
133 xllfatalerrorLoc (char *p_srcFile, int p_srcLine, /*@only@*/ cstring p_s) 
134    /*@globals g_currentloc@*/ 
135    /*@modifies g_errorstream@*/ ;
136
137 extern /*@noreturn@*/ void llfatalerrorLoc (/*@only@*/ cstring p_s) 
138    /*@globals g_currentloc@*/ 
139    /*@modifies g_errorstream@*/ ;
140 # define llfatalerrorLoc(p_s) xllfatalerrorLoc (__FILE__, __LINE__, p_s)
141
142 extern /*@private@*/ void
143    xllparseerror (char *p_srcFile, int p_srcLine, /*@only@*/ cstring p_s)
144    /*@globals g_currentloc@*/
145    /*@modifies g_warningstream@*/ ;
146
147 extern void llparseerror (/*@only@*/ cstring p_s) 
148    /*@globals g_currentloc@*/
149    /*@modifies g_warningstream@*/ ;
150
151 # define llparseerror(p_s) xllparseerror (__FILE__, __LINE__, p_s)
152 # ifndef NOLCL
153 extern /*@noreturn@*/ void lclplainfatalerror (/*@only@*/ cstring p_msg) /*@modifies g_warningstream@*/ ;
154 extern /*@noreturn@*/ void lclfatalbug (/*@temp@*/ char *p_msg) /*@modifies g_warningstream@*/ ;
155 extern int lclNumberErrors (void) /*@*/ ;
156 extern bool lclHadNewError (void) /*@modifies internalState@*/ ;
157 extern /*@noreturn@*/ void lclfatalerror (ltoken p_t, /*@only@*/ cstring p_msg);
158
159 extern void xlclerror (char *p_srcFile, int p_srcLine, ltoken p_t, /*@only@*/ cstring p_msg) ;
160
161 extern void lclerror (ltoken p_t, /*@only@*/ cstring p_msg);
162 # define lclerror(p_t,p_msg) \
163    xlclerror (__FILE__, __LINE__, p_t, p_msg)
164
165 extern void lclbug (/*@only@*/ cstring p_s);
166 extern void lclplainerror (/*@only@*/ cstring p_msg);
167 extern bool lclHadError (void);
168 extern void lclRedeclarationError (ltoken p_id);
169 # endif
170
171 extern void llerror_flagWarning (/*@only@*/ cstring p_s) /*@modifies g_warningstream@*/ ;
172
173 extern /*@noreturn@*/ void llbugaux (cstring p_file, int p_line, /*@only@*/ cstring p_s) 
174    /*@globals g_warningstream, g_currentloc@*/
175    /*@modifies *g_warningstream@*/ ; 
176
177 extern /*@noreturn@*/ void llbug (/*@only@*/ cstring p_s) 
178    /*@globals g_warningstream, g_currentloc@*/
179    /*@modifies *g_warningstream@*/ ; 
180
181    /* doesn't really exit, but don't mind errors if it doesn't */
182 # define llbug(s) llbugaux (cstring_makeLiteralTemp (__FILE__), __LINE__, s)
183
184 extern void llquietbugaux (/*@only@*/ cstring p_s, cstring, int) /*@modifies *g_warningstream@*/ ; 
185 extern void llquietbug (/*@only@*/ cstring) /*@modifies *g_warningstream@*/ ; 
186 # define llquietbug(s) llquietbugaux (s, cstring_makeLiteralTemp (__FILE__), __LINE__)
187
188 extern void llcontbug (/*@only@*/ cstring p_s) /*@modifies *g_warningstream@*/ ; 
189        /* doesn't really exit, but don't mind errors if it doesn't */
190 # define llcontbug(s)  (llbug (s))
191
192 extern void cleanupMessages (void) 
193    /*@globals g_warningstream, g_currentloc;@*/
194    /*@modifies g_warningstream, internalState@*/ ;
195
196 extern void displayScan (/*@only@*/ cstring p_msg)
197   /*@modifies g_messagestream@*/ ;
198
199 extern void displayScanOpen (/*@only@*/ cstring p_msg)
200   /*@modifies g_messagestream@*/ ;
201
202 extern void displayScanContinue (/*@temp@*/ cstring p_msg)
203   /*@modifies g_messagestream@*/ ;
204
205 extern void displayScanClose (void)
206   /*@modifies g_messagestream@*/ ;
207
208 /*
209 ** Report error iff f1 and f2 are set.
210 */
211
212 extern bool 
213 xoptgenerror2 (char *p_srcFile, int p_srcLine,
214                flagcode p_f1, flagcode p_f2, /*@only@*/ cstring p_s, fileloc p_loc)
215   /*@modifies *g_warningstream, internalState@*/ ;
216
217 extern bool 
218 optgenerror2 (flagcode p_f1, flagcode p_f2, /*@only@*/ cstring p_s, fileloc p_loc)
219   /*@modifies *g_warningstream, internalState@*/ ;
220 # define optgenerror2(p_f1, p_f2, p_s, p_loc) \
221   (xoptgenerror2 (__FILE__, __LINE__, p_f1, p_f2, p_s, p_loc))
222
223 /*
224 ** Report error if f1 is set and f2 is not set.
225 */
226
227 extern bool 
228 xoptgenerror2n (char *p_srcFile, int p_srcLine,
229                 flagcode p_f1, flagcode p_f2, /*@only@*/ cstring p_s, fileloc p_loc)
230   /*@modifies *g_warningstream, internalState@*/ ;
231
232 extern bool 
233 optgenerror2n (flagcode p_f1, flagcode p_f2, /*@only@*/ cstring p_s, fileloc p_loc)
234   /*@modifies *g_warningstream, internalState@*/ ;
235 # define optgenerror2n(p_f1, p_f2, p_s, p_loc) \
236   (xoptgenerror2n (__FILE__, __LINE__, p_f1, p_f2, p_s, p_loc))
237
238 extern /*@private@*/ bool xlloptgenerror (char *p_srcFile, int p_srcLine, flagcode p_o, /*@only@*/ cstring p_s, fileloc p_loc)
239   /*@modifies *g_warningstream, internalState@*/ ;
240
241 extern bool lloptgenerror (flagcode p_o, /*@only@*/ cstring p_s, fileloc p_loc)
242   /*@modifies *g_warningstream, internalState@*/ ;
243 # define lloptgenerror(p_o, p_s, p_loc) \
244    (xlloptgenerror (__FILE__, __LINE__, p_o, p_s, p_loc))
245
246 extern bool xllnoptgenerror (char *p_srcFile, int p_srcLine,
247                              flagcode p_o, /*@only@*/ cstring p_s, fileloc p_loc)
248   /*@modifies *g_warningstream, internalState@*/ ;
249
250 extern bool llnoptgenerror (flagcode p_o, /*@only@*/ cstring p_s, fileloc p_loc)
251   /*@modifies *g_warningstream, internalState@*/ ;
252 # define llnoptgenerror(p_o, p_s, p_loc) \
253    (xllnoptgenerror (__FILE__, __LINE__, p_o, p_s, p_loc))
254
255 extern /*@private@*/ bool 
256    xllgenformattypeerror (char *p_srcFile, int p_srcLine,
257                           ctype p_t1, exprNode p_e1, 
258                           ctype p_t2, exprNode p_e2,
259                           /*@only@*/ cstring p_s, fileloc p_fl)
260      /*@modifies *g_warningstream, internalState@*/ ;
261
262 extern bool llgenformattypeerror (ctype p_t1, exprNode p_e1, 
263                                   ctype p_t2, exprNode p_e2,
264                                   /*@only@*/ cstring p_s, fileloc p_fl)
265   /*@modifies *g_warningstream, internalState@*/ ;
266 # define llgenformattypeerror(p_t1, p_e1, p_t2, p_e2, p_s, p_fl) \
267   xllgenformattypeerror (__FILE__, __LINE__, p_t1, p_e1, p_t2, p_e2, p_s, p_fl)
268
269 extern bool xllgentypeerror (char *p_srcFile, int p_srcLine,
270                              ctype p_t1, exprNode p_e1,
271                              ctype p_t2, exprNode p_e2,
272                              /*@only@*/ cstring p_s,
273                              fileloc p_fl)
274   /*@modifies *g_warningstream, internalState@*/ ;
275
276 extern bool llgentypeerror (ctype p_t1, exprNode p_e1,
277                             ctype p_t2, exprNode p_e2,
278                             /*@only@*/ cstring p_s,
279                             fileloc p_fl)
280   /*@modifies *g_warningstream, internalState@*/ ;
281 # define llgentypeerror(p_t1, p_e1, p_t2, p_e2, p_s, p_fl) \
282   xllgentypeerror (__FILE__, __LINE__, p_t1, p_e1, p_t2, p_e2, p_s, p_fl)
283
284 extern bool gentypeerror (/*@sef@*/ ctype p_t1, 
285                           /*@sef@*/ exprNode p_e1,
286                           /*@sef@*/ ctype p_t2, 
287                           /*@sef@*/ exprNode p_e2,
288                           /*@sef@*/ /*@only@*/ cstring p_s,
289                           /*@sef@*/ fileloc p_loc)
290   /*@modifies *g_warningstream, internalState@*/ ;
291
292 /*@-branchstate@*/ /* sef only s is freed on one branch */
293 #define gentypeerror(t1, e1, t2, e2, s, loc)      \
294    (context_suppressFlagMsg (FLG_TYPE,loc) \
295     ? (flagcode_recordSuppressed (FLG_TYPE), FALSE) \
296     : llgentypeerror (t1, e1, t2, e2, s, loc))
297 /*@=branchstate@*/
298
299 /*
300 ** These are macros to save evaluating s (which may be some expensive
301 ** message generation function).
302 */
303
304 extern bool 
305   optgenerror (/*@sef@*/ flagcode p_o, /*@sef@*/ /*@only@*/ cstring p_s,
306                /*@sef@*/ fileloc p_loc)
307   /*@modifies *g_warningstream, internalState@*/ ;
308
309 /*@-branchstate@*/ /* sef only s is freed on one branch */
310 #define optgenerror(o,s,loc)      \
311    (context_suppressFlagMsg(o,loc) ? (flagcode_recordSuppressed(o), FALSE) \
312                                      : lloptgenerror (o, s, loc))
313 /*@=branchstate@*/
314
315 extern void 
316   voptgenerror (/*@sef@*/ flagcode p_o, /*@sef@*/ /*@only@*/ cstring p_s, 
317                 /*@sef@*/ fileloc p_loc)
318   /*@modifies *g_warningstream, internalState@*/ ;
319 #define voptgenerror(o, s, loc)   ((void) optgenerror(o,s,loc))
320
321 extern /*@private@*/ bool 
322   xfsgenerror (char *p_srcFile, int p_srcLine,
323                 flagSpec p_fs, /*@only@*/ cstring p_s, fileloc p_fl) 
324      /*@modifies g_warningstream, internalState@*/ ;
325
326 extern bool fsgenerror (flagSpec p_fs, /*@only@*/ cstring p_s, fileloc p_fl) 
327      /*@modifies g_warningstream, internalState@*/ ;
328 # define fsgenerror(p_fs, p_s, p_fl) \
329      xfsgenerror (__FILE__, __LINE__, p_fs, p_s, p_fl)
330
331 extern void 
332 vfsgenerror (/*@sef@*/ flagSpec p_fs, /*@sef@*/ /*@only@*/ cstring p_s, 
333              /*@sef@*/ fileloc p_loc)
334      /*@modifies *g_warningstream, internalState@*/ ;
335 #define vfsgenerror(fs, s, loc)   ((void) fsgenerror(fs,s,loc))
336
337 /*
338 ** Reports a warning when f1 is ON and f2 is ON
339 */
340
341 extern void 
342   voptgenerror2 (/*@sef@*/ flagcode p_f1, /*@sef@*/ flagcode p_f2, 
343                   /*@sef@*/ /*@only@*/ cstring p_s, /*@sef@*/ fileloc p_loc);
344 #define voptgenerror2(f1, f2, s, loc)   ((void) optgenerror2 (f1, f2, s, loc))
345
346 /*
347 ** Reports a warning when f1 is ON and f2 is OFF
348 */
349
350 extern void 
351   voptgenerror2n (/*@sef@*/ flagcode p_f1, /*@sef@*/ flagcode p_f2, 
352                   /*@sef@*/ /*@only@*/ cstring p_s, /*@sef@*/ fileloc p_loc);
353 #define voptgenerror2n(f1, f2, s, loc)   ((void) optgenerror2n (f1, f2, s, loc))
354
355 extern void noptgenerror (/*@sef@*/ flagcode p_code, 
356                           /*@sef@*/ /*@only@*/ cstring p_s,
357                           /*@sef@*/ fileloc p_loc);
358 /*@-branchstate@*/ /* sef only s is freed on one branch */
359 #define noptgenerror(o,s,loc)     \
360    (context_suppressNotFlagMsg (o, loc) \
361     ? (flagcode_recordSuppressed(o), FALSE) \
362     : llnoptgenerror (o, s, loc))
363 /*@=branchstate@*/
364
365 extern void 
366   vnoptgenerror (/*@sef@*/ flagcode p_code, /*@sef@*/ /*@only@*/ cstring p_msg,
367                  /*@sef@*/ fileloc p_loc);
368 # define vnoptgenerror(o, s, loc) ((void) noptgenerror(o, s, loc))
369
370 extern void 
371   vgenhinterror (flagcode p_code, /*@only@*/ cstring p_mst,
372                  /*@only@*/ cstring p_hint, /*@sef@*/ fileloc p_loc);
373 # define vgenhinterror(o, s, h, loc) \
374     ((void) llgenhinterror(o, s, h, loc))
375
376
377 extern /*@private@*/ bool /*@alt void@*/ xllforceerror (char *p_srcFile, int p_srcLine, flagcode p_code, /*@only@*/ cstring p_s, fileloc p_fl) 
378      /*@modifies g_warningstream@*/ ; 
379
380 extern bool /*@alt void@*/ llforceerror (flagcode p_code, /*@only@*/ cstring p_s, fileloc p_fl) 
381      /*@modifies g_warningstream@*/ ; 
382 # define llforceerror(p_code, p_s, p_fl) \
383      (xllforceerror (__FILE__, __LINE__, p_code, p_s, p_fl))
384
385 extern /*@private@*/ bool xcppoptgenerror (char *p_srcFile, int p_srcLine, flagcode p_o,
386                              /*@only@*/ cstring p_s, cppReader *p_pfile)
387      /*@modifies g_warningstream, p_pfile@*/ ;
388
389 extern bool /*@alt void@*/
390 cppoptgenerror (flagcode p_code, /*@only@*/ cstring p_s, cppReader *p_pfile)
391      /*@modifies g_warningstream, p_pfile@*/ ;
392 # define cppoptgenerror(p_code, p_s, p_pfile) \
393     (xcppoptgenerror (__FILE__, __LINE__, p_code, p_s, p_pfile))
394
395 extern void llerrorlit (flagcode p_o, char *p_s);
396 # define llerrorlit(o, s)   ((void) llerror (o, cstring_makeLiteral (s)))
397
398 extern void llgenindentmsg (/*@only@*/ cstring p_s, fileloc p_fl) /*@modifies g_warningstream@*/ ;
399
400 extern /*@noreturn@*/ void llbugexitlit (char *p_s);
401 # define llbugexitlit(s)    (llbug (cstring_makeLiteral (s)))
402
403 extern void llbuglit (char *p_s);
404 # define llbuglit(s)        (llbug (cstring_makeLiteral (s)))
405
406 extern void llcontbuglit (char *p_s);
407 # define llcontbuglit(s)    (llbug (cstring_makeLiteral (s)))
408
409 extern void checkParseError (void);
410
411 extern void llmsglit (char *p_s);
412 # define llmsglit(s)        (llmsg (cstring_makeLiteral (s)))
413
414 extern void ppllerror (/*@only@*/ cstring p_s);
415
416 extern void genppllerrorhint (flagcode p_code, /*@only@*/ cstring p_s, 
417                               /*@only@*/ cstring p_hint);
418 extern void genppllerror (flagcode p_code, /*@only@*/ cstring p_s);
419 extern /*@unused@*/ void pplldiagmsg (/*@only@*/ cstring p_s);
420 extern void loadllmsg (/*@only@*/ cstring p_s);
421
422 extern void llgenindentmsgnoloc (/*@only@*/ cstring p_s);
423
424 extern /*@observer@*/ cstring lldecodeerror (int) /*@*/ ;
425
426 /*@i523@*/
427 /*
428 ** should be static, but used in cpperror (which shouldn't exist)
429 */
430
431 extern void prepareMessage (void)
432   /*@modifies internalState, g_messagestream@*/ ;
433
434 extern void closeMessage (void)
435   /*@modifies internalState, g_messagestream@*/ ;
436
437 extern void llflush (void) /*@modifies systemState@*/ ;
438
439 # else
440 # error "Multiple include"
441 # endif
442
This page took 0.056998 seconds and 3 git commands to generate.