]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/diagnostic.h
backport: ChangeLog.tuples: ChangeLog from gimple-tuples-branch.
[thirdparty/gcc.git] / gcc / diagnostic.h
CommitLineData
345ed1fe 1/* Various declarations for language-independent diagnostics subroutines.
966e8f4d 2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
25d8d27d 3 Free Software Foundation, Inc.
345ed1fe
GDR
4 Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
5
1322177d 6This file is part of GCC.
345ed1fe 7
1322177d
LB
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
9dcd6f09 10Software Foundation; either version 3, or (at your option) any later
1322177d 11version.
345ed1fe 12
1322177d
LB
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
345ed1fe
GDR
17
18You should have received a copy of the GNU General Public License
9dcd6f09
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
345ed1fe 21
88657302
RH
22#ifndef GCC_DIAGNOSTIC_H
23#define GCC_DIAGNOSTIC_H
345ed1fe 24
b6fe0bb8 25#include "pretty-print.h"
e79b9d54 26#include "options.h"
345ed1fe 27
4d6922ee 28/* Constants used to discriminate diagnostics. */
d0e66dbb
GDR
29typedef enum
30{
687d688e 31#define DEFINE_DIAGNOSTIC_KIND(K, msgid) K,
d0e66dbb
GDR
32#include "diagnostic.def"
33#undef DEFINE_DIAGNOSTIC_KIND
34 DK_LAST_DIAGNOSTIC_KIND
35} diagnostic_t;
36
47b69537
GDR
37/* A diagnostic is described by the MESSAGE to send, the FILE and LINE of
38 its context and its KIND (ice, error, warning, note, ...) See complete
39 list in diagnostic.def. */
c94ed7a1 40typedef struct diagnostic_info
47b69537
GDR
41{
42 text_info message;
43 location_t location;
c94ed7a1
JJ
44 /* TREE_BLOCK if the diagnostic is to be reported in some inline
45 function inlined into other function, otherwise NULL. */
46 tree abstract_origin;
47b69537
GDR
47 /* The kind of diagnostic it is about. */
48 diagnostic_t kind;
ccf08a6e
DD
49 /* Which OPT_* directly controls this diagnostic. */
50 int option_index;
47b69537
GDR
51} diagnostic_info;
52
393eda6a
MLI
53#define pedantic_warning_kind() (flag_pedantic_errors ? DK_ERROR : DK_WARNING)
54#define permissive_error_kind() (flag_permissive ? DK_WARNING : DK_ERROR)
d0e66dbb 55
f63c45ec 56
47b69537
GDR
57/* Forward declarations. */
58typedef struct diagnostic_context diagnostic_context;
79a490a9
AJ
59typedef void (*diagnostic_starter_fn) (diagnostic_context *,
60 diagnostic_info *);
47b69537
GDR
61typedef diagnostic_starter_fn diagnostic_finalizer_fn;
62
c4765d18 63/* This data structure bundles altogether any information relevant to
e2840263
GDR
64 the context of a diagnostic message. */
65struct diagnostic_context
66{
2b72593e 67 /* Where most of the diagnostic formatting work is done. */
b6fe0bb8 68 pretty_printer *printer;
f68fc4db 69
4fcc2065
GDR
70 /* The number of times we have issued diagnostics. */
71 int diagnostic_count[DK_LAST_DIAGNOSTIC_KIND];
72
13f0d49c
GDR
73 /* True if we should display the "warnings are being tread as error"
74 message, usually displayed once per compiler run. */
7783b402
GDR
75 bool issue_warnings_are_errors_message;
76
77 /* True if it has been requested that warnings be treated as errors. */
78 bool warning_as_error_requested;
13f0d49c 79
79cf5994
DD
80 /* For each option index that can be passed to warning() et all
81 (OPT_* from options.h), this array may contain a new kind that
82 the diagnostic should be changed to before reporting, or
83 DK_UNSPECIFIED to leave it as the reported kind, or DK_IGNORED to
84 not report it at all. N_OPTS is from <options.h>. */
85 char classify_diagnostic[N_OPTS];
86
2098fe9e
DD
87 /* True if we should print the command line option which controls
88 each diagnostic, if known. */
89 bool show_option_requested;
90
886e0865
GK
91 /* True if we should raise a SIGABRT on errors. */
92 bool abort_on_error;
93
e2840263 94 /* This function is called before any message is printed out. It is
c4765d18 95 responsible for preparing message prefix and such. For example, it
e2840263
GDR
96 might say:
97 In file included from "/usr/local/include/curses.h:5:
98 from "/home/gdr/src/nifty_printer.h:56:
99 ...
100 */
47b69537 101 diagnostic_starter_fn begin_diagnostic;
e2840263 102
eebedaa5 103 /* This function is called after the diagnostic message is printed. */
47b69537 104 diagnostic_finalizer_fn end_diagnostic;
e2840263 105
27e511e0 106 /* Client hook to report an internal error. */
79a490a9 107 void (*internal_error) (const char *, va_list *);
27e511e0 108
47b69537
GDR
109 /* Function of last diagnostic message; more generally, function such that
110 if next diagnostic message is in it then we don't have to mention the
111 function name. */
112 tree last_function;
113
966e8f4d
TT
114 /* Used to detect when the input file stack has changed since last
115 described. */
116 const struct line_map *last_module;
47b69537
GDR
117
118 int lock;
e2840263
GDR
119};
120
6b67c26e 121/* Client supplied function to announce a diagnostic. */
e2840263 122#define diagnostic_starter(DC) (DC)->begin_diagnostic
6b67c26e
GDR
123
124/* Client supplied function called after a diagnostic message is
125 displayed. */
e2840263 126#define diagnostic_finalizer(DC) (DC)->end_diagnostic
6b67c26e 127
f63d1bf7 128/* Extension hook for client. */
e2840263 129#define diagnostic_auxiliary_data(DC) (DC)->x_data
6b67c26e 130
b6fe0bb8 131/* Same as pp_format_decoder. Works on 'diagnostic_context *'. */
e1a4dd13 132#define diagnostic_format_decoder(DC) ((DC)->printer->format_decoder)
6b67c26e 133
bd6bec6b 134/* Same as output_prefixing_rule. Works on 'diagnostic_context *'. */
39ce81c9 135#define diagnostic_prefixing_rule(DC) ((DC)->printer->wrapping.rule)
e2840263 136
9596ddd6 137/* Maximum characters per line in automatic line wrapping mode.
2ba84f36 138 Zero means don't wrap lines. */
39ce81c9 139#define diagnostic_line_cutoff(DC) ((DC)->printer->wrapping.line_cutoff)
b6fe0bb8 140
e1a4dd13 141#define diagnostic_flush_buffer(DC) pp_base_flush ((DC)->printer)
bd6bec6b 142
47b69537
GDR
143/* True if the last function in which a diagnostic was reported is
144 different from the current one. */
c94ed7a1
JJ
145#define diagnostic_last_function_changed(DC, DI) \
146 ((DC)->last_function != ((DI)->abstract_origin \
147 ? (DI)->abstract_origin : current_function_decl))
47b69537
GDR
148
149/* Remember the current function as being the last one in which we report
150 a diagnostic. */
c94ed7a1
JJ
151#define diagnostic_set_last_function(DC, DI) \
152 (DC)->last_function = (((DI) && (DI)->abstract_origin) \
153 ? (DI)->abstract_origin : current_function_decl)
47b69537
GDR
154
155/* True if the last module or file in which a diagnostic was reported is
156 different from the current one. */
966e8f4d
TT
157#define diagnostic_last_module_changed(DC, MAP) \
158 ((DC)->last_module != MAP)
bd6bec6b 159
47b69537
GDR
160/* Remember the current module or file as being the last one in which we
161 report a diagnostic. */
966e8f4d
TT
162#define diagnostic_set_last_module(DC, MAP) \
163 (DC)->last_module = MAP
764dbbf2 164
886e0865
GK
165/* Raise SIGABRT on any diagnostic of severity DK_ERROR or higher. */
166#define diagnostic_abort_on_error(DC) \
167 (DC)->abort_on_error = true
168
4fcc2065 169/* This diagnostic_context is used by front-ends that directly output
764dbbf2 170 diagnostic messages without going through `error', `warning',
6b67c26e 171 and similar functions. */
f68fc4db 172extern diagnostic_context *global_dc;
764dbbf2 173
886e0865 174/* The total count of a KIND of diagnostics emitted so far. */
4fcc2065 175#define diagnostic_kind_count(DC, DK) (DC)->diagnostic_count[(int) (DK)]
2a2b2d43
GDR
176
177/* The number of errors that have been issued so far. Ideally, these
4fcc2065 178 would take a diagnostic_context as an argument. */
6b67c26e 179#define errorcount diagnostic_kind_count (global_dc, DK_ERROR)
2a2b2d43 180/* Similarly, but for warnings. */
6b67c26e 181#define warningcount diagnostic_kind_count (global_dc, DK_WARNING)
2a2b2d43 182/* Similarly, but for sorrys. */
6b67c26e 183#define sorrycount diagnostic_kind_count (global_dc, DK_SORRY)
2a2b2d43 184
cc2902df 185/* Returns nonzero if warnings should be emitted. */
aa14403d 186#define diagnostic_report_warnings_p(LOC) \
2a2b2d43 187 (!inhibit_warnings \
aa14403d 188 && !(in_system_header_at (LOC) && !warn_system_headers))
2a2b2d43 189
47b69537 190#define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D)
2a2b2d43 191
95bd1dd7 192/* Diagnostic related functions. */
79a490a9
AJ
193extern void diagnostic_initialize (diagnostic_context *);
194extern void diagnostic_report_current_module (diagnostic_context *);
c94ed7a1
JJ
195extern void diagnostic_report_current_function (diagnostic_context *,
196 diagnostic_info *);
79cf5994
DD
197
198/* Force diagnostics controlled by OPTIDX to be kind KIND. */
199extern diagnostic_t diagnostic_classify_diagnostic (diagnostic_context *,
200 int /* optidx */,
201 diagnostic_t /* kind */);
79a490a9
AJ
202extern void diagnostic_report_diagnostic (diagnostic_context *,
203 diagnostic_info *);
db857e7d 204#ifdef ATTRIBUTE_GCC_DIAG
79a490a9 205extern void diagnostic_set_info (diagnostic_info *, const char *, va_list *,
db857e7d 206 location_t, diagnostic_t) ATTRIBUTE_GCC_DIAG(2,0);
178b58b5
JM
207extern void diagnostic_set_info_translated (diagnostic_info *, const char *,
208 va_list *, location_t,
209 diagnostic_t)
210 ATTRIBUTE_GCC_DIAG(2,0);
db857e7d 211#endif
79a490a9 212extern char *diagnostic_build_prefix (diagnostic_info *);
47b69537
GDR
213
214/* Pure text formatting support functions. */
79a490a9 215extern char *file_name_as_prefix (const char *);
345ed1fe 216
6de9cd9a 217/* In tree-pretty-print.c */
726a989a 218extern void print_declaration (pretty_printer *, tree, int, int);
6de9cd9a
DN
219extern int dump_generic_node (pretty_printer *, tree, int, int, bool);
220extern void print_generic_stmt (FILE *, tree, int);
221extern void print_generic_stmt_indented (FILE *, tree, int, int);
222extern void print_generic_expr (FILE *, tree, int);
223extern void print_generic_decl (FILE *, tree, int);
726a989a
RB
224extern void debug_c_tree (tree);
225extern void dump_omp_clauses (pretty_printer *, tree, int, int);
6de9cd9a 226
726a989a 227/* In gimple-pretty-print.c */
6de9cd9a
DN
228extern void debug_generic_expr (tree);
229extern void debug_generic_stmt (tree);
953ff289 230extern void debug_tree_chain (tree);
726a989a
RB
231extern void debug_gimple_stmt (gimple);
232extern void debug_gimple_seq (gimple_seq);
233extern void print_gimple_seq (FILE *, gimple_seq, int, int);
234extern void print_gimple_stmt (FILE *, gimple, int, int);
235extern void print_gimple_expr (FILE *, gimple, int, int);
236extern void dump_gimple_stmt (pretty_printer *, gimple, int, int);
237
88657302 238#endif /* ! GCC_DIAGNOSTIC_H */