Mercurial > hg > xemacs-beta
comparison src/lisp.h @ 4843:715b15990d0a
add more foo_checking_assert macros
lisp.h: Add structure_checking_assert(), gc_checking_assert(), etc. for
all types of error-checking. Also FOO_checking_assert_with_message()
and inline_FOO_checking_assert() -- the latter for use in an inline
function where you want the calling function's line/file to be reported
(requires some conspiracy with the function itself).
Add disabled_assert(), disabled_assert_at_line(),
disabled_assert_with_message(), for what to do when an assert is
disabled. Formerly, we used to do ((void) 0), but now we do
((void) x), so the variable appears used and any side effects of the
expression do get done. In Unicode-internal, the standard assert()
uses this, but not yet in this workspace.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Wed, 13 Jan 2010 03:01:43 -0600 |
parents | 3465c3161fea |
children | 91b3d00e717f |
comparison
equal
deleted
inserted
replaced
4842:1d775c6304d1 | 4843:715b15990d0a |
---|---|
1 /* Fundamental definitions for XEmacs Lisp interpreter. | 1 /* Fundamental definitions for XEmacs Lisp interpreter. |
2 Copyright (C) 1985-1987, 1992-1995 Free Software Foundation, Inc. | 2 Copyright (C) 1985-1987, 1992-1995 Free Software Foundation, Inc. |
3 Copyright (C) 1993-1996 Richard Mlynarik. | 3 Copyright (C) 1993-1996 Richard Mlynarik. |
4 Copyright (C) 1995, 1996, 2000, 2001, 2002, 2003, 2004, 2005 Ben Wing. | 4 Copyright (C) 1995, 1996, 2000-2005, 2009, 2010 Ben Wing. |
5 | 5 |
6 This file is part of XEmacs. | 6 This file is part of XEmacs. |
7 | 7 |
8 XEmacs is free software; you can redistribute it and/or modify it | 8 XEmacs is free software; you can redistribute it and/or modify it |
9 under the terms of the GNU General Public License as published by the | 9 under the terms of the GNU General Public License as published by the |
112 /* The large categories established by configure can be subdivided into | 112 /* The large categories established by configure can be subdivided into |
113 smaller subcategories, for problems in specific modules. You can't | 113 smaller subcategories, for problems in specific modules. You can't |
114 control this using configure, but you can manually stick in a define as | 114 control this using configure, but you can manually stick in a define as |
115 necessary. */ | 115 necessary. */ |
116 | 116 |
117 /* How these work: | |
118 | |
119 The most common classes will be `text' and `type', followed by `structure'. | |
120 `text' is for problems related to bad textual format. `type' is for | |
121 problems related to wrongly typed arguments, structure fields, etc. | |
122 `structure' is for bad data inside of a structure. Sometimes these are | |
123 used "incorrectly", e.g. `type' is often used for structure-checking. | |
124 Consider `text': | |
125 | |
126 `text_checking_assert() will assert() only when ERROR_CHECK_TEXT is defined; | |
127 otherwise it's a no-op. text_checking_assert_at_line() is similar, but | |
128 allows you to override the file name and line number normally supplied in | |
129 the message. This is especially useful in inline header functions, and | |
130 so there's a special inline_text_checking_assert() for this; this works | |
131 like text_checking_assert() but supplies the file and line of the calling | |
132 function. In order for this to work, you need to declare your inline | |
133 function with INLINE_TEXT_CHECK_ARGS at the end of its argument list, | |
134 and give its function name a _1 extension or similar. Then create a | |
135 macro that calls your inline function and includes INLINE_TEXT_CHECK_CALL | |
136 at the end of the parameter list. This will arrange to pass in and receive | |
137 the file and line (__FILE__, __LINE__) at place where the call occurs in | |
138 the calling function; but nothing will get passed in when ERROR_CHECK_TEXT | |
139 is not defined. | |
140 */ | |
141 | |
142 | |
117 #ifdef ERROR_CHECK_STRUCTURES | 143 #ifdef ERROR_CHECK_STRUCTURES |
118 /* Check for problems with the catch list and specbind stack */ | 144 /* Check for problems with the catch list and specbind stack */ |
119 #define ERROR_CHECK_CATCH | 145 #define ERROR_CHECK_CATCH |
120 /* Check for insufficient use of call_trapping_problems(), particularly | 146 /* Check for insufficient use of call_trapping_problems(), particularly |
121 due to glyph-related changes causing eval or QUIT within redisplay */ | 147 due to glyph-related changes causing eval or QUIT within redisplay */ |
122 #define ERROR_CHECK_TRAPPING_PROBLEMS | 148 #define ERROR_CHECK_TRAPPING_PROBLEMS |
123 #endif | 149 #endif /* ERROR_CHECK_STRUCTURES */ |
150 | |
151 #define INLINE_ERROR_CHECK_ARGS , const char *__file__, int __line__ | |
152 #define INLINE_ERROR_CHECK_CALL , __FILE__, __LINE__ | |
153 #define DISABLED_INLINE_ERROR_CHECK_ARGS | |
154 #define DISABLED_INLINE_ERROR_CHECK_CALL | |
155 | |
156 /* For assertions in inline header functions which will report the file and | |
157 line of the calling function */ | |
158 #define inline_assert(assertion) assert_at_line (assertion, __file__, __line__) | |
159 #define disabled_inline_assert(assertion) \ | |
160 disabled_assert_at_line (assertion, __file__, __line__) | |
161 | |
162 #ifdef ERROR_CHECK_TEXT | |
163 #define text_checking_assert(assertion) assert (assertion) | |
164 #define text_checking_assert_at_line(assertion, file, line) \ | |
165 assert_at_line (assertion, file, line) | |
166 #define inline_text_checking_assert(assertion) inline_assert (assertion) | |
167 #define INLINE_TEXT_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
168 #define INLINE_TEXT_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
169 #define text_checking_assert_with_message(assertion, msg) \ | |
170 assert_with_message (assertion, msg) | |
171 #else /* not ERROR_CHECK_TEXT */ | |
172 #define text_checking_assert(assertion) disabled_assert (assertion) | |
173 #define text_checking_assert_at_line(assertion, file, line) \ | |
174 disabled_assert_at_line (assertion, file, line) | |
175 #define inline_text_checking_assert(assertion) \ | |
176 disabled_inline_assert (assertion) | |
177 #define INLINE_TEXT_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS | |
178 #define INLINE_TEXT_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL | |
179 #define text_checking_assert_with_message(assertion, msg) \ | |
180 disabled_assert_with_message (assertion, msg) | |
181 #endif /* ERROR_CHECK_TEXT */ | |
124 | 182 |
125 #ifdef ERROR_CHECK_TYPES | 183 #ifdef ERROR_CHECK_TYPES |
126 #define type_checking_assert(assertion) assert (assertion) | 184 #define type_checking_assert(assertion) assert (assertion) |
127 #define type_checking_assert_at_line(assertion, file, line) \ | 185 #define type_checking_assert_at_line(assertion, file, line) \ |
128 assert_at_line (assertion, file, line) | 186 assert_at_line (assertion, file, line) |
187 #define inline_type_checking_assert(assertion) inline_assert (assertion) | |
188 #define INLINE_TYPE_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
189 #define INLINE_TYPE_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
129 #define type_checking_assert_with_message(assertion, msg) \ | 190 #define type_checking_assert_with_message(assertion, msg) \ |
130 assert_with_message (assertion, msg) | 191 assert_with_message (assertion, msg) |
131 #else | 192 #else /* not ERROR_CHECK_TYPES */ |
132 #define type_checking_assert(assertion) | 193 #define type_checking_assert(assertion) disabled_assert (assertion) |
133 #define type_checking_assert_at_line(assertion, file, line) | 194 #define type_checking_assert_at_line(assertion, file, line) \ |
134 #define type_checking_assert_with_message(assertion, msg) | 195 disabled_assert_at_line (assertion, file, line) |
135 #endif | 196 #define inline_type_checking_assert(assertion) \ |
197 disabled_inline_assert (assertion) | |
198 #define INLINE_TYPE_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS | |
199 #define INLINE_TYPE_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL | |
200 #define type_checking_assert_with_message(assertion, msg) \ | |
201 disabled_assert_with_message (assertion, msg) | |
202 #endif /* ERROR_CHECK_TYPES */ | |
203 | |
204 #ifdef ERROR_CHECK_STRUCTURES | |
205 #define structure_checking_assert(assertion) assert (assertion) | |
206 #define structure_checking_assert_at_line(assertion, file, line) \ | |
207 assert_at_line (assertion, file, line) | |
208 #define inline_structure_checking_assert(assertion) inline_assert (assertion) | |
209 #define INLINE_STRUCTURE_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
210 #define INLINE_STRUCTURE_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
211 #define structure_checking_assert_with_message(assertion, msg) \ | |
212 assert_with_message (assertion, msg) | |
213 #else /* not ERROR_CHECK_STRUCTURES */ | |
214 #define structure_checking_assert(assertion) disabled_assert (assertion) | |
215 #define structure_checking_assert_at_line(assertion, file, line) \ | |
216 disabled_assert_at_line (assertion, file, line) | |
217 #define inline_structure_checking_assert(assertion) \ | |
218 disabled_inline_assert (assertion) | |
219 #define INLINE_STRUCTURE_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS | |
220 #define INLINE_STRUCTURE_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL | |
221 #define structure_checking_assert_with_message(assertion, msg) \ | |
222 disabled_assert_with_message (assertion, msg) | |
223 #endif /* ERROR_CHECK_STRUCTURES */ | |
224 | |
136 #ifdef ERROR_CHECK_GC | 225 #ifdef ERROR_CHECK_GC |
137 #define gc_checking_assert(assertion) assert (assertion) | 226 #define gc_checking_assert(assertion) assert (assertion) |
138 #define gc_checking_assert_at_line(assertion, file, line) \ | 227 #define gc_checking_assert_at_line(assertion, file, line) \ |
139 assert_at_line (assertion, file, line) | 228 assert_at_line (assertion, file, line) |
229 #define inline_gc_checking_assert(assertion) inline_assert (assertion) | |
230 #define INLINE_GC_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
231 #define INLINE_GC_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
140 #define gc_checking_assert_with_message(assertion, msg) \ | 232 #define gc_checking_assert_with_message(assertion, msg) \ |
141 assert_with_message (assertion, msg) | 233 assert_with_message (assertion, msg) |
142 #else | 234 #else /* not ERROR_CHECK_GC */ |
143 #define gc_checking_assert(assertion) | 235 #define gc_checking_assert(assertion) disabled_assert (assertion) |
144 #define gc_checking_assert_at_line(assertion, file, line) | 236 #define gc_checking_assert_at_line(assertion, file, line) \ |
145 #define gc_checking_assert_with_message(assertion, msg) | 237 disabled_assert_at_line (assertion, file, line) |
146 #endif | 238 #define inline_gc_checking_assert(assertion) \ |
147 #ifdef ERROR_CHECK_TEXT | 239 disabled_inline_assert (assertion) |
148 #define text_checking_assert(assertion) assert (assertion) | 240 #define INLINE_GC_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS |
149 #define text_checking_assert_at_line(assertion, file, line) \ | 241 #define INLINE_GC_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL |
242 #define gc_checking_assert_with_message(assertion, msg) \ | |
243 disabled_assert_with_message (assertion, msg) | |
244 #endif /* ERROR_CHECK_GC */ | |
245 | |
246 #ifdef ERROR_CHECK_DISPLAY | |
247 #define display_checking_assert(assertion) assert (assertion) | |
248 #define display_checking_assert_at_line(assertion, file, line) \ | |
150 assert_at_line (assertion, file, line) | 249 assert_at_line (assertion, file, line) |
151 #define text_checking_assert_with_message(assertion, msg) \ | 250 #define inline_display_checking_assert(assertion) inline_assert (assertion) |
251 #define INLINE_DISPLAY_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
252 #define INLINE_DISPLAY_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
253 #define display_checking_assert_with_message(assertion, msg) \ | |
152 assert_with_message (assertion, msg) | 254 assert_with_message (assertion, msg) |
153 #else | 255 #else /* not ERROR_CHECK_DISPLAY */ |
154 #define text_checking_assert(assertion) | 256 #define display_checking_assert(assertion) disabled_assert (assertion) |
155 #define text_checking_assert_at_line(assertion, file, line) | 257 #define display_checking_assert_at_line(assertion, file, line) \ |
156 #define text_checking_assert_with_message(assertion, msg) | 258 disabled_assert_at_line (assertion, file, line) |
157 #endif | 259 #define inline_display_checking_assert(assertion) \ |
260 disabled_inline_assert (assertion) | |
261 #define INLINE_DISPLAY_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS | |
262 #define INLINE_DISPLAY_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL | |
263 #define display_checking_assert_with_message(assertion, msg) \ | |
264 disabled_assert_with_message (assertion, msg) | |
265 #endif /* ERROR_CHECK_DISPLAY */ | |
266 | |
267 #ifdef ERROR_CHECK_GLYPHS | |
268 #define glyph_checking_assert(assertion) assert (assertion) | |
269 #define glyph_checking_assert_at_line(assertion, file, line) \ | |
270 assert_at_line (assertion, file, line) | |
271 #define inline_glyph_checking_assert(assertion) inline_assert (assertion) | |
272 #define INLINE_GLYPH_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
273 #define INLINE_GLYPH_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
274 #define glyph_checking_assert_with_message(assertion, msg) \ | |
275 assert_with_message (assertion, msg) | |
276 #else /* not ERROR_CHECK_GLYPHS */ | |
277 #define glyph_checking_assert(assertion) disabled_assert (assertion) | |
278 #define glyph_checking_assert_at_line(assertion, file, line) \ | |
279 disabled_assert_at_line (assertion, file, line) | |
280 #define inline_glyph_checking_assert(assertion) \ | |
281 disabled_inline_assert (assertion) | |
282 #define INLINE_GLYPH_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS | |
283 #define INLINE_GLYPH_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL | |
284 #define glyph_checking_assert_with_message(assertion, msg) \ | |
285 disabled_assert_with_message (assertion, msg) | |
286 #endif /* ERROR_CHECK_GLYPHS */ | |
287 | |
288 #ifdef ERROR_CHECK_EXTENTS | |
289 #define extent_checking_assert(assertion) assert (assertion) | |
290 #define extent_checking_assert_at_line(assertion, file, line) \ | |
291 assert_at_line (assertion, file, line) | |
292 #define inline_extent_checking_assert(assertion) inline_assert (assertion) | |
293 #define INLINE_EXTENT_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
294 #define INLINE_EXTENT_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
295 #define extent_checking_assert_with_message(assertion, msg) \ | |
296 assert_with_message (assertion, msg) | |
297 #else /* not ERROR_CHECK_EXTENTS */ | |
298 #define extent_checking_assert(assertion) disabled_assert (assertion) | |
299 #define extent_checking_assert_at_line(assertion, file, line) \ | |
300 disabled_assert_at_line (assertion, file, line) | |
301 #define inline_extent_checking_assert(assertion) \ | |
302 disabled_inline_assert (assertion) | |
303 #define INLINE_EXTENT_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS | |
304 #define INLINE_EXTENT_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL | |
305 #define extent_checking_assert_with_message(assertion, msg) \ | |
306 disabled_assert_with_message (assertion, msg) | |
307 #endif /* ERROR_CHECK_EXTENTS */ | |
308 | |
309 #ifdef ERROR_CHECK_MALLOC | |
310 #define malloc_checking_assert(assertion) assert (assertion) | |
311 #define malloc_checking_assert_at_line(assertion, file, line) \ | |
312 assert_at_line (assertion, file, line) | |
313 #define inline_malloc_checking_assert(assertion) inline_assert (assertion) | |
314 #define INLINE_MALLOC_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
315 #define INLINE_MALLOC_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
316 #define malloc_checking_assert_with_message(assertion, msg) \ | |
317 assert_with_message (assertion, msg) | |
318 #else /* not ERROR_CHECK_MALLOC */ | |
319 #define malloc_checking_assert(assertion) disabled_assert (assertion) | |
320 #define malloc_checking_assert_at_line(assertion, file, line) \ | |
321 disabled_assert_at_line (assertion, file, line) | |
322 #define inline_malloc_checking_assert(assertion) \ | |
323 disabled_inline_assert (assertion) | |
324 #define INLINE_MALLOC_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS | |
325 #define INLINE_MALLOC_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL | |
326 #define malloc_checking_assert_with_message(assertion, msg) \ | |
327 disabled_assert_with_message (assertion, msg) | |
328 #endif /* ERROR_CHECK_MALLOC */ | |
329 | |
330 #ifdef ERROR_CHECK_BYTE_CODE | |
331 #define byte_code_checking_assert(assertion) assert (assertion) | |
332 #define byte_code_checking_assert_at_line(assertion, file, line) \ | |
333 assert_at_line (assertion, file, line) | |
334 #define inline_byte_code_checking_assert(assertion) inline_assert (assertion) | |
335 #define INLINE_BYTE_CODE_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
336 #define INLINE_BYTE_CODE_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
337 #define byte_code_checking_assert_with_message(assertion, msg) \ | |
338 assert_with_message (assertion, msg) | |
339 #else /* not ERROR_CHECK_BYTE_CODE */ | |
340 #define byte_code_checking_assert(assertion) disabled_assert (assertion) | |
341 #define byte_code_checking_assert_at_line(assertion, file, line) \ | |
342 disabled_assert_at_line (assertion, file, line) | |
343 #define inline_byte_code_checking_assert(assertion) \ | |
344 disabled_inline_assert (assertion) | |
345 #define INLINE_BYTE_CODE_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS | |
346 #define INLINE_BYTE_CODE_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL | |
347 #define byte_code_checking_assert_with_message(assertion, msg) \ | |
348 disabled_assert_with_message (assertion, msg) | |
349 #endif /* ERROR_CHECK_BYTE_CODE */ | |
350 | |
158 #ifdef ERROR_CHECK_TRAPPING_PROBLEMS | 351 #ifdef ERROR_CHECK_TRAPPING_PROBLEMS |
159 #define trapping_problems_checking_assert(assertion) assert (assertion) | 352 #define trapping_problems_checking_assert(assertion) assert (assertion) |
160 #define trapping_problems_checking_assert_at_line(assertion, file, line) \ | 353 #define trapping_problems_checking_assert_at_line(assertion, file, line) \ |
161 assert_at_line (assertion, file, line) | 354 assert_at_line (assertion, file, line) |
355 #define inline_trapping_problems_checking_assert(assertion) inline_assert (assertion) | |
356 #define INLINE_TRAPPING_PROBLEMS_CHECK_ARGS INLINE_ERROR_CHECK_ARGS | |
357 #define INLINE_TRAPPING_PROBLEMS_CHECK_CALL INLINE_ERROR_CHECK_CALL | |
162 #define trapping_problems_checking_assert_with_message(assertion, msg) \ | 358 #define trapping_problems_checking_assert_with_message(assertion, msg) \ |
163 assert_with_message (assertion, msg) | 359 assert_with_message (assertion, msg) |
164 #else | 360 #else /* not ERROR_CHECK_TRAPPING_PROBLEMS */ |
165 #define trapping_problems_checking_assert(assertion) | 361 #define trapping_problems_checking_assert(assertion) disabled_assert (assertion) |
166 #define trapping_problems_checking_assert_at_line(assertion, file, line) | 362 #define trapping_problems_checking_assert_at_line(assertion, file, line) \ |
167 #define trapping_problems_checking_assert_with_message(assertion, msg) | 363 disabled_assert_at_line (assertion, file, line) |
168 #endif | 364 #define inline_trapping_problems_checking_assert(assertion) \ |
365 disabled_inline_assert (assertion) | |
366 #define INLINE_TRAPPING_PROBLEMS_CHECK_ARGS DISABLED_INLINE_ERROR_CHECK_ARGS | |
367 #define INLINE_TRAPPING_PROBLEMS_CHECK_CALL DISABLED_INLINE_ERROR_CHECK_CALL | |
368 #define trapping_problems_checking_assert_with_message(assertion, msg) \ | |
369 disabled_assert_with_message (assertion, msg) | |
370 #endif /* ERROR_CHECK_TRAPPING_PROBLEMS */ | |
169 | 371 |
170 /************************************************************************/ | 372 /************************************************************************/ |
171 /** Definitions of basic types **/ | 373 /** Definitions of basic types **/ |
172 /************************************************************************/ | 374 /************************************************************************/ |
173 | 375 |
1051 /* Highly dubious kludge */ | 1253 /* Highly dubious kludge */ |
1052 /* (thanks, Jamie, I feel better now -- ben) */ | 1254 /* (thanks, Jamie, I feel better now -- ben) */ |
1053 MODULE_API void assert_failed (const Ascbyte *, int, const Ascbyte *); | 1255 MODULE_API void assert_failed (const Ascbyte *, int, const Ascbyte *); |
1054 #define ABORT() (assert_failed (__FILE__, __LINE__, "ABORT()")) | 1256 #define ABORT() (assert_failed (__FILE__, __LINE__, "ABORT()")) |
1055 | 1257 |
1258 /* This used to be ((void) (0)) but that triggers lots of unused variable | |
1259 warnings. It's pointless to force all that code to be rewritten, with | |
1260 added ifdefs. Any reasonable compiler will eliminate an expression with | |
1261 no effects. We keep this abstracted out like this in case we want to | |
1262 change it in the future. */ | |
1263 #define disabled_assert(x) ((void) (x)) | |
1264 #define disabled_assert_with_message(x, msg) disabled_assert (x) | |
1265 #define disabled_assert_at_line(x, file, line) disabled_assert (x) | |
1266 | |
1056 #ifdef USE_ASSERTIONS | 1267 #ifdef USE_ASSERTIONS |
1057 # define assert(x) ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, #x)) | 1268 # define assert(x) ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, #x)) |
1058 # define assert_with_message(x, msg) \ | 1269 # define assert_with_message(x, msg) \ |
1059 ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, msg)) | 1270 ((x) ? (void) 0 : assert_failed (__FILE__, __LINE__, msg)) |
1060 # define assert_at_line(x, file, line) \ | 1271 # define assert_at_line(x, file, line) \ |