intrinsic.texi: Minor cleanup, reflowing overlong paragraphs, and correcting whitespace.
[official-gcc.git] / gcc / fortran / error.c
blobfd8f0bb3bc06915de5920bf2243e2b18a219d183
1 /* Handle errors.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
3 Foundation, Inc.
4 Contributed by Andy Vaught & Niels Kristian Bech Jensen
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA. */
23 /* Handle the inevitable errors. A major catch here is that things
24 flagged as errors in one match subroutine can conceivably be legal
25 elsewhere. This means that error messages are recorded and saved
26 for possible use later. If a line does not match a legal
27 construction, then the saved error message is reported. */
29 #include "config.h"
30 #include "system.h"
31 #include "flags.h"
32 #include "gfortran.h"
34 int gfc_suppress_error = 0;
36 static int terminal_width, buffer_flag, errors, warnings;
38 static gfc_error_buf error_buffer, warning_buffer, *cur_error_buffer;
41 /* Per-file error initialization. */
43 void
44 gfc_error_init_1 (void)
46 terminal_width = gfc_terminal_width ();
47 errors = 0;
48 warnings = 0;
49 buffer_flag = 0;
53 /* Set the flag for buffering errors or not. */
55 void
56 gfc_buffer_error (int flag)
58 buffer_flag = flag;
62 /* Add a single character to the error buffer or output depending on
63 buffer_flag. */
65 static void
66 error_char (char c)
68 if (buffer_flag)
70 if (cur_error_buffer->index >= cur_error_buffer->allocated)
72 cur_error_buffer->allocated =
73 cur_error_buffer->allocated
74 ? cur_error_buffer->allocated * 2 : 1000;
75 cur_error_buffer->message
76 = xrealloc (cur_error_buffer->message,
77 cur_error_buffer->allocated);
79 cur_error_buffer->message[cur_error_buffer->index++] = c;
81 else
83 if (c != 0)
85 /* We build up complete lines before handing things
86 over to the library in order to speed up error printing. */
87 static char *line;
88 static size_t allocated = 0, index = 0;
90 if (index + 1 >= allocated)
92 allocated = allocated ? allocated * 2 : 1000;
93 line = xrealloc (line, allocated);
95 line[index++] = c;
96 if (c == '\n')
98 line[index] = '\0';
99 fputs (line, stderr);
100 index = 0;
107 /* Copy a string to wherever it needs to go. */
109 static void
110 error_string (const char *p)
112 while (*p)
113 error_char (*p++);
117 /* Print a formatted integer to the error buffer or output. */
119 #define IBUF_LEN 30
121 static void
122 error_integer (int i)
124 char *p, int_buf[IBUF_LEN];
126 if (i < 0)
128 i = -i;
129 error_char ('-');
132 p = int_buf + IBUF_LEN - 1;
133 *p-- = '\0';
135 if (i == 0)
136 *p-- = '0';
138 while (i > 0)
140 *p-- = i % 10 + '0';
141 i = i / 10;
144 error_string (p + 1);
148 /* Show the file, where it was included, and the source line, give a
149 locus. Calls error_printf() recursively, but the recursion is at
150 most one level deep. */
152 static void error_printf (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
154 static void
155 show_locus (locus * loc, int c1, int c2)
157 gfc_linebuf *lb;
158 gfc_file *f;
159 char c, *p;
160 int i, m, offset, cmax;
162 /* TODO: Either limit the total length and number of included files
163 displayed or add buffering of arbitrary number of characters in
164 error messages. */
166 /* Write out the error header line, giving the source file and error
167 location (in GNU standard "[file]:[line].[column]:" format),
168 followed by an "included by" stack and a blank line. This header
169 format is matched by a testsuite parser defined in
170 lib/gfortran-dg.exp. */
172 lb = loc->lb;
173 f = lb->file;
175 error_string (f->filename);
176 error_char (':');
178 #ifdef USE_MAPPED_LOCATION
179 error_integer (LOCATION_LINE (lb->location));
180 #else
181 error_integer (lb->linenum);
182 #endif
184 if ((c1 > 0) || (c2 > 0))
185 error_char ('.');
187 if (c1 > 0)
188 error_integer (c1);
190 if ((c1 > 0) && (c2 > 0))
191 error_char ('-');
193 if (c2 > 0)
194 error_integer (c2);
196 error_char (':');
197 error_char ('\n');
199 for (;;)
201 i = f->inclusion_line;
203 f = f->included_by;
204 if (f == NULL) break;
206 error_printf (" Included at %s:%d:", f->filename, i);
209 error_char ('\n');
211 /* Calculate an appropriate horizontal offset of the source line in
212 order to get the error locus within the visible portion of the
213 line. Note that if the margin of 5 here is changed, the
214 corresponding margin of 10 in show_loci should be changed. */
216 offset = 0;
218 /* When the loci is not associated with a column, it will have a
219 value of zero. We adjust this to 1 so that it will appear. */
221 if (c1 == 0)
222 c1 = 1;
223 if (c2 == 0)
224 c2 = 1;
226 /* If the two loci would appear in the same column, we shift
227 '2' one column to the right, so as to print '12' rather than
228 just '1'. We do this here so it will be accounted for in the
229 margin calculations. */
231 if (c1 == c2)
232 c2 += 1;
234 cmax = (c1 < c2) ? c2 : c1;
235 if (cmax > terminal_width - 5)
236 offset = cmax - terminal_width + 5;
238 /* TODO: Is there a good reason for the following apparently-redundant
239 check, and the similar ones in the single-locus cases below? */
241 if (offset < 0)
242 offset = 0;
244 /* Show the line itself, taking care not to print more than what can
245 show up on the terminal. Tabs are converted to spaces, and
246 nonprintable characters are converted to a "\xNN" sequence. */
248 /* TODO: Although setting i to the terminal width is clever, it fails
249 to work correctly when nonprintable characters exist. A better
250 solution should be found. */
252 p = lb->line + offset;
253 i = strlen (p);
254 if (i > terminal_width)
255 i = terminal_width - 1;
257 for (; i > 0; i--)
259 c = *p++;
260 if (c == '\t')
261 c = ' ';
263 if (ISPRINT (c))
264 error_char (c);
265 else
267 error_char ('\\');
268 error_char ('x');
270 m = ((c >> 4) & 0x0F) + '0';
271 if (m > '9')
272 m += 'A' - '9' - 1;
273 error_char (m);
275 m = (c & 0x0F) + '0';
276 if (m > '9')
277 m += 'A' - '9' - 1;
278 error_char (m);
282 error_char ('\n');
284 /* Show the '1' and/or '2' corresponding to the column of the error
285 locus. Note that a value of -1 for c1 or c2 will simply cause
286 the relevant number not to be printed. */
288 c1 -= offset;
289 c2 -= offset;
291 for (i = 1; i <= cmax; i++)
293 if (i == c1)
294 error_char ('1');
295 else if (i == c2)
296 error_char ('2');
297 else
298 error_char (' ');
301 error_char ('\n');
306 /* As part of printing an error, we show the source lines that caused
307 the problem. We show at least one, and possibly two loci; the two
308 loci may or may not be on the same source line. */
310 static void
311 show_loci (locus * l1, locus * l2)
313 int m, c1, c2;
315 if (l1 == NULL || l1->lb == NULL)
317 error_printf ("<During initialization>\n");
318 return;
321 /* While calculating parameters for printing the loci, we consider possible
322 reasons for printing one per line. If appropriate, print the loci
323 individually; otherwise we print them both on the same line. */
325 c1 = l1->nextc - l1->lb->line;
326 if (l2 == NULL)
328 show_locus (l1, c1, -1);
329 return;
332 c2 = l2->nextc - l2->lb->line;
334 if (c1 < c2)
335 m = c2 - c1;
336 else
337 m = c1 - c2;
339 /* Note that the margin value of 10 here needs to be less than the
340 margin of 5 used in the calculation of offset in show_locus. */
342 if (l1->lb != l2->lb || m > terminal_width - 10)
344 show_locus (l1, c1, -1);
345 show_locus (l2, -1, c2);
346 return;
349 show_locus (l1, c1, c2);
351 return;
356 /* Workhorse for the error printing subroutines. This subroutine is
357 inspired by g77's error handling and is similar to printf() with
358 the following %-codes:
360 %c Character, %d or %i Integer, %s String, %% Percent
361 %L Takes locus argument
362 %C Current locus (no argument)
364 If a locus pointer is given, the actual source line is printed out
365 and the column is indicated. Since we want the error message at
366 the bottom of any source file information, we must scan the
367 argument list twice -- once to determine whether the loci are
368 present and record this for printing, and once to print the error
369 message after and loci have been printed. A maximum of two locus
370 arguments are permitted.
372 This function is also called (recursively) by show_locus in the
373 case of included files; however, as show_locus does not resupply
374 any loci, the recursion is at most one level deep. */
376 #define MAX_ARGS 10
378 static void ATTRIBUTE_GCC_GFC(2,0)
379 error_print (const char *type, const char *format0, va_list argp)
381 enum { TYPE_CURRENTLOC, TYPE_LOCUS, TYPE_INTEGER, TYPE_CHAR, TYPE_STRING,
382 NOTYPE };
383 struct
385 int type;
386 int pos;
387 union
389 int intval;
390 char charval;
391 const char * stringval;
392 } u;
393 } arg[MAX_ARGS], spec[MAX_ARGS];
394 /* spec is the array of specifiers, in the same order as they
395 appear in the format string. arg is the array of arguments,
396 in the same order as they appear in the va_list. */
398 char c;
399 int i, n, have_l1, pos, maxpos;
400 locus *l1, *l2, *loc;
401 const char *format;
403 l1 = l2 = NULL;
405 have_l1 = 0;
406 pos = -1;
407 maxpos = -1;
409 n = 0;
410 format = format0;
412 for (i = 0; i < MAX_ARGS; i++)
414 arg[i].type = NOTYPE;
415 spec[i].pos = -1;
418 /* First parse the format string for position specifiers. */
419 while (*format)
421 c = *format++;
422 if (c != '%')
423 continue;
425 if (*format == '%')
426 continue;
428 if (ISDIGIT (*format))
430 /* This is a position specifier. For example, the number
431 12 in the format string "%12$d", which specifies the third
432 argument of the va_list, formatted in %d format.
433 For details, see "man 3 printf". */
434 pos = atoi(format) - 1;
435 gcc_assert (pos >= 0);
436 while (ISDIGIT(*format))
437 format++;
438 gcc_assert (*format++ == '$');
440 else
441 pos++;
443 c = *format++;
445 if (pos > maxpos)
446 maxpos = pos;
448 switch (c)
450 case 'C':
451 arg[pos].type = TYPE_CURRENTLOC;
452 break;
454 case 'L':
455 arg[pos].type = TYPE_LOCUS;
456 break;
458 case 'd':
459 case 'i':
460 arg[pos].type = TYPE_INTEGER;
461 break;
463 case 'c':
464 arg[pos].type = TYPE_CHAR;
465 break;
467 case 's':
468 arg[pos].type = TYPE_STRING;
469 break;
471 default:
472 gcc_unreachable ();
475 spec[n++].pos = pos;
478 /* Then convert the values for each %-style argument. */
479 for (pos = 0; pos <= maxpos; pos++)
481 gcc_assert (arg[pos].type != NOTYPE);
482 switch (arg[pos].type)
484 case TYPE_CURRENTLOC:
485 loc = &gfc_current_locus;
486 /* Fall through. */
488 case TYPE_LOCUS:
489 if (arg[pos].type == TYPE_LOCUS)
490 loc = va_arg (argp, locus *);
492 if (have_l1)
494 l2 = loc;
495 arg[pos].u.stringval = "(2)";
497 else
499 l1 = loc;
500 have_l1 = 1;
501 arg[pos].u.stringval = "(1)";
503 break;
505 case TYPE_INTEGER:
506 arg[pos].u.intval = va_arg (argp, int);
507 break;
509 case TYPE_CHAR:
510 arg[pos].u.charval = (char) va_arg (argp, int);
511 break;
513 case TYPE_STRING:
514 arg[pos].u.stringval = (const char *) va_arg (argp, char *);
515 break;
517 default:
518 gcc_unreachable ();
522 for (n = 0; spec[n].pos >= 0; n++)
523 spec[n].u = arg[spec[n].pos].u;
525 /* Show the current loci if we have to. */
526 if (have_l1)
527 show_loci (l1, l2);
529 if (*type)
531 error_string (type);
532 error_char (' ');
535 have_l1 = 0;
536 format = format0;
537 n = 0;
539 for (; *format; format++)
541 if (*format != '%')
543 error_char (*format);
544 continue;
547 format++;
548 if (ISDIGIT(*format))
550 /* This is a position specifier. See comment above. */
551 while (ISDIGIT(*format))
552 format++;
554 /* Skip over the dollar sign. */
555 format++;
558 switch (*format)
560 case '%':
561 error_char ('%');
562 break;
564 case 'c':
565 error_char (spec[n++].u.charval);
566 break;
568 case 's':
569 case 'C': /* Current locus */
570 case 'L': /* Specified locus */
571 error_string (spec[n++].u.stringval);
572 break;
574 case 'd':
575 case 'i':
576 error_integer (spec[n++].u.intval);
577 break;
581 error_char ('\n');
585 /* Wrapper for error_print(). */
587 static void
588 error_printf (const char *nocmsgid, ...)
590 va_list argp;
592 va_start (argp, nocmsgid);
593 error_print ("", _(nocmsgid), argp);
594 va_end (argp);
598 /* Increment the number of errors, and check whether too many have
599 been printed. */
601 static void
602 gfc_increment_error_count (void)
604 errors++;
605 if ((gfc_option.max_errors != 0) && (errors >= gfc_option.max_errors))
606 gfc_fatal_error ("Error count reached limit of %d.", gfc_option.max_errors);
610 /* Issue a warning. */
612 void
613 gfc_warning (const char *nocmsgid, ...)
615 va_list argp;
617 if (inhibit_warnings)
618 return;
620 warning_buffer.flag = 1;
621 warning_buffer.index = 0;
622 cur_error_buffer = &warning_buffer;
624 va_start (argp, nocmsgid);
625 error_print (_("Warning:"), _(nocmsgid), argp);
626 va_end (argp);
628 error_char ('\0');
630 if (buffer_flag == 0)
632 warnings++;
633 if (warnings_are_errors)
634 gfc_increment_error_count();
639 /* Whether, for a feature included in a given standard set (GFC_STD_*),
640 we should issue an error or a warning, or be quiet. */
642 notification
643 gfc_notification_std (int std)
645 bool warning;
647 warning = ((gfc_option.warn_std & std) != 0) && !inhibit_warnings;
648 if ((gfc_option.allow_std & std) != 0 && !warning)
649 return SILENT;
651 return warning ? WARNING : ERROR;
655 /* Possibly issue a warning/error about use of a nonstandard (or deleted)
656 feature. An error/warning will be issued if the currently selected
657 standard does not contain the requested bits. Return FAILURE if
658 an error is generated. */
661 gfc_notify_std (int std, const char *nocmsgid, ...)
663 va_list argp;
664 bool warning;
666 warning = ((gfc_option.warn_std & std) != 0)
667 && !inhibit_warnings;
668 if ((gfc_option.allow_std & std) != 0
669 && !warning)
670 return SUCCESS;
672 if (gfc_suppress_error)
673 return warning ? SUCCESS : FAILURE;
675 cur_error_buffer = (warning && !warnings_are_errors)
676 ? &warning_buffer : &error_buffer;
677 cur_error_buffer->flag = 1;
678 cur_error_buffer->index = 0;
680 va_start (argp, nocmsgid);
681 if (warning)
682 error_print (_("Warning:"), _(nocmsgid), argp);
683 else
684 error_print (_("Error:"), _(nocmsgid), argp);
685 va_end (argp);
687 error_char ('\0');
689 if (buffer_flag == 0)
691 if (warning && !warnings_are_errors)
692 warnings++;
693 else
694 gfc_increment_error_count();
697 return (warning && !warnings_are_errors) ? SUCCESS : FAILURE;
701 /* Immediate warning (i.e. do not buffer the warning). */
703 void
704 gfc_warning_now (const char *nocmsgid, ...)
706 va_list argp;
707 int i;
709 if (inhibit_warnings)
710 return;
712 i = buffer_flag;
713 buffer_flag = 0;
714 warnings++;
715 if (warnings_are_errors)
716 gfc_increment_error_count();
718 va_start (argp, nocmsgid);
719 error_print (_("Warning:"), _(nocmsgid), argp);
720 va_end (argp);
722 error_char ('\0');
723 buffer_flag = i;
727 /* Clear the warning flag. */
729 void
730 gfc_clear_warning (void)
732 warning_buffer.flag = 0;
736 /* Check to see if any warnings have been saved.
737 If so, print the warning. */
739 void
740 gfc_warning_check (void)
742 if (warning_buffer.flag)
744 warnings++;
745 if (warning_buffer.message != NULL)
746 fputs (warning_buffer.message, stderr);
747 warning_buffer.flag = 0;
752 /* Issue an error. */
754 void
755 gfc_error (const char *nocmsgid, ...)
757 va_list argp;
759 if (gfc_suppress_error)
760 return;
762 error_buffer.flag = 1;
763 error_buffer.index = 0;
764 cur_error_buffer = &error_buffer;
766 va_start (argp, nocmsgid);
767 error_print (_("Error:"), _(nocmsgid), argp);
768 va_end (argp);
770 error_char ('\0');
772 if (buffer_flag == 0)
773 gfc_increment_error_count();
777 /* Immediate error. */
779 void
780 gfc_error_now (const char *nocmsgid, ...)
782 va_list argp;
783 int i;
785 error_buffer.flag = 1;
786 error_buffer.index = 0;
787 cur_error_buffer = &error_buffer;
789 i = buffer_flag;
790 buffer_flag = 0;
792 va_start (argp, nocmsgid);
793 error_print (_("Error:"), _(nocmsgid), argp);
794 va_end (argp);
796 error_char ('\0');
798 gfc_increment_error_count();
800 buffer_flag = i;
802 if (flag_fatal_errors)
803 exit (1);
807 /* Fatal error, never returns. */
809 void
810 gfc_fatal_error (const char *nocmsgid, ...)
812 va_list argp;
814 buffer_flag = 0;
816 va_start (argp, nocmsgid);
817 error_print (_("Fatal Error:"), _(nocmsgid), argp);
818 va_end (argp);
820 exit (3);
824 /* This shouldn't happen... but sometimes does. */
826 void
827 gfc_internal_error (const char *format, ...)
829 va_list argp;
831 buffer_flag = 0;
833 va_start (argp, format);
835 show_loci (&gfc_current_locus, NULL);
836 error_printf ("Internal Error at (1):");
838 error_print ("", format, argp);
839 va_end (argp);
841 exit (ICE_EXIT_CODE);
845 /* Clear the error flag when we start to compile a source line. */
847 void
848 gfc_clear_error (void)
850 error_buffer.flag = 0;
854 /* Tests the state of error_flag. */
857 gfc_error_flag_test (void)
859 return error_buffer.flag;
863 /* Check to see if any errors have been saved.
864 If so, print the error. Returns the state of error_flag. */
867 gfc_error_check (void)
869 int rc;
871 rc = error_buffer.flag;
873 if (error_buffer.flag)
875 if (error_buffer.message != NULL)
876 fputs (error_buffer.message, stderr);
877 error_buffer.flag = 0;
879 gfc_increment_error_count();
881 if (flag_fatal_errors)
882 exit (1);
885 return rc;
889 /* Save the existing error state. */
891 void
892 gfc_push_error (gfc_error_buf * err)
894 err->flag = error_buffer.flag;
895 if (error_buffer.flag)
896 err->message = xstrdup (error_buffer.message);
898 error_buffer.flag = 0;
902 /* Restore a previous pushed error state. */
904 void
905 gfc_pop_error (gfc_error_buf * err)
907 error_buffer.flag = err->flag;
908 if (error_buffer.flag)
910 size_t len = strlen (err->message) + 1;
911 gcc_assert (len <= error_buffer.allocated);
912 memcpy (error_buffer.message, err->message, len);
913 gfc_free (err->message);
918 /* Free a pushed error state, but keep the current error state. */
920 void
921 gfc_free_error (gfc_error_buf * err)
923 if (err->flag)
924 gfc_free (err->message);
928 /* Debug wrapper for printf. */
930 void
931 gfc_status (const char *cmsgid, ...)
933 va_list argp;
935 va_start (argp, cmsgid);
937 vprintf (_(cmsgid), argp);
939 va_end (argp);
943 /* Subroutine for outputting a single char so that we don't have to go
944 around creating a lot of 1-character strings. */
946 void
947 gfc_status_char (char c)
949 putchar (c);
953 /* Report the number of warnings and errors that occurred to the caller. */
955 void
956 gfc_get_errors (int *w, int *e)
958 if (w != NULL)
959 *w = warnings;
960 if (e != NULL)
961 *e = errors;