Branch data Line data Source code
1 : : /* Declarations of core diagnostic functionality for code that does
2 : : not need to deal with diagnostic contexts or diagnostic info
3 : : structures.
4 : : Copyright (C) 1998-2024 Free Software Foundation, Inc.
5 : :
6 : : This file is part of GCC.
7 : :
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
11 : : version.
12 : :
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.
17 : :
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/>. */
21 : :
22 : : #ifndef GCC_DIAGNOSTIC_CORE_H
23 : : #define GCC_DIAGNOSTIC_CORE_H
24 : :
25 : : #include "bversion.h"
26 : :
27 : : /* Constants used to discriminate diagnostics. */
28 : : typedef enum
29 : : {
30 : : #define DEFINE_DIAGNOSTIC_KIND(K, msgid, C) K,
31 : : #include "diagnostic.def"
32 : : #undef DEFINE_DIAGNOSTIC_KIND
33 : : DK_LAST_DIAGNOSTIC_KIND,
34 : : /* This is used for tagging pragma pops in the diagnostic
35 : : classification history chain. */
36 : : DK_POP,
37 : : /* This is used internally to note that a diagnostic is enabled
38 : : without mandating any specific type. */
39 : : DK_ANY,
40 : : } diagnostic_t;
41 : :
42 : : /* RAII-style class for grouping related diagnostics. */
43 : :
44 : : class auto_diagnostic_group
45 : : {
46 : : public:
47 : : auto_diagnostic_group ();
48 : : ~auto_diagnostic_group ();
49 : : };
50 : :
51 : : /* RAII-style class for nesting hierarchical diagnostics.
52 : : Any diagnostics emitted within the lifetime of this object
53 : : will be treated as one level of nesting deeper than diagnostics
54 : : emitted outside the lifetime of the object. */
55 : :
56 : : class auto_diagnostic_nesting_level
57 : : {
58 : : public:
59 : : auto_diagnostic_nesting_level ();
60 : : ~auto_diagnostic_nesting_level ();
61 : : };
62 : :
63 : : /* Forward decl. */
64 : : class diagnostic_metadata; /* See diagnostic-metadata.h. */
65 : :
66 : : /* A class to use for the ID of an option that controls
67 : : a particular diagnostic.
68 : : This is just a wrapper around "int", but better documents
69 : : the intent of the code. */
70 : :
71 : : struct diagnostic_option_id
72 : : {
73 : 103523965 : diagnostic_option_id () : m_idx (0) {}
74 : :
75 : 195320041 : diagnostic_option_id (int idx) : m_idx (idx) {}
76 : : /* Ideally we'd take an enum opt_code here, but we don't
77 : : want to depend on its decl. */
78 : :
79 : 1543125 : bool operator== (diagnostic_option_id other) const
80 : : {
81 : 1543125 : return m_idx == other.m_idx;
82 : : }
83 : :
84 : : int m_idx;
85 : : };
86 : :
87 : : extern const char *progname;
88 : :
89 : : extern const char *trim_filename (const char *);
90 : :
91 : : /* If we haven't already defined a front-end-specific diagnostics
92 : : style, use the generic one. */
93 : : #ifndef GCC_DIAG_STYLE
94 : : #define GCC_DIAG_STYLE __gcc_tdiag__
95 : : #endif
96 : : /* None of these functions are suitable for ATTRIBUTE_PRINTF, because
97 : : each language front end can extend them with its own set of format
98 : : specifiers. We must use custom format checks. */
99 : : #if (CHECKING_P && GCC_VERSION >= 4001) || GCC_VERSION == BUILDING_GCC_VERSION
100 : : #define ATTRIBUTE_GCC_DIAG(m, n) __attribute__ ((__format__ (GCC_DIAG_STYLE, m, n))) ATTRIBUTE_NONNULL(m)
101 : : #else
102 : : #define ATTRIBUTE_GCC_DIAG(m, n) ATTRIBUTE_NONNULL(m)
103 : : #endif
104 : : extern void internal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2)
105 : : ATTRIBUTE_NORETURN;
106 : : extern void internal_error_no_backtrace (const char *, ...)
107 : : ATTRIBUTE_GCC_DIAG(1,2) ATTRIBUTE_NORETURN;
108 : : /* Pass one of the OPT_W* from options.h as the first parameter. */
109 : : extern bool warning (diagnostic_option_id,
110 : : const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
111 : : extern bool warning_n (location_t,
112 : : diagnostic_option_id,
113 : : unsigned HOST_WIDE_INT,
114 : : const char *, const char *, ...)
115 : : ATTRIBUTE_GCC_DIAG(4,6) ATTRIBUTE_GCC_DIAG(5,6);
116 : : extern bool warning_n (rich_location *,
117 : : diagnostic_option_id,
118 : : unsigned HOST_WIDE_INT,
119 : : const char *, const char *, ...)
120 : : ATTRIBUTE_GCC_DIAG(4, 6) ATTRIBUTE_GCC_DIAG(5, 6);
121 : : extern bool warning_at (location_t,
122 : : diagnostic_option_id,
123 : : const char *, ...)
124 : : ATTRIBUTE_GCC_DIAG(3,4);
125 : : extern bool warning_at (rich_location *,
126 : : diagnostic_option_id,
127 : : const char *, ...)
128 : : ATTRIBUTE_GCC_DIAG(3,4);
129 : : extern bool warning_meta (rich_location *,
130 : : const diagnostic_metadata &,
131 : : diagnostic_option_id,
132 : : const char *, ...)
133 : : ATTRIBUTE_GCC_DIAG(4,5);
134 : : extern void error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
135 : : extern void error_n (location_t, unsigned HOST_WIDE_INT, const char *,
136 : : const char *, ...)
137 : : ATTRIBUTE_GCC_DIAG(3,5) ATTRIBUTE_GCC_DIAG(4,5);
138 : : extern void error_at (location_t, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
139 : : extern void error_at (rich_location *, const char *, ...)
140 : : ATTRIBUTE_GCC_DIAG(2,3);
141 : : extern void error_meta (rich_location *, const diagnostic_metadata &,
142 : : const char *, ...)
143 : : ATTRIBUTE_GCC_DIAG(3,4);
144 : : extern void fatal_error (location_t, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3)
145 : : ATTRIBUTE_NORETURN;
146 : : /* Pass one of the OPT_W* from options.h as the second parameter. */
147 : : extern bool pedwarn (location_t,
148 : : diagnostic_option_id,
149 : : const char *, ...)
150 : : ATTRIBUTE_GCC_DIAG(3,4);
151 : : extern bool pedwarn (rich_location *,
152 : : diagnostic_option_id,
153 : : const char *, ...)
154 : : ATTRIBUTE_GCC_DIAG(3,4);
155 : : extern bool permerror (location_t, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
156 : : extern bool permerror (rich_location *, const char *,
157 : : ...) ATTRIBUTE_GCC_DIAG(2,3);
158 : : extern bool permerror_opt (location_t,
159 : : diagnostic_option_id,
160 : : const char *, ...)
161 : : ATTRIBUTE_GCC_DIAG(3,4);
162 : : extern bool permerror_opt (rich_location *,
163 : : diagnostic_option_id,
164 : : const char *, ...)
165 : : ATTRIBUTE_GCC_DIAG(3,4);
166 : : extern void sorry (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
167 : : extern void sorry_at (location_t, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
168 : : extern void inform (location_t, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
169 : : extern void inform (rich_location *, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
170 : : extern void inform_n (location_t, unsigned HOST_WIDE_INT, const char *,
171 : : const char *, ...)
172 : : ATTRIBUTE_GCC_DIAG(3,5) ATTRIBUTE_GCC_DIAG(4,5);
173 : : extern void verbatim (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
174 : : extern bool emit_diagnostic (diagnostic_t,
175 : : location_t,
176 : : diagnostic_option_id,
177 : : const char *, ...) ATTRIBUTE_GCC_DIAG(4,5);
178 : : extern bool emit_diagnostic (diagnostic_t,
179 : : rich_location *,
180 : : diagnostic_option_id,
181 : : const char *, ...) ATTRIBUTE_GCC_DIAG(4,5);
182 : : extern bool emit_diagnostic_valist (diagnostic_t,
183 : : location_t,
184 : : diagnostic_option_id,
185 : : const char *, va_list *)
186 : : ATTRIBUTE_GCC_DIAG (4,0);
187 : : extern bool emit_diagnostic_valist_meta (diagnostic_t,
188 : : rich_location *,
189 : : const diagnostic_metadata *,
190 : : diagnostic_option_id,
191 : : const char *,
192 : : va_list *) ATTRIBUTE_GCC_DIAG (5,0);
193 : : extern bool seen_error (void);
194 : :
195 : : #ifdef BUFSIZ
196 : : /* N.B. Unlike all the others, fnotice is just gettext+fprintf, and
197 : : therefore it can have ATTRIBUTE_PRINTF. */
198 : : extern void fnotice (FILE *, const char *, ...)
199 : : ATTRIBUTE_PRINTF_2;
200 : : #endif
201 : :
202 : : #endif /* ! GCC_DIAGNOSTIC_CORE_H */
|