Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 1 | /* Default error handlers for CPP Library. |
Neil Booth | 5d8ebbd | 2002-01-03 21:43:09 +0000 | [diff] [blame] | 2 | Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998, 1999, 2000, |
Tom Tromey | bf048be | 2008-04-18 00:58:58 +0000 | [diff] [blame] | 3 | 2001, 2002, 2004, 2008 Free Software Foundation, Inc. |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 4 | Written by Per Bothner, 1994. |
Jeff Law | 38e0125 | 1998-05-06 15:09:07 -0600 | [diff] [blame] | 5 | Based on CCCP program by Paul Rubin, June 1986 |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 6 | Adapted to ANSI C, Richard Stallman, Jan 1987 |
| 7 | |
| 8 | This program 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 |
| 10 | Free Software Foundation; either version 2, or (at your option) any |
| 11 | later version. |
| 12 | |
| 13 | This program is distributed in the hope that it will be useful, |
| 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | GNU General Public License for more details. |
| 17 | |
| 18 | You should have received a copy of the GNU General Public License |
| 19 | along with this program; if not, write to the Free Software |
Kelley Cook | 200031d | 2005-06-29 02:34:39 +0000 | [diff] [blame] | 20 | Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 21 | |
| 22 | In other words, you are welcome to use, share and improve this program. |
| 23 | You are forbidden to forbid anyone else to use, share and improve |
| 24 | what you give them. Help stamp out software-hoarding! */ |
| 25 | |
Richard Kenner | 84ee6fd | 1995-05-16 18:02:38 -0400 | [diff] [blame] | 26 | #include "config.h" |
Kaveh R. Ghazi | b04cd507 | 1998-03-30 12:05:54 +0000 | [diff] [blame] | 27 | #include "system.h" |
Richard Kenner | f32da1f | 1995-05-20 06:51:33 -0400 | [diff] [blame] | 28 | #include "cpplib.h" |
Paolo Bonzini | 4f4e53dd | 2004-05-24 10:50:45 +0000 | [diff] [blame] | 29 | #include "internal.h" |
Richard Kenner | f32da1f | 1995-05-20 06:51:33 -0400 | [diff] [blame] | 30 | |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 31 | static void print_location (cpp_reader *, source_location, unsigned int); |
Philipp Thomas | 146ef88 | 2001-04-22 22:33:45 +0000 | [diff] [blame] | 32 | |
Neil Booth | 5d8ebbd | 2002-01-03 21:43:09 +0000 | [diff] [blame] | 33 | /* Print the logical file location (LINE, COL) in preparation for a |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 34 | diagnostic. Outputs the #include chain if it has changed. A line |
| 35 | of zero suppresses the include stack, and outputs the program name |
| 36 | instead. */ |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 37 | static void |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 38 | print_location (cpp_reader *pfile, source_location line, unsigned int col) |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 39 | { |
Per Bothner | 75ee800 | 2003-08-28 00:21:34 +0000 | [diff] [blame] | 40 | if (line == 0) |
Neil Booth | 0bda476 | 2000-12-11 07:45:16 +0000 | [diff] [blame] | 41 | fprintf (stderr, "%s: ", progname); |
Neil Booth | 14fbab6 | 2000-11-17 19:21:15 +0000 | [diff] [blame] | 42 | else |
Neil Booth | 0bda476 | 2000-12-11 07:45:16 +0000 | [diff] [blame] | 43 | { |
Neil Booth | bb74c96 | 2001-08-17 22:23:49 +0000 | [diff] [blame] | 44 | const struct line_map *map; |
Manuel López-Ibáñez | 1bb6466 | 2008-07-21 09:33:38 +0000 | [diff] [blame] | 45 | linenum_type lin; |
Neil Booth | 0bda476 | 2000-12-11 07:45:16 +0000 | [diff] [blame] | 46 | |
Per Bothner | 50f59cd | 2004-01-19 21:30:18 -0800 | [diff] [blame] | 47 | map = linemap_lookup (pfile->line_table, line); |
| 48 | linemap_print_containing_files (pfile->line_table, map); |
Neil Booth | d82fc10 | 2001-08-02 23:03:31 +0000 | [diff] [blame] | 49 | |
Per Bothner | dc3786d | 2003-08-26 22:53:22 +0000 | [diff] [blame] | 50 | lin = SOURCE_LINE (map, line); |
Neil Booth | bb74c96 | 2001-08-17 22:23:49 +0000 | [diff] [blame] | 51 | if (col == 0) |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 52 | { |
| 53 | col = SOURCE_COLUMN (map, line); |
| 54 | if (col == 0) |
| 55 | col = 1; |
| 56 | } |
Neil Booth | 0bda476 | 2000-12-11 07:45:16 +0000 | [diff] [blame] | 57 | |
Per Bothner | dc3786d | 2003-08-26 22:53:22 +0000 | [diff] [blame] | 58 | if (lin == 0) |
Neil Booth | bb74c96 | 2001-08-17 22:23:49 +0000 | [diff] [blame] | 59 | fprintf (stderr, "%s:", map->to_file); |
Neil Booth | 0bda476 | 2000-12-11 07:45:16 +0000 | [diff] [blame] | 60 | else if (CPP_OPTION (pfile, show_column) == 0) |
Per Bothner | dc3786d | 2003-08-26 22:53:22 +0000 | [diff] [blame] | 61 | fprintf (stderr, "%s:%u:", map->to_file, lin); |
Neil Booth | 0bda476 | 2000-12-11 07:45:16 +0000 | [diff] [blame] | 62 | else |
Per Bothner | dc3786d | 2003-08-26 22:53:22 +0000 | [diff] [blame] | 63 | fprintf (stderr, "%s:%u:%u:", map->to_file, lin, col); |
Neil Booth | 0bda476 | 2000-12-11 07:45:16 +0000 | [diff] [blame] | 64 | |
Neil Booth | d82fc10 | 2001-08-02 23:03:31 +0000 | [diff] [blame] | 65 | fputc (' ', stderr); |
Neil Booth | 0bda476 | 2000-12-11 07:45:16 +0000 | [diff] [blame] | 66 | } |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 67 | } |
| 68 | |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 69 | /* Set up for a diagnostic: print the file and line, bump the error |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 70 | counter, etc. SRC_LOC is the logical line number; zero means to print |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 71 | at the location of the previously lexed token, which tends to be |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 72 | the correct place by default. The column number can be specified either |
| 73 | using COLUMN or (if COLUMN==0) extracting SOURCE_COLUMN from SRC_LOC. |
| 74 | (This may seem redundant, but is useful when pre-scanning (cleaning) a line, |
| 75 | when we haven't yet verified whether the current line_map has a |
| 76 | big enough max_column_hint.) |
| 77 | |
| 78 | Returns 0 if the error has been suppressed. */ |
Tom Tromey | 5d6342e | 2008-05-21 21:52:57 +0000 | [diff] [blame] | 79 | static int |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 80 | _cpp_begin_message (cpp_reader *pfile, int code, |
| 81 | source_location src_loc, unsigned int column) |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 82 | { |
John David Anglin | 0527bc4 | 2003-11-01 22:56:54 +0000 | [diff] [blame] | 83 | int level = CPP_DL_EXTRACT (code); |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 84 | |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 85 | switch (level) |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 86 | { |
John David Anglin | 0527bc4 | 2003-11-01 22:56:54 +0000 | [diff] [blame] | 87 | case CPP_DL_WARNING: |
| 88 | case CPP_DL_PEDWARN: |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 89 | if (cpp_in_system_header (pfile) |
Neil Booth | d809068 | 2000-09-28 05:55:22 +0000 | [diff] [blame] | 90 | && ! CPP_OPTION (pfile, warn_system_headers)) |
| 91 | return 0; |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 92 | /* Fall through. */ |
| 93 | |
John David Anglin | 0527bc4 | 2003-11-01 22:56:54 +0000 | [diff] [blame] | 94 | case CPP_DL_WARNING_SYSHDR: |
Chris Demetriou | c933c20 | 2001-01-23 19:20:14 +0000 | [diff] [blame] | 95 | if (CPP_OPTION (pfile, warnings_are_errors) |
John David Anglin | 0527bc4 | 2003-11-01 22:56:54 +0000 | [diff] [blame] | 96 | || (level == CPP_DL_PEDWARN && CPP_OPTION (pfile, pedantic_errors))) |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 97 | { |
| 98 | if (CPP_OPTION (pfile, inhibit_errors)) |
| 99 | return 0; |
John David Anglin | 0527bc4 | 2003-11-01 22:56:54 +0000 | [diff] [blame] | 100 | level = CPP_DL_ERROR; |
Neil Booth | bdee42b | 2002-05-23 06:07:45 +0000 | [diff] [blame] | 101 | pfile->errors++; |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 102 | } |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 103 | else if (CPP_OPTION (pfile, inhibit_warnings)) |
| 104 | return 0; |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 105 | break; |
Kazu Hirata | df38348 | 2002-05-22 22:02:16 +0000 | [diff] [blame] | 106 | |
John David Anglin | 0527bc4 | 2003-11-01 22:56:54 +0000 | [diff] [blame] | 107 | case CPP_DL_ERROR: |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 108 | if (CPP_OPTION (pfile, inhibit_errors)) |
| 109 | return 0; |
Neil Booth | bdee42b | 2002-05-23 06:07:45 +0000 | [diff] [blame] | 110 | /* ICEs cannot be inhibited. */ |
John David Anglin | 0527bc4 | 2003-11-01 22:56:54 +0000 | [diff] [blame] | 111 | case CPP_DL_ICE: |
Neil Booth | bdee42b | 2002-05-23 06:07:45 +0000 | [diff] [blame] | 112 | pfile->errors++; |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 113 | break; |
| 114 | } |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 115 | |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 116 | print_location (pfile, src_loc, column); |
John David Anglin | 0527bc4 | 2003-11-01 22:56:54 +0000 | [diff] [blame] | 117 | if (CPP_DL_WARNING_P (level)) |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 118 | fputs (_("warning: "), stderr); |
John David Anglin | 0527bc4 | 2003-11-01 22:56:54 +0000 | [diff] [blame] | 119 | else if (level == CPP_DL_ICE) |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 120 | fputs (_("internal error: "), stderr); |
Joseph Myers | ac24fc2 | 2004-10-14 01:56:22 +0100 | [diff] [blame] | 121 | else |
| 122 | fputs (_("error: "), stderr); |
Jeffrey A Law | ab87f8c | 1999-01-27 01:43:17 +0000 | [diff] [blame] | 123 | |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 124 | return 1; |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 125 | } |
| 126 | |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 127 | /* Don't remove the blank before do, as otherwise the exgettext |
| 128 | script will mistake this as a function definition */ |
| 129 | #define v_message(msgid, ap) \ |
| 130 | do { vfprintf (stderr, _(msgid), ap); putc ('\n', stderr); } while (0) |
| 131 | |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 132 | /* Exported interface. */ |
| 133 | |
Neil Booth | 5d8ebbd | 2002-01-03 21:43:09 +0000 | [diff] [blame] | 134 | /* Print an error at the location of the previously lexed token. */ |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 135 | void |
Kaveh R. Ghazi | e34d07f | 2003-05-17 22:21:35 +0000 | [diff] [blame] | 136 | cpp_error (cpp_reader * pfile, int level, const char *msgid, ...) |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 137 | { |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 138 | source_location src_loc; |
Kaveh R. Ghazi | e34d07f | 2003-05-17 22:21:35 +0000 | [diff] [blame] | 139 | va_list ap; |
| 140 | |
| 141 | va_start (ap, msgid); |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 142 | |
Joseph Myers | 178b58b | 2005-11-03 23:08:18 +0000 | [diff] [blame] | 143 | if (CPP_OPTION (pfile, client_diagnostic)) |
Joseph Myers | a63607e | 2005-11-04 01:16:32 +0000 | [diff] [blame] | 144 | pfile->cb.error (pfile, level, _(msgid), &ap); |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 145 | else |
Per Bothner | 75ee800 | 2003-08-28 00:21:34 +0000 | [diff] [blame] | 146 | { |
Joseph Myers | 178b58b | 2005-11-03 23:08:18 +0000 | [diff] [blame] | 147 | if (CPP_OPTION (pfile, traditional)) |
| 148 | { |
| 149 | if (pfile->state.in_directive) |
| 150 | src_loc = pfile->directive_line; |
| 151 | else |
| 152 | src_loc = pfile->line_table->highest_line; |
| 153 | } |
Tom Tromey | bf048be | 2008-04-18 00:58:58 +0000 | [diff] [blame] | 154 | /* We don't want to refer to a token before the beginning of the |
| 155 | current run -- that is invalid. */ |
| 156 | else if (pfile->cur_token == pfile->cur_run->base) |
| 157 | { |
| 158 | if (pfile->cur_run->prev != NULL) |
| 159 | src_loc = pfile->cur_run->prev->limit->src_loc; |
| 160 | else |
| 161 | src_loc = 0; |
| 162 | } |
Joseph Myers | 178b58b | 2005-11-03 23:08:18 +0000 | [diff] [blame] | 163 | else |
| 164 | { |
| 165 | src_loc = pfile->cur_token[-1].src_loc; |
| 166 | } |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 167 | |
Joseph Myers | 178b58b | 2005-11-03 23:08:18 +0000 | [diff] [blame] | 168 | if (_cpp_begin_message (pfile, level, src_loc, 0)) |
| 169 | v_message (msgid, ap); |
| 170 | } |
Zack Weinberg | b649398 | 2001-08-18 20:46:45 +0000 | [diff] [blame] | 171 | |
Kaveh R. Ghazi | e34d07f | 2003-05-17 22:21:35 +0000 | [diff] [blame] | 172 | va_end (ap); |
Per Bothner | 7f2935c | 1995-03-16 13:59:07 -0800 | [diff] [blame] | 173 | } |
Jeffrey A Law | ab87f8c | 1999-01-27 01:43:17 +0000 | [diff] [blame] | 174 | |
Neil Booth | 5d8ebbd | 2002-01-03 21:43:09 +0000 | [diff] [blame] | 175 | /* Print an error at a specific location. */ |
Jeffrey A Law | ab87f8c | 1999-01-27 01:43:17 +0000 | [diff] [blame] | 176 | void |
Kaveh R. Ghazi | e34d07f | 2003-05-17 22:21:35 +0000 | [diff] [blame] | 177 | cpp_error_with_line (cpp_reader *pfile, int level, |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 178 | source_location src_loc, unsigned int column, |
Kaveh R. Ghazi | e34d07f | 2003-05-17 22:21:35 +0000 | [diff] [blame] | 179 | const char *msgid, ...) |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 180 | { |
Kaveh R. Ghazi | e34d07f | 2003-05-17 22:21:35 +0000 | [diff] [blame] | 181 | va_list ap; |
| 182 | |
| 183 | va_start (ap, msgid); |
Jeffrey A Law | ab87f8c | 1999-01-27 01:43:17 +0000 | [diff] [blame] | 184 | |
Per Bothner | 12f9df4 | 2004-02-11 07:29:30 -0800 | [diff] [blame] | 185 | if (_cpp_begin_message (pfile, level, src_loc, column)) |
Zack Weinberg | 58fea6a | 2000-08-02 01:13:45 +0000 | [diff] [blame] | 186 | v_message (msgid, ap); |
Zack Weinberg | b649398 | 2001-08-18 20:46:45 +0000 | [diff] [blame] | 187 | |
Kaveh R. Ghazi | e34d07f | 2003-05-17 22:21:35 +0000 | [diff] [blame] | 188 | va_end (ap); |
Jeffrey A Law | ab87f8c | 1999-01-27 01:43:17 +0000 | [diff] [blame] | 189 | } |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 190 | |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 191 | void |
Zack Weinberg | 6cf87ca | 2003-06-17 06:17:44 +0000 | [diff] [blame] | 192 | cpp_errno (cpp_reader *pfile, int level, const char *msgid) |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 193 | { |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 194 | if (msgid[0] == '\0') |
| 195 | msgid = _("stdout"); |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 196 | |
Neil Booth | ebef4e8 | 2002-04-14 18:42:47 +0000 | [diff] [blame] | 197 | cpp_error (pfile, level, "%s: %s", msgid, xstrerror (errno)); |
Zack Weinberg | c1212d2 | 2000-02-06 23:46:18 +0000 | [diff] [blame] | 198 | } |