2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software 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 3, or (at your option) any later
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
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* Handle the inevitable errors. A major catch here is that things
23 flagged as errors in one match subroutine can conceivably be legal
24 elsewhere. This means that error messages are recorded and saved
25 for possible use later. If a line does not match a legal
26 construction, then the saved error message is reported. */
33 static int suppress_errors = 0;
35 static int terminal_width, buffer_flag, errors, warnings;
37 static gfc_error_buf error_buffer, warning_buffer, *cur_error_buffer;
40 /* Go one level deeper suppressing errors. */
43 gfc_push_suppress_errors (void)
45 gcc_assert (suppress_errors >= 0);
50 /* Leave one level of error suppressing. */
53 gfc_pop_suppress_errors (void)
55 gcc_assert (suppress_errors > 0);
60 /* Per-file error initialization. */
63 gfc_error_init_1 (void)
65 terminal_width = gfc_terminal_width ();
72 /* Set the flag for buffering errors or not. */
75 gfc_buffer_error (int flag)
81 /* Add a single character to the error buffer or output depending on
89 if (cur_error_buffer->index >= cur_error_buffer->allocated)
91 cur_error_buffer->allocated = cur_error_buffer->allocated
92 ? cur_error_buffer->allocated * 2 : 1000;
93 cur_error_buffer->message = XRESIZEVEC (char, cur_error_buffer->message,
94 cur_error_buffer->allocated);
96 cur_error_buffer->message[cur_error_buffer->index++] = c;
102 /* We build up complete lines before handing things
103 over to the library in order to speed up error printing. */
105 static size_t allocated = 0, index = 0;
107 if (index + 1 >= allocated)
109 allocated = allocated ? allocated * 2 : 1000;
110 line = XRESIZEVEC (char, line, allocated);
116 fputs (line, stderr);
124 /* Copy a string to wherever it needs to go. */
127 error_string (const char *p)
134 /* Print a formatted integer to the error buffer or output. */
139 error_uinteger (unsigned long int i)
141 char *p, int_buf[IBUF_LEN];
143 p = int_buf + IBUF_LEN - 1;
155 error_string (p + 1);
159 error_integer (long int i)
165 u = (unsigned long int) -i;
176 print_wide_char_into_buffer (gfc_char_t c, char *buf)
178 static const char xdigit[16] = { '0', '1', '2', '3', '4', '5', '6',
179 '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
181 if (gfc_wide_is_printable (c))
184 buf[0] = (unsigned char) c;
186 else if (c < ((gfc_char_t) 1 << 8))
189 buf[3] = xdigit[c & 0x0F];
191 buf[2] = xdigit[c & 0x0F];
196 else if (c < ((gfc_char_t) 1 << 16))
199 buf[5] = xdigit[c & 0x0F];
201 buf[4] = xdigit[c & 0x0F];
203 buf[3] = xdigit[c & 0x0F];
205 buf[2] = xdigit[c & 0x0F];
213 buf[9] = xdigit[c & 0x0F];
215 buf[8] = xdigit[c & 0x0F];
217 buf[7] = xdigit[c & 0x0F];
219 buf[6] = xdigit[c & 0x0F];
221 buf[5] = xdigit[c & 0x0F];
223 buf[4] = xdigit[c & 0x0F];
225 buf[3] = xdigit[c & 0x0F];
227 buf[2] = xdigit[c & 0x0F];
234 static char wide_char_print_buffer[11];
237 gfc_print_wide_char (gfc_char_t c)
239 print_wide_char_into_buffer (c, wide_char_print_buffer);
240 return wide_char_print_buffer;
244 /* Show the file, where it was included, and the source line, give a
245 locus. Calls error_printf() recursively, but the recursion is at
246 most one level deep. */
248 static void error_printf (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
251 show_locus (locus *loc, int c1, int c2)
258 /* TODO: Either limit the total length and number of included files
259 displayed or add buffering of arbitrary number of characters in
262 /* Write out the error header line, giving the source file and error
263 location (in GNU standard "[file]:[line].[column]:" format),
264 followed by an "included by" stack and a blank line. This header
265 format is matched by a testsuite parser defined in
266 lib/gfortran-dg.exp. */
271 error_string (f->filename);
274 error_integer (LOCATION_LINE (lb->location));
276 if ((c1 > 0) || (c2 > 0))
282 if ((c1 > 0) && (c2 > 0))
293 i = f->inclusion_line;
296 if (f == NULL) break;
298 error_printf (" Included at %s:%d:", f->filename, i);
303 /* Calculate an appropriate horizontal offset of the source line in
304 order to get the error locus within the visible portion of the
305 line. Note that if the margin of 5 here is changed, the
306 corresponding margin of 10 in show_loci should be changed. */
310 /* When the loci is not associated with a column, it will have a
311 value of zero. We adjust this to 1 so that it will appear. */
318 /* If the two loci would appear in the same column, we shift
319 '2' one column to the right, so as to print '12' rather than
320 just '1'. We do this here so it will be accounted for in the
321 margin calculations. */
326 cmax = (c1 < c2) ? c2 : c1;
327 if (cmax > terminal_width - 5)
328 offset = cmax - terminal_width + 5;
330 /* Show the line itself, taking care not to print more than what can
331 show up on the terminal. Tabs are converted to spaces, and
332 nonprintable characters are converted to a "\xNN" sequence. */
334 /* TODO: Although setting i to the terminal width is clever, it fails
335 to work correctly when nonprintable characters exist. A better
336 solution should be found. */
338 p = &(lb->line[offset]);
339 i = gfc_wide_strlen (p);
340 if (i > terminal_width)
341 i = terminal_width - 1;
345 static char buffer[11];
351 print_wide_char_into_buffer (c, buffer);
352 error_string (buffer);
357 /* Show the '1' and/or '2' corresponding to the column of the error
358 locus. Note that a value of -1 for c1 or c2 will simply cause
359 the relevant number not to be printed. */
364 for (i = 1; i <= cmax; i++)
379 /* As part of printing an error, we show the source lines that caused
380 the problem. We show at least one, and possibly two loci; the two
381 loci may or may not be on the same source line. */
384 show_loci (locus *l1, locus *l2)
388 if (l1 == NULL || l1->lb == NULL)
390 error_printf ("<During initialization>\n");
394 /* While calculating parameters for printing the loci, we consider possible
395 reasons for printing one per line. If appropriate, print the loci
396 individually; otherwise we print them both on the same line. */
398 c1 = l1->nextc - l1->lb->line;
401 show_locus (l1, c1, -1);
405 c2 = l2->nextc - l2->lb->line;
412 /* Note that the margin value of 10 here needs to be less than the
413 margin of 5 used in the calculation of offset in show_locus. */
415 if (l1->lb != l2->lb || m > terminal_width - 10)
417 show_locus (l1, c1, -1);
418 show_locus (l2, -1, c2);
422 show_locus (l1, c1, c2);
428 /* Workhorse for the error printing subroutines. This subroutine is
429 inspired by g77's error handling and is similar to printf() with
430 the following %-codes:
432 %c Character, %d or %i Integer, %s String, %% Percent
433 %L Takes locus argument
434 %C Current locus (no argument)
436 If a locus pointer is given, the actual source line is printed out
437 and the column is indicated. Since we want the error message at
438 the bottom of any source file information, we must scan the
439 argument list twice -- once to determine whether the loci are
440 present and record this for printing, and once to print the error
441 message after and loci have been printed. A maximum of two locus
442 arguments are permitted.
444 This function is also called (recursively) by show_locus in the
445 case of included files; however, as show_locus does not resupply
446 any loci, the recursion is at most one level deep. */
450 static void ATTRIBUTE_GCC_GFC(2,0)
451 error_print (const char *type, const char *format0, va_list argp)
453 enum { TYPE_CURRENTLOC, TYPE_LOCUS, TYPE_INTEGER, TYPE_UINTEGER,
454 TYPE_LONGINT, TYPE_ULONGINT, TYPE_CHAR, TYPE_STRING,
463 unsigned int uintval;
465 unsigned long int ulongintval;
467 const char * stringval;
469 } arg[MAX_ARGS], spec[MAX_ARGS];
470 /* spec is the array of specifiers, in the same order as they
471 appear in the format string. arg is the array of arguments,
472 in the same order as they appear in the va_list. */
475 int i, n, have_l1, pos, maxpos;
476 locus *l1, *l2, *loc;
488 for (i = 0; i < MAX_ARGS; i++)
490 arg[i].type = NOTYPE;
494 /* First parse the format string for position specifiers. */
507 if (ISDIGIT (*format))
509 /* This is a position specifier. For example, the number
510 12 in the format string "%12$d", which specifies the third
511 argument of the va_list, formatted in %d format.
512 For details, see "man 3 printf". */
513 pos = atoi(format) - 1;
514 gcc_assert (pos >= 0);
515 while (ISDIGIT(*format))
517 gcc_assert (*format++ == '$');
530 arg[pos].type = TYPE_CURRENTLOC;
534 arg[pos].type = TYPE_LOCUS;
539 arg[pos].type = TYPE_INTEGER;
543 arg[pos].type = TYPE_UINTEGER;
548 arg[pos].type = TYPE_ULONGINT;
549 else if (c == 'i' || c == 'd')
550 arg[pos].type = TYPE_LONGINT;
556 arg[pos].type = TYPE_CHAR;
560 arg[pos].type = TYPE_STRING;
570 /* Then convert the values for each %-style argument. */
571 for (pos = 0; pos <= maxpos; pos++)
573 gcc_assert (arg[pos].type != NOTYPE);
574 switch (arg[pos].type)
576 case TYPE_CURRENTLOC:
577 loc = &gfc_current_locus;
581 if (arg[pos].type == TYPE_LOCUS)
582 loc = va_arg (argp, locus *);
587 arg[pos].u.stringval = "(2)";
593 arg[pos].u.stringval = "(1)";
598 arg[pos].u.intval = va_arg (argp, int);
602 arg[pos].u.uintval = va_arg (argp, unsigned int);
606 arg[pos].u.longintval = va_arg (argp, long int);
610 arg[pos].u.ulongintval = va_arg (argp, unsigned long int);
614 arg[pos].u.charval = (char) va_arg (argp, int);
618 arg[pos].u.stringval = (const char *) va_arg (argp, char *);
626 for (n = 0; spec[n].pos >= 0; n++)
627 spec[n].u = arg[spec[n].pos].u;
629 /* Show the current loci if we have to. */
643 for (; *format; format++)
647 error_char (*format);
652 if (ISDIGIT (*format))
654 /* This is a position specifier. See comment above. */
655 while (ISDIGIT (*format))
658 /* Skip over the dollar sign. */
669 error_char (spec[n++].u.charval);
673 case 'C': /* Current locus */
674 case 'L': /* Specified locus */
675 error_string (spec[n++].u.stringval);
680 error_integer (spec[n++].u.intval);
684 error_uinteger (spec[n++].u.uintval);
690 error_uinteger (spec[n++].u.ulongintval);
692 error_integer (spec[n++].u.longintval);
702 /* Wrapper for error_print(). */
705 error_printf (const char *nocmsgid, ...)
709 va_start (argp, nocmsgid);
710 error_print ("", _(nocmsgid), argp);
715 /* Increment the number of errors, and check whether too many have
719 gfc_increment_error_count (void)
722 if ((gfc_option.max_errors != 0) && (errors >= gfc_option.max_errors))
723 gfc_fatal_error ("Error count reached limit of %d.", gfc_option.max_errors);
727 /* Issue a warning. */
730 gfc_warning (const char *nocmsgid, ...)
734 if (inhibit_warnings)
737 warning_buffer.flag = 1;
738 warning_buffer.index = 0;
739 cur_error_buffer = &warning_buffer;
741 va_start (argp, nocmsgid);
742 error_print (_("Warning:"), _(nocmsgid), argp);
747 if (buffer_flag == 0)
750 if (warnings_are_errors)
751 gfc_increment_error_count();
756 /* Whether, for a feature included in a given standard set (GFC_STD_*),
757 we should issue an error or a warning, or be quiet. */
760 gfc_notification_std (int std)
764 warning = ((gfc_option.warn_std & std) != 0) && !inhibit_warnings;
765 if ((gfc_option.allow_std & std) != 0 && !warning)
768 return warning ? WARNING : ERROR;
772 /* Possibly issue a warning/error about use of a nonstandard (or deleted)
773 feature. An error/warning will be issued if the currently selected
774 standard does not contain the requested bits. Return FAILURE if
775 an error is generated. */
778 gfc_notify_std (int std, const char *nocmsgid, ...)
783 warning = ((gfc_option.warn_std & std) != 0) && !inhibit_warnings;
784 if ((gfc_option.allow_std & std) != 0 && !warning)
788 return warning ? SUCCESS : FAILURE;
790 cur_error_buffer = warning ? &warning_buffer : &error_buffer;
791 cur_error_buffer->flag = 1;
792 cur_error_buffer->index = 0;
794 va_start (argp, nocmsgid);
796 error_print (_("Warning:"), _(nocmsgid), argp);
798 error_print (_("Error:"), _(nocmsgid), argp);
803 if (buffer_flag == 0)
805 if (warning && !warnings_are_errors)
808 gfc_increment_error_count();
811 return (warning && !warnings_are_errors) ? SUCCESS : FAILURE;
815 /* Immediate warning (i.e. do not buffer the warning). */
818 gfc_warning_now (const char *nocmsgid, ...)
823 if (inhibit_warnings)
829 if (warnings_are_errors)
830 gfc_increment_error_count();
832 va_start (argp, nocmsgid);
833 error_print (_("Warning:"), _(nocmsgid), argp);
841 /* Clear the warning flag. */
844 gfc_clear_warning (void)
846 warning_buffer.flag = 0;
850 /* Check to see if any warnings have been saved.
851 If so, print the warning. */
854 gfc_warning_check (void)
856 if (warning_buffer.flag)
859 if (warning_buffer.message != NULL)
860 fputs (warning_buffer.message, stderr);
861 warning_buffer.flag = 0;
866 /* Issue an error. */
869 gfc_error (const char *nocmsgid, ...)
876 error_buffer.flag = 1;
877 error_buffer.index = 0;
878 cur_error_buffer = &error_buffer;
880 va_start (argp, nocmsgid);
881 error_print (_("Error:"), _(nocmsgid), argp);
886 if (buffer_flag == 0)
887 gfc_increment_error_count();
891 /* Immediate error. */
894 gfc_error_now (const char *nocmsgid, ...)
899 error_buffer.flag = 1;
900 error_buffer.index = 0;
901 cur_error_buffer = &error_buffer;
906 va_start (argp, nocmsgid);
907 error_print (_("Error:"), _(nocmsgid), argp);
912 gfc_increment_error_count();
916 if (flag_fatal_errors)
921 /* Fatal error, never returns. */
924 gfc_fatal_error (const char *nocmsgid, ...)
930 va_start (argp, nocmsgid);
931 error_print (_("Fatal Error:"), _(nocmsgid), argp);
938 /* This shouldn't happen... but sometimes does. */
941 gfc_internal_error (const char *format, ...)
947 va_start (argp, format);
949 show_loci (&gfc_current_locus, NULL);
950 error_printf ("Internal Error at (1):");
952 error_print ("", format, argp);
955 exit (ICE_EXIT_CODE);
959 /* Clear the error flag when we start to compile a source line. */
962 gfc_clear_error (void)
964 error_buffer.flag = 0;
968 /* Tests the state of error_flag. */
971 gfc_error_flag_test (void)
973 return error_buffer.flag;
977 /* Check to see if any errors have been saved.
978 If so, print the error. Returns the state of error_flag. */
981 gfc_error_check (void)
985 rc = error_buffer.flag;
987 if (error_buffer.flag)
989 if (error_buffer.message != NULL)
990 fputs (error_buffer.message, stderr);
991 error_buffer.flag = 0;
993 gfc_increment_error_count();
995 if (flag_fatal_errors)
1003 /* Save the existing error state. */
1006 gfc_push_error (gfc_error_buf *err)
1008 err->flag = error_buffer.flag;
1009 if (error_buffer.flag)
1010 err->message = xstrdup (error_buffer.message);
1012 error_buffer.flag = 0;
1016 /* Restore a previous pushed error state. */
1019 gfc_pop_error (gfc_error_buf *err)
1021 error_buffer.flag = err->flag;
1022 if (error_buffer.flag)
1024 size_t len = strlen (err->message) + 1;
1025 gcc_assert (len <= error_buffer.allocated);
1026 memcpy (error_buffer.message, err->message, len);
1027 gfc_free (err->message);
1032 /* Free a pushed error state, but keep the current error state. */
1035 gfc_free_error (gfc_error_buf *err)
1038 gfc_free (err->message);
1042 /* Report the number of warnings and errors that occurred to the caller. */
1045 gfc_get_errors (int *w, int *e)