]>
Commit | Line | Data |
---|---|---|
993ca5a5 | 1 | /* Various declarations for language-independent diagnostics subroutines. |
7f5f3953 | 2 | Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 |
71e45bc2 | 3 | 2010, 2011, 2012 Free Software Foundation, Inc. |
993ca5a5 | 4 | Contributed by Gabriel Dos Reis <gdr@codesourcery.com> |
5 | ||
f12b58b3 | 6 | This file is part of GCC. |
993ca5a5 | 7 | |
f12b58b3 | 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 | |
8c4c00c1 | 10 | Software Foundation; either version 3, or (at your option) any later |
f12b58b3 | 11 | version. |
993ca5a5 | 12 | |
f12b58b3 | 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. | |
993ca5a5 | 17 | |
18 | You should have received a copy of the GNU General Public License | |
8c4c00c1 | 19 | along with GCC; see the file COPYING3. If not see |
20 | <http://www.gnu.org/licenses/>. */ | |
993ca5a5 | 21 | |
2a281353 | 22 | #ifndef GCC_DIAGNOSTIC_H |
23 | #define GCC_DIAGNOSTIC_H | |
993ca5a5 | 24 | |
aa6db498 | 25 | #include "pretty-print.h" |
852f689e | 26 | #include "diagnostic-core.h" |
79bef68a | 27 | |
25e2ffe1 | 28 | /* A diagnostic is described by the MESSAGE to send, the FILE and LINE of |
29 | its context and its KIND (ice, error, warning, note, ...) See complete | |
30 | list in diagnostic.def. */ | |
b8c23db3 | 31 | typedef struct diagnostic_info |
25e2ffe1 | 32 | { |
33 | text_info message; | |
34 | location_t location; | |
7f5f3953 | 35 | unsigned int override_column; |
ce084dfc | 36 | /* Auxiliary data for client. */ |
37 | void *x_data; | |
25e2ffe1 | 38 | /* The kind of diagnostic it is about. */ |
39 | diagnostic_t kind; | |
efb9d9ee | 40 | /* Which OPT_* directly controls this diagnostic. */ |
41 | int option_index; | |
25e2ffe1 | 42 | } diagnostic_info; |
43 | ||
0955be65 | 44 | /* Each time a diagnostic's classification is changed with a pragma, |
45 | we record the change and the location of the change in an array of | |
46 | these structs. */ | |
47 | typedef struct diagnostic_classification_change_t | |
48 | { | |
49 | location_t location; | |
50 | int option; | |
51 | diagnostic_t kind; | |
52 | } diagnostic_classification_change_t; | |
53 | ||
25e2ffe1 | 54 | /* Forward declarations. */ |
d598ad0d | 55 | typedef void (*diagnostic_starter_fn) (diagnostic_context *, |
56 | diagnostic_info *); | |
25e2ffe1 | 57 | typedef diagnostic_starter_fn diagnostic_finalizer_fn; |
58 | ||
b52baaa6 | 59 | /* This data structure bundles altogether any information relevant to |
92d99247 | 60 | the context of a diagnostic message. */ |
61 | struct diagnostic_context | |
62 | { | |
ca1fae79 | 63 | /* Where most of the diagnostic formatting work is done. */ |
aa6db498 | 64 | pretty_printer *printer; |
ce601f29 | 65 | |
5397e5a3 | 66 | /* The number of times we have issued diagnostics. */ |
67 | int diagnostic_count[DK_LAST_DIAGNOSTIC_KIND]; | |
68 | ||
a787dd05 | 69 | /* True if we should display the "warnings are being tread as error" |
70 | message, usually displayed once per compiler run. */ | |
543725f3 | 71 | bool some_warnings_are_errors; |
48e1416a | 72 | |
096f40ca | 73 | /* True if it has been requested that warnings be treated as errors. */ |
74 | bool warning_as_error_requested; | |
a787dd05 | 75 | |
3c6a9715 | 76 | /* The number of option indexes that can be passed to warning() et |
77 | al. */ | |
78 | int n_opts; | |
79 | ||
80 | /* For each option index that can be passed to warning() et al | |
81 | (OPT_* from options.h when using this code with the core GCC | |
82 | options), this array may contain a new kind that the diagnostic | |
83 | should be changed to before reporting, or DK_UNSPECIFIED to leave | |
84 | it as the reported kind, or DK_IGNORED to not report it at | |
85 | all. */ | |
86 | diagnostic_t *classify_diagnostic; | |
76f02516 | 87 | |
0955be65 | 88 | /* History of all changes to the classifications above. This list |
89 | is stored in location-order, so we can search it, either | |
90 | binary-wise or end-to-front, to find the most recent | |
91 | classification for a given diagnostic, given the location of the | |
92 | diagnostic. */ | |
93 | diagnostic_classification_change_t *classification_history; | |
94 | ||
95 | /* The size of the above array. */ | |
96 | int n_classification_history; | |
97 | ||
98 | /* For pragma push/pop. */ | |
99 | int *push_list; | |
100 | int n_push; | |
101 | ||
5a983084 | 102 | /* True if we should print the source line with a caret indicating |
103 | the location. */ | |
104 | bool show_caret; | |
105 | ||
106 | /* Maximum width of the source line printed. */ | |
107 | int caret_max_width; | |
108 | ||
b0932b2f | 109 | /* True if we should print the command line option which controls |
110 | each diagnostic, if known. */ | |
111 | bool show_option_requested; | |
112 | ||
5f07bab0 | 113 | /* True if we should raise a SIGABRT on errors. */ |
114 | bool abort_on_error; | |
115 | ||
2c2efebb | 116 | /* True if we should show the column number on diagnostics. */ |
117 | bool show_column; | |
118 | ||
119 | /* True if pedwarns are errors. */ | |
120 | bool pedantic_errors; | |
121 | ||
122 | /* True if permerrors are warnings. */ | |
123 | bool permissive; | |
124 | ||
3c6a9715 | 125 | /* The index of the option to associate with turning permerrors into |
126 | warnings. */ | |
127 | int opt_permissive; | |
128 | ||
2c2efebb | 129 | /* True if errors are fatal. */ |
130 | bool fatal_errors; | |
131 | ||
3c6a9715 | 132 | /* True if all warnings should be disabled. */ |
5ae82d58 | 133 | bool dc_inhibit_warnings; |
3c6a9715 | 134 | |
135 | /* True if warnings should be given in system headers. */ | |
5ae82d58 | 136 | bool dc_warn_system_headers; |
3c6a9715 | 137 | |
566d7c74 | 138 | /* Maximum number of errors to report. */ |
139 | unsigned int max_errors; | |
140 | ||
92d99247 | 141 | /* This function is called before any message is printed out. It is |
b52baaa6 | 142 | responsible for preparing message prefix and such. For example, it |
92d99247 | 143 | might say: |
144 | In file included from "/usr/local/include/curses.h:5: | |
145 | from "/home/gdr/src/nifty_printer.h:56: | |
146 | ... | |
147 | */ | |
25e2ffe1 | 148 | diagnostic_starter_fn begin_diagnostic; |
92d99247 | 149 | |
a7dce381 | 150 | /* This function is called after the diagnostic message is printed. */ |
25e2ffe1 | 151 | diagnostic_finalizer_fn end_diagnostic; |
92d99247 | 152 | |
c003992a | 153 | /* Client hook to report an internal error. */ |
1f63d337 | 154 | void (*internal_error) (diagnostic_context *, const char *, va_list *); |
c003992a | 155 | |
3c6a9715 | 156 | /* Client hook to say whether the option controlling a diagnostic is |
157 | enabled. Returns nonzero if enabled, zero if disabled. */ | |
2c5d2e39 | 158 | int (*option_enabled) (int, void *); |
159 | ||
160 | /* Client information to pass as second argument to | |
161 | option_enabled. */ | |
162 | void *option_state; | |
3c6a9715 | 163 | |
164 | /* Client hook to return the name of an option that controls a | |
165 | diagnostic. Returns malloced memory. The first diagnostic_t | |
166 | argument is the kind of diagnostic before any reclassification | |
167 | (of warnings as errors, etc.); the second is the kind after any | |
168 | reclassification. May return NULL if no name is to be printed. | |
169 | May be passed 0 as well as the index of a particular option. */ | |
170 | char *(*option_name) (diagnostic_context *, int, diagnostic_t, diagnostic_t); | |
171 | ||
ce084dfc | 172 | /* Auxiliary data for client. */ |
173 | void *x_data; | |
25e2ffe1 | 174 | |
d834564a | 175 | /* Used to detect that the last caret was printed at the same location. */ |
176 | location_t last_location; | |
177 | ||
26cb3d1c | 178 | /* Used to detect when the input file stack has changed since last |
179 | described. */ | |
180 | const struct line_map *last_module; | |
25e2ffe1 | 181 | |
182 | int lock; | |
16b4d5bb | 183 | |
184 | bool inhibit_notes_p; | |
92d99247 | 185 | }; |
186 | ||
16b4d5bb | 187 | static inline void |
188 | diagnostic_inhibit_notes (diagnostic_context * context) | |
189 | { | |
190 | context->inhibit_notes_p = true; | |
191 | } | |
192 | ||
193 | ||
910f6d8f | 194 | /* Client supplied function to announce a diagnostic. */ |
92d99247 | 195 | #define diagnostic_starter(DC) (DC)->begin_diagnostic |
910f6d8f | 196 | |
197 | /* Client supplied function called after a diagnostic message is | |
198 | displayed. */ | |
92d99247 | 199 | #define diagnostic_finalizer(DC) (DC)->end_diagnostic |
910f6d8f | 200 | |
ce084dfc | 201 | /* Extension hooks for client. */ |
202 | #define diagnostic_context_auxiliary_data(DC) (DC)->x_data | |
203 | #define diagnostic_info_auxiliary_data(DI) (DI)->x_data | |
910f6d8f | 204 | |
aa6db498 | 205 | /* Same as pp_format_decoder. Works on 'diagnostic_context *'. */ |
0de2b732 | 206 | #define diagnostic_format_decoder(DC) ((DC)->printer->format_decoder) |
910f6d8f | 207 | |
06c7407c | 208 | /* Same as output_prefixing_rule. Works on 'diagnostic_context *'. */ |
c907c5b1 | 209 | #define diagnostic_prefixing_rule(DC) ((DC)->printer->wrapping.rule) |
92d99247 | 210 | |
b165d8b0 | 211 | /* Maximum characters per line in automatic line wrapping mode. |
88b5b080 | 212 | Zero means don't wrap lines. */ |
c907c5b1 | 213 | #define diagnostic_line_cutoff(DC) ((DC)->printer->wrapping.line_cutoff) |
aa6db498 | 214 | |
0de2b732 | 215 | #define diagnostic_flush_buffer(DC) pp_base_flush ((DC)->printer) |
06c7407c | 216 | |
25e2ffe1 | 217 | /* True if the last module or file in which a diagnostic was reported is |
218 | different from the current one. */ | |
26cb3d1c | 219 | #define diagnostic_last_module_changed(DC, MAP) \ |
220 | ((DC)->last_module != MAP) | |
06c7407c | 221 | |
25e2ffe1 | 222 | /* Remember the current module or file as being the last one in which we |
223 | report a diagnostic. */ | |
26cb3d1c | 224 | #define diagnostic_set_last_module(DC, MAP) \ |
225 | (DC)->last_module = MAP | |
990339dd | 226 | |
5f07bab0 | 227 | /* Raise SIGABRT on any diagnostic of severity DK_ERROR or higher. */ |
228 | #define diagnostic_abort_on_error(DC) \ | |
229 | (DC)->abort_on_error = true | |
230 | ||
5397e5a3 | 231 | /* This diagnostic_context is used by front-ends that directly output |
990339dd | 232 | diagnostic messages without going through `error', `warning', |
910f6d8f | 233 | and similar functions. */ |
ce601f29 | 234 | extern diagnostic_context *global_dc; |
990339dd | 235 | |
5f07bab0 | 236 | /* The total count of a KIND of diagnostics emitted so far. */ |
5397e5a3 | 237 | #define diagnostic_kind_count(DC, DK) (DC)->diagnostic_count[(int) (DK)] |
a587b03b | 238 | |
239 | /* The number of errors that have been issued so far. Ideally, these | |
5397e5a3 | 240 | would take a diagnostic_context as an argument. */ |
910f6d8f | 241 | #define errorcount diagnostic_kind_count (global_dc, DK_ERROR) |
a587b03b | 242 | /* Similarly, but for warnings. */ |
910f6d8f | 243 | #define warningcount diagnostic_kind_count (global_dc, DK_WARNING) |
a587b03b | 244 | /* Similarly, but for sorrys. */ |
910f6d8f | 245 | #define sorrycount diagnostic_kind_count (global_dc, DK_SORRY) |
a587b03b | 246 | |
6ef828f9 | 247 | /* Returns nonzero if warnings should be emitted. */ |
3c6a9715 | 248 | #define diagnostic_report_warnings_p(DC, LOC) \ |
5ae82d58 | 249 | (!(DC)->dc_inhibit_warnings \ |
250 | && !(in_system_header_at (LOC) && !(DC)->dc_warn_system_headers)) | |
a587b03b | 251 | |
25e2ffe1 | 252 | #define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D) |
a587b03b | 253 | |
7f5f3953 | 254 | /* Override the column number to be used for reporting a |
255 | diagnostic. */ | |
256 | #define diagnostic_override_column(DI, COL) (DI)->override_column = (COL) | |
257 | ||
3a79f5da | 258 | /* Override the option index to be used for reporting a |
259 | diagnostic. */ | |
260 | #define diagnostic_override_option_index(DI, OPTIDX) \ | |
261 | ((DI)->option_index = (OPTIDX)) | |
262 | ||
d716ce75 | 263 | /* Diagnostic related functions. */ |
3c6a9715 | 264 | extern void diagnostic_initialize (diagnostic_context *, int); |
543725f3 | 265 | extern void diagnostic_finish (diagnostic_context *); |
3de02a0f | 266 | extern void diagnostic_report_current_module (diagnostic_context *, location_t); |
5a983084 | 267 | extern void diagnostic_show_locus (diagnostic_context *, const diagnostic_info *); |
76f02516 | 268 | |
269 | /* Force diagnostics controlled by OPTIDX to be kind KIND. */ | |
270 | extern diagnostic_t diagnostic_classify_diagnostic (diagnostic_context *, | |
271 | int /* optidx */, | |
0955be65 | 272 | diagnostic_t /* kind */, |
273 | location_t); | |
274 | extern void diagnostic_push_diagnostics (diagnostic_context *, location_t); | |
275 | extern void diagnostic_pop_diagnostics (diagnostic_context *, location_t); | |
a52d5726 | 276 | extern bool diagnostic_report_diagnostic (diagnostic_context *, |
d598ad0d | 277 | diagnostic_info *); |
58ec857b | 278 | #ifdef ATTRIBUTE_GCC_DIAG |
d598ad0d | 279 | extern void diagnostic_set_info (diagnostic_info *, const char *, va_list *, |
58ec857b | 280 | location_t, diagnostic_t) ATTRIBUTE_GCC_DIAG(2,0); |
eb0d20b7 | 281 | extern void diagnostic_set_info_translated (diagnostic_info *, const char *, |
282 | va_list *, location_t, | |
283 | diagnostic_t) | |
284 | ATTRIBUTE_GCC_DIAG(2,0); | |
ff213692 | 285 | extern void diagnostic_append_note (diagnostic_context *, location_t, |
286 | const char *, ...) ATTRIBUTE_GCC_DIAG(3,4); | |
58ec857b | 287 | #endif |
ff213692 | 288 | extern char *diagnostic_build_prefix (diagnostic_context *, const diagnostic_info *); |
34e5cced | 289 | void default_diagnostic_starter (diagnostic_context *, diagnostic_info *); |
290 | void default_diagnostic_finalizer (diagnostic_context *, diagnostic_info *); | |
5a983084 | 291 | void diagnostic_set_caret_max_width (diagnostic_context *context, int value); |
292 | ||
25e2ffe1 | 293 | |
294 | /* Pure text formatting support functions. */ | |
d598ad0d | 295 | extern char *file_name_as_prefix (const char *); |
993ca5a5 | 296 | |
2a281353 | 297 | #endif /* ! GCC_DIAGNOSTIC_H */ |