Mercurial > hg > CbC > CbC_gcc
annotate gcc/diagnostic.c @ 108:7ad14f446135
add CbC-example/rectypeTest/
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 14 Jun 2012 20:30:24 +0900 |
parents | f6334be47118 |
children | 04ced10e8804 |
rev | line source |
---|---|
0 | 1 /* Language-independent diagnostic subroutines for the GNU Compiler Collection |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
3 2009, 2010 Free Software Foundation, Inc. |
0 | 4 Contributed by Gabriel Dos Reis <gdr@codesourcery.com> |
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 | |
23 /* This file implements the language independent aspect of diagnostic | |
24 message module. */ | |
25 | |
26 #include "config.h" | |
27 #include "system.h" | |
28 #include "coretypes.h" | |
29 #include "version.h" | |
30 #include "input.h" | |
31 #include "intl.h" | |
32 #include "diagnostic.h" | |
33 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
34 #define pedantic_warning_kind(DC) \ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
35 ((DC)->pedantic_errors ? DK_ERROR : DK_WARNING) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
36 #define permissive_error_kind(DC) ((DC)->permissive ? DK_WARNING : DK_ERROR) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
37 #define permissive_error_option(DC) ((DC)->opt_permissive) |
0 | 38 |
39 /* Prototypes. */ | |
40 static char *build_message_string (const char *, ...) ATTRIBUTE_PRINTF_1; | |
41 | |
42 static void error_recursion (diagnostic_context *) ATTRIBUTE_NORETURN; | |
43 | |
44 static void diagnostic_action_after_output (diagnostic_context *, | |
45 diagnostic_info *); | |
46 static void real_abort (void) ATTRIBUTE_NORETURN; | |
47 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
48 /* Name of program invoked, sans directories. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
49 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
50 const char *progname; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
51 |
0 | 52 /* A diagnostic_context surrogate for stderr. */ |
53 static diagnostic_context global_diagnostic_context; | |
54 diagnostic_context *global_dc = &global_diagnostic_context; | |
55 | |
56 | |
57 /* Return a malloc'd string containing MSG formatted a la printf. The | |
58 caller is responsible for freeing the memory. */ | |
59 static char * | |
60 build_message_string (const char *msg, ...) | |
61 { | |
62 char *str; | |
63 va_list ap; | |
64 | |
65 va_start (ap, msg); | |
66 vasprintf (&str, msg, ap); | |
67 va_end (ap); | |
68 | |
69 return str; | |
70 } | |
71 | |
72 /* Same as diagnostic_build_prefix, but only the source FILE is given. */ | |
73 char * | |
74 file_name_as_prefix (const char *f) | |
75 { | |
76 return build_message_string ("%s: ", f); | |
77 } | |
78 | |
79 | |
80 | |
81 /* Initialize the diagnostic message outputting machinery. */ | |
82 void | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
83 diagnostic_initialize (diagnostic_context *context, int n_opts) |
0 | 84 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
85 int i; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
86 |
0 | 87 /* Allocate a basic pretty-printer. Clients will replace this a |
88 much more elaborated pretty-printer if they wish. */ | |
89 context->printer = XNEW (pretty_printer); | |
90 pp_construct (context->printer, NULL, 0); | |
91 /* By default, diagnostics are sent to stderr. */ | |
92 context->printer->buffer->stream = stderr; | |
93 /* By default, we emit prefixes once per message. */ | |
94 context->printer->wrapping.rule = DIAGNOSTICS_SHOW_PREFIX_ONCE; | |
95 | |
96 memset (context->diagnostic_count, 0, sizeof context->diagnostic_count); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
97 context->some_warnings_are_errors = false; |
0 | 98 context->warning_as_error_requested = false; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
99 context->n_opts = n_opts; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
100 context->classify_diagnostic = XNEWVEC (diagnostic_t, n_opts); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
101 for (i = 0; i < n_opts; i++) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
102 context->classify_diagnostic[i] = DK_UNSPECIFIED; |
0 | 103 context->show_option_requested = false; |
104 context->abort_on_error = false; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
105 context->show_column = false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
106 context->pedantic_errors = false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
107 context->permissive = false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
108 context->opt_permissive = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
109 context->fatal_errors = false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
110 context->dc_inhibit_warnings = false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
111 context->dc_warn_system_headers = false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
112 context->max_errors = 0; |
0 | 113 context->internal_error = NULL; |
114 diagnostic_starter (context) = default_diagnostic_starter; | |
115 diagnostic_finalizer (context) = default_diagnostic_finalizer; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
116 context->option_enabled = NULL; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
117 context->option_state = NULL; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
118 context->option_name = NULL; |
0 | 119 context->last_module = 0; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
120 context->x_data = NULL; |
0 | 121 context->lock = 0; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
122 context->inhibit_notes_p = false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
123 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
124 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
125 /* Do any cleaning up required after the last diagnostic is emitted. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
126 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
127 void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
128 diagnostic_finish (diagnostic_context *context) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
129 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
130 /* Some of the errors may actually have been warnings. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
131 if (context->some_warnings_are_errors) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
132 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
133 /* -Werror was given. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
134 if (context->warning_as_error_requested) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
135 pp_verbatim (context->printer, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
136 _("%s: all warnings being treated as errors\n"), |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
137 progname); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
138 /* At least one -Werror= was given. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
139 else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
140 pp_verbatim (context->printer, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
141 _("%s: some warnings being treated as errors\n"), |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
142 progname); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
143 pp_flush (context->printer); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
144 } |
0 | 145 } |
146 | |
147 /* Initialize DIAGNOSTIC, where the message MSG has already been | |
148 translated. */ | |
149 void | |
150 diagnostic_set_info_translated (diagnostic_info *diagnostic, const char *msg, | |
151 va_list *args, location_t location, | |
152 diagnostic_t kind) | |
153 { | |
154 diagnostic->message.err_no = errno; | |
155 diagnostic->message.args_ptr = args; | |
156 diagnostic->message.format_spec = msg; | |
157 diagnostic->location = location; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
158 diagnostic->override_column = 0; |
0 | 159 diagnostic->kind = kind; |
160 diagnostic->option_index = 0; | |
161 } | |
162 | |
163 /* Initialize DIAGNOSTIC, where the message GMSGID has not yet been | |
164 translated. */ | |
165 void | |
166 diagnostic_set_info (diagnostic_info *diagnostic, const char *gmsgid, | |
167 va_list *args, location_t location, | |
168 diagnostic_t kind) | |
169 { | |
170 diagnostic_set_info_translated (diagnostic, _(gmsgid), args, location, kind); | |
171 } | |
172 | |
173 /* Return a malloc'd string describing a location. The caller is | |
174 responsible for freeing the memory. */ | |
175 char * | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
176 diagnostic_build_prefix (diagnostic_context *context, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
177 diagnostic_info *diagnostic) |
0 | 178 { |
179 static const char *const diagnostic_kind_text[] = { | |
180 #define DEFINE_DIAGNOSTIC_KIND(K, T) (T), | |
181 #include "diagnostic.def" | |
182 #undef DEFINE_DIAGNOSTIC_KIND | |
183 "must-not-happen" | |
184 }; | |
185 const char *text = _(diagnostic_kind_text[diagnostic->kind]); | |
186 expanded_location s = expand_location (diagnostic->location); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
187 if (diagnostic->override_column) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
188 s.column = diagnostic->override_column; |
0 | 189 gcc_assert (diagnostic->kind < DK_LAST_DIAGNOSTIC_KIND); |
190 | |
191 return | |
192 (s.file == NULL | |
193 ? build_message_string ("%s: %s", progname, text) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
194 : context->show_column |
0 | 195 ? build_message_string ("%s:%d:%d: %s", s.file, s.line, s.column, text) |
196 : build_message_string ("%s:%d: %s", s.file, s.line, text)); | |
197 } | |
198 | |
199 /* Take any action which is expected to happen after the diagnostic | |
200 is written out. This function does not always return. */ | |
201 static void | |
202 diagnostic_action_after_output (diagnostic_context *context, | |
203 diagnostic_info *diagnostic) | |
204 { | |
205 switch (diagnostic->kind) | |
206 { | |
207 case DK_DEBUG: | |
208 case DK_NOTE: | |
209 case DK_ANACHRONISM: | |
210 case DK_WARNING: | |
211 break; | |
212 | |
213 case DK_ERROR: | |
214 case DK_SORRY: | |
215 if (context->abort_on_error) | |
216 real_abort (); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
217 if (context->fatal_errors) |
0 | 218 { |
219 fnotice (stderr, "compilation terminated due to -Wfatal-errors.\n"); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
220 diagnostic_finish (context); |
0 | 221 exit (FATAL_EXIT_CODE); |
222 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
223 if (context->max_errors != 0 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
224 && ((unsigned) (diagnostic_kind_count (context, DK_ERROR) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
225 + diagnostic_kind_count (context, DK_SORRY)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
226 >= context->max_errors)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
227 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
228 fnotice (stderr, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
229 "compilation terminated due to -fmax-errors=%u.\n", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
230 context->max_errors); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
231 diagnostic_finish (context); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
232 exit (FATAL_EXIT_CODE); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
233 } |
0 | 234 break; |
235 | |
236 case DK_ICE: | |
237 if (context->abort_on_error) | |
238 real_abort (); | |
239 | |
240 fnotice (stderr, "Please submit a full bug report,\n" | |
241 "with preprocessed source if appropriate.\n" | |
242 "See %s for instructions.\n", bug_report_url); | |
243 exit (ICE_EXIT_CODE); | |
244 | |
245 case DK_FATAL: | |
246 if (context->abort_on_error) | |
247 real_abort (); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
248 diagnostic_finish (context); |
0 | 249 fnotice (stderr, "compilation terminated.\n"); |
250 exit (FATAL_EXIT_CODE); | |
251 | |
252 default: | |
253 gcc_unreachable (); | |
254 } | |
255 } | |
256 | |
257 void | |
258 diagnostic_report_current_module (diagnostic_context *context) | |
259 { | |
260 const struct line_map *map; | |
261 | |
262 if (pp_needs_newline (context->printer)) | |
263 { | |
264 pp_newline (context->printer); | |
265 pp_needs_newline (context->printer) = false; | |
266 } | |
267 | |
268 if (input_location <= BUILTINS_LOCATION) | |
269 return; | |
270 | |
271 map = linemap_lookup (line_table, input_location); | |
272 if (map && diagnostic_last_module_changed (context, map)) | |
273 { | |
274 diagnostic_set_last_module (context, map); | |
275 if (! MAIN_FILE_P (map)) | |
276 { | |
277 map = INCLUDED_FROM (line_table, map); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
278 if (context->show_column) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
279 pp_verbatim (context->printer, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
280 "In file included from %s:%d:%d", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
281 map->to_file, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
282 LAST_SOURCE_LINE (map), LAST_SOURCE_COLUMN (map)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
283 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
284 pp_verbatim (context->printer, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
285 "In file included from %s:%d", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
286 map->to_file, LAST_SOURCE_LINE (map)); |
0 | 287 while (! MAIN_FILE_P (map)) |
288 { | |
289 map = INCLUDED_FROM (line_table, map); | |
290 pp_verbatim (context->printer, | |
291 ",\n from %s:%d", | |
292 map->to_file, LAST_SOURCE_LINE (map)); | |
293 } | |
294 pp_verbatim (context->printer, ":"); | |
295 pp_newline (context->printer); | |
296 } | |
297 } | |
298 } | |
299 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
300 void |
0 | 301 default_diagnostic_starter (diagnostic_context *context, |
302 diagnostic_info *diagnostic) | |
303 { | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
304 diagnostic_report_current_module (context); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
305 pp_set_prefix (context->printer, diagnostic_build_prefix (context, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
306 diagnostic)); |
0 | 307 } |
308 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
309 void |
0 | 310 default_diagnostic_finalizer (diagnostic_context *context, |
311 diagnostic_info *diagnostic ATTRIBUTE_UNUSED) | |
312 { | |
313 pp_destroy_prefix (context->printer); | |
314 } | |
315 | |
316 /* Interface to specify diagnostic kind overrides. Returns the | |
317 previous setting, or DK_UNSPECIFIED if the parameters are out of | |
318 range. */ | |
319 diagnostic_t | |
320 diagnostic_classify_diagnostic (diagnostic_context *context, | |
321 int option_index, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
322 diagnostic_t new_kind, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
323 location_t where) |
0 | 324 { |
325 diagnostic_t old_kind; | |
326 | |
327 if (option_index <= 0 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
328 || option_index >= context->n_opts |
0 | 329 || new_kind >= DK_LAST_DIAGNOSTIC_KIND) |
330 return DK_UNSPECIFIED; | |
331 | |
332 old_kind = context->classify_diagnostic[option_index]; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
333 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
334 /* Handle pragmas separately, since we need to keep track of *where* |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
335 the pragmas were. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
336 if (where != UNKNOWN_LOCATION) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
337 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
338 int i; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
339 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
340 for (i = context->n_classification_history - 1; i >= 0; i --) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
341 if (context->classification_history[i].option == option_index) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
342 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
343 old_kind = context->classification_history[i].kind; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
344 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
345 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
346 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
347 i = context->n_classification_history; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
348 context->classification_history = |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
349 (diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
350 * sizeof (diagnostic_classification_change_t)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
351 context->classification_history[i].location = where; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
352 context->classification_history[i].option = option_index; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
353 context->classification_history[i].kind = new_kind; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
354 context->n_classification_history ++; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
355 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
356 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
357 context->classify_diagnostic[option_index] = new_kind; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
358 |
0 | 359 return old_kind; |
360 } | |
361 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
362 /* Save all diagnostic classifications in a stack. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
363 void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
364 diagnostic_push_diagnostics (diagnostic_context *context, location_t where ATTRIBUTE_UNUSED) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
365 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
366 context->push_list = (int *) xrealloc (context->push_list, (context->n_push + 1) * sizeof (int)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
367 context->push_list[context->n_push ++] = context->n_classification_history; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
368 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
369 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
370 /* Restore the topmost classification set off the stack. If the stack |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
371 is empty, revert to the state based on command line parameters. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
372 void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
373 diagnostic_pop_diagnostics (diagnostic_context *context, location_t where) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
374 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
375 int jump_to; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
376 int i; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
377 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
378 if (context->n_push) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
379 jump_to = context->push_list [-- context->n_push]; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
380 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
381 jump_to = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
382 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
383 i = context->n_classification_history; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
384 context->classification_history = |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
385 (diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
386 * sizeof (diagnostic_classification_change_t)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
387 context->classification_history[i].location = where; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
388 context->classification_history[i].option = jump_to; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
389 context->classification_history[i].kind = DK_POP; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
390 context->n_classification_history ++; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
391 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
392 |
0 | 393 /* Report a diagnostic message (an error or a warning) as specified by |
394 DC. This function is *the* subroutine in terms of which front-ends | |
395 should implement their specific diagnostic handling modules. The | |
396 front-end independent format specifiers are exactly those described | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
397 in the documentation of output_format. |
0 | 398 Return true if a diagnostic was printed, false otherwise. */ |
399 | |
400 bool | |
401 diagnostic_report_diagnostic (diagnostic_context *context, | |
402 diagnostic_info *diagnostic) | |
403 { | |
404 location_t location = diagnostic->location; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
405 diagnostic_t orig_diag_kind = diagnostic->kind; |
0 | 406 const char *saved_format_spec; |
407 | |
408 /* Give preference to being able to inhibit warnings, before they | |
409 get reclassified to something else. */ | |
410 if ((diagnostic->kind == DK_WARNING || diagnostic->kind == DK_PEDWARN) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
411 && !diagnostic_report_warnings_p (context, location)) |
0 | 412 return false; |
413 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
414 if (diagnostic->kind == DK_PEDWARN) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
415 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
416 diagnostic->kind = pedantic_warning_kind (context); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
417 /* We do this to avoid giving the message for -pedantic-errors. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
418 orig_diag_kind = diagnostic->kind; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
419 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
420 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
421 if (diagnostic->kind == DK_NOTE && context->inhibit_notes_p) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
422 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
423 |
0 | 424 if (context->lock > 0) |
425 { | |
426 /* If we're reporting an ICE in the middle of some other error, | |
427 try to flush out the previous error, then let this one | |
428 through. Don't do this more than once. */ | |
429 if (diagnostic->kind == DK_ICE && context->lock == 1) | |
430 pp_flush (context->printer); | |
431 else | |
432 error_recursion (context); | |
433 } | |
434 | |
435 /* If the user requested that warnings be treated as errors, so be | |
436 it. Note that we do this before the next block so that | |
437 individual warnings can be overridden back to warnings with | |
438 -Wno-error=*. */ | |
439 if (context->warning_as_error_requested | |
440 && diagnostic->kind == DK_WARNING) | |
441 { | |
442 diagnostic->kind = DK_ERROR; | |
443 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
444 |
0 | 445 if (diagnostic->option_index) |
446 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
447 diagnostic_t diag_class = DK_UNSPECIFIED; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
448 |
0 | 449 /* This tests if the user provided the appropriate -Wfoo or |
450 -Wno-foo option. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
451 if (! context->option_enabled (diagnostic->option_index, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
452 context->option_state)) |
0 | 453 return false; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
454 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
455 /* This tests for #pragma diagnostic changes. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
456 if (context->n_classification_history > 0) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
457 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
458 int i; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
459 /* FIXME: Stupid search. Optimize later. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
460 for (i = context->n_classification_history - 1; i >= 0; i --) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
461 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
462 if (context->classification_history[i].location <= location) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
463 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
464 if (context->classification_history[i].kind == (int) DK_POP) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
465 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
466 i = context->classification_history[i].option; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
467 continue; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
468 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
469 if (context->classification_history[i].option == diagnostic->option_index) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
470 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
471 diag_class = context->classification_history[i].kind; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
472 if (diag_class != DK_UNSPECIFIED) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
473 diagnostic->kind = diag_class; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
474 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
475 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
476 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
477 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
478 } |
0 | 479 /* This tests if the user provided the appropriate -Werror=foo |
480 option. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
481 if (diag_class == DK_UNSPECIFIED |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
482 && context->classify_diagnostic[diagnostic->option_index] != DK_UNSPECIFIED) |
0 | 483 { |
484 diagnostic->kind = context->classify_diagnostic[diagnostic->option_index]; | |
485 } | |
486 /* This allows for future extensions, like temporarily disabling | |
487 warnings for ranges of source code. */ | |
488 if (diagnostic->kind == DK_IGNORED) | |
489 return false; | |
490 } | |
491 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
492 if (orig_diag_kind == DK_WARNING && diagnostic->kind == DK_ERROR) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
493 context->some_warnings_are_errors = true; |
0 | 494 |
495 context->lock++; | |
496 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
497 if (diagnostic->kind == DK_ICE) |
0 | 498 { |
499 #ifndef ENABLE_CHECKING | |
500 /* When not checking, ICEs are converted to fatal errors when an | |
501 error has already occurred. This is counteracted by | |
502 abort_on_error. */ | |
503 if ((diagnostic_kind_count (context, DK_ERROR) > 0 | |
504 || diagnostic_kind_count (context, DK_SORRY) > 0) | |
505 && !context->abort_on_error) | |
506 { | |
507 expanded_location s = expand_location (diagnostic->location); | |
508 fnotice (stderr, "%s:%d: confused by earlier errors, bailing out\n", | |
509 s.file, s.line); | |
510 exit (ICE_EXIT_CODE); | |
511 } | |
512 #endif | |
513 if (context->internal_error) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
514 (*context->internal_error) (context, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
515 diagnostic->message.format_spec, |
0 | 516 diagnostic->message.args_ptr); |
517 } | |
518 ++diagnostic_kind_count (context, diagnostic->kind); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
519 |
0 | 520 saved_format_spec = diagnostic->message.format_spec; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
521 if (context->show_option_requested) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
522 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
523 char *option_text; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
524 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
525 option_text = context->option_name (context, diagnostic->option_index, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
526 orig_diag_kind, diagnostic->kind); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
527 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
528 if (option_text) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
529 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
530 diagnostic->message.format_spec |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
531 = ACONCAT ((diagnostic->message.format_spec, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
532 " ", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
533 "[", option_text, "]", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
534 NULL)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
535 free (option_text); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
536 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
537 } |
0 | 538 diagnostic->message.locus = &diagnostic->location; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
539 diagnostic->message.x_data = &diagnostic->x_data; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
540 diagnostic->x_data = NULL; |
0 | 541 pp_format (context->printer, &diagnostic->message); |
542 (*diagnostic_starter (context)) (context, diagnostic); | |
543 pp_output_formatted_text (context->printer); | |
544 (*diagnostic_finalizer (context)) (context, diagnostic); | |
545 pp_flush (context->printer); | |
546 diagnostic_action_after_output (context, diagnostic); | |
547 diagnostic->message.format_spec = saved_format_spec; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
548 diagnostic->x_data = NULL; |
0 | 549 |
550 context->lock--; | |
551 | |
552 return true; | |
553 } | |
554 | |
555 /* Given a partial pathname as input, return another pathname that | |
556 shares no directory elements with the pathname of __FILE__. This | |
557 is used by fancy_abort() to print `Internal compiler error in expr.c' | |
558 instead of `Internal compiler error in ../../GCC/gcc/expr.c'. */ | |
559 | |
560 const char * | |
561 trim_filename (const char *name) | |
562 { | |
563 static const char this_file[] = __FILE__; | |
564 const char *p = name, *q = this_file; | |
565 | |
566 /* First skip any "../" in each filename. This allows us to give a proper | |
567 reference to a file in a subdirectory. */ | |
568 while (p[0] == '.' && p[1] == '.' && IS_DIR_SEPARATOR (p[2])) | |
569 p += 3; | |
570 | |
571 while (q[0] == '.' && q[1] == '.' && IS_DIR_SEPARATOR (q[2])) | |
572 q += 3; | |
573 | |
574 /* Now skip any parts the two filenames have in common. */ | |
575 while (*p == *q && *p != 0 && *q != 0) | |
576 p++, q++; | |
577 | |
578 /* Now go backwards until the previous directory separator. */ | |
579 while (p > name && !IS_DIR_SEPARATOR (p[-1])) | |
580 p--; | |
581 | |
582 return p; | |
583 } | |
584 | |
585 /* Standard error reporting routines in increasing order of severity. | |
586 All of these take arguments like printf. */ | |
587 | |
588 /* Text to be emitted verbatim to the error message stream; this | |
589 produces no prefix and disables line-wrapping. Use rarely. */ | |
590 void | |
591 verbatim (const char *gmsgid, ...) | |
592 { | |
593 text_info text; | |
594 va_list ap; | |
595 | |
596 va_start (ap, gmsgid); | |
597 text.err_no = errno; | |
598 text.args_ptr = ≈ | |
599 text.format_spec = _(gmsgid); | |
600 text.locus = NULL; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
601 text.x_data = NULL; |
0 | 602 pp_format_verbatim (global_dc->printer, &text); |
603 pp_flush (global_dc->printer); | |
604 va_end (ap); | |
605 } | |
606 | |
607 bool | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
608 emit_diagnostic (diagnostic_t kind, location_t location, int opt, |
0 | 609 const char *gmsgid, ...) |
610 { | |
611 diagnostic_info diagnostic; | |
612 va_list ap; | |
613 | |
614 va_start (ap, gmsgid); | |
615 if (kind == DK_PERMERROR) | |
616 { | |
617 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
618 permissive_error_kind (global_dc)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
619 diagnostic.option_index = permissive_error_option (global_dc); |
0 | 620 } |
621 else { | |
622 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, kind); | |
623 if (kind == DK_WARNING || kind == DK_PEDWARN) | |
624 diagnostic.option_index = opt; | |
625 } | |
626 va_end (ap); | |
627 | |
628 return report_diagnostic (&diagnostic); | |
629 } | |
630 | |
631 /* An informative note at LOCATION. Use this for additional details on an error | |
632 message. */ | |
633 void | |
634 inform (location_t location, const char *gmsgid, ...) | |
635 { | |
636 diagnostic_info diagnostic; | |
637 va_list ap; | |
638 | |
639 va_start (ap, gmsgid); | |
640 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_NOTE); | |
641 report_diagnostic (&diagnostic); | |
642 va_end (ap); | |
643 } | |
644 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
645 /* An informative note at LOCATION. Use this for additional details on an |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
646 error message. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
647 void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
648 inform_n (location_t location, int n, const char *singular_gmsgid, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
649 const char *plural_gmsgid, ...) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
650 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
651 diagnostic_info diagnostic; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
652 va_list ap; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
653 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
654 va_start (ap, plural_gmsgid); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
655 diagnostic_set_info_translated (&diagnostic, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
656 ngettext (singular_gmsgid, plural_gmsgid, n), |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
657 &ap, location, DK_NOTE); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
658 report_diagnostic (&diagnostic); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
659 va_end (ap); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
660 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
661 |
0 | 662 /* A warning at INPUT_LOCATION. Use this for code which is correct according |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
663 to the relevant language specification but is likely to be buggy anyway. |
0 | 664 Returns true if the warning was printed, false if it was inhibited. */ |
665 bool | |
666 warning (int opt, const char *gmsgid, ...) | |
667 { | |
668 diagnostic_info diagnostic; | |
669 va_list ap; | |
670 | |
671 va_start (ap, gmsgid); | |
672 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING); | |
673 diagnostic.option_index = opt; | |
674 | |
675 va_end (ap); | |
676 return report_diagnostic (&diagnostic); | |
677 } | |
678 | |
679 /* A warning at LOCATION. Use this for code which is correct according to the | |
680 relevant language specification but is likely to be buggy anyway. | |
681 Returns true if the warning was printed, false if it was inhibited. */ | |
682 | |
683 bool | |
684 warning_at (location_t location, int opt, const char *gmsgid, ...) | |
685 { | |
686 diagnostic_info diagnostic; | |
687 va_list ap; | |
688 | |
689 va_start (ap, gmsgid); | |
690 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_WARNING); | |
691 diagnostic.option_index = opt; | |
692 va_end (ap); | |
693 return report_diagnostic (&diagnostic); | |
694 } | |
695 | |
696 /* A "pedantic" warning at LOCATION: issues a warning unless | |
697 -pedantic-errors was given on the command line, in which case it | |
698 issues an error. Use this for diagnostics required by the relevant | |
699 language standard, if you have chosen not to make them errors. | |
700 | |
701 Note that these diagnostics are issued independent of the setting | |
702 of the -pedantic command-line switch. To get a warning enabled | |
703 only with that switch, use either "if (pedantic) pedwarn | |
704 (OPT_pedantic,...)" or just "pedwarn (OPT_pedantic,..)". To get a | |
705 pedwarn independently of the -pedantic switch use "pedwarn (0,...)". | |
706 | |
707 Returns true if the warning was printed, false if it was inhibited. */ | |
708 | |
709 bool | |
710 pedwarn (location_t location, int opt, const char *gmsgid, ...) | |
711 { | |
712 diagnostic_info diagnostic; | |
713 va_list ap; | |
714 | |
715 va_start (ap, gmsgid); | |
716 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_PEDWARN); | |
717 diagnostic.option_index = opt; | |
718 va_end (ap); | |
719 return report_diagnostic (&diagnostic); | |
720 } | |
721 | |
722 /* A "permissive" error at LOCATION: issues an error unless | |
723 -fpermissive was given on the command line, in which case it issues | |
724 a warning. Use this for things that really should be errors but we | |
725 want to support legacy code. | |
726 | |
727 Returns true if the warning was printed, false if it was inhibited. */ | |
728 | |
729 bool | |
730 permerror (location_t location, const char *gmsgid, ...) | |
731 { | |
732 diagnostic_info diagnostic; | |
733 va_list ap; | |
734 | |
735 va_start (ap, gmsgid); | |
736 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
737 permissive_error_kind (global_dc)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
738 diagnostic.option_index = permissive_error_option (global_dc); |
0 | 739 va_end (ap); |
740 return report_diagnostic (&diagnostic); | |
741 } | |
742 | |
743 /* A hard error: the code is definitely ill-formed, and an object file | |
744 will not be produced. */ | |
745 void | |
746 error (const char *gmsgid, ...) | |
747 { | |
748 diagnostic_info diagnostic; | |
749 va_list ap; | |
750 | |
751 va_start (ap, gmsgid); | |
752 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ERROR); | |
753 report_diagnostic (&diagnostic); | |
754 va_end (ap); | |
755 } | |
756 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
757 /* A hard error: the code is definitely ill-formed, and an object file |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
758 will not be produced. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
759 void |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
760 error_n (location_t location, int n, const char *singular_gmsgid, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
761 const char *plural_gmsgid, ...) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
762 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
763 diagnostic_info diagnostic; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
764 va_list ap; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
765 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
766 va_start (ap, plural_gmsgid); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
767 diagnostic_set_info_translated (&diagnostic, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
768 ngettext (singular_gmsgid, plural_gmsgid, n), |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
769 &ap, location, DK_ERROR); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
770 report_diagnostic (&diagnostic); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
771 va_end (ap); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
772 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
773 |
0 | 774 /* Same as ebove, but use location LOC instead of input_location. */ |
775 void | |
776 error_at (location_t loc, const char *gmsgid, ...) | |
777 { | |
778 diagnostic_info diagnostic; | |
779 va_list ap; | |
780 | |
781 va_start (ap, gmsgid); | |
782 diagnostic_set_info (&diagnostic, gmsgid, &ap, loc, DK_ERROR); | |
783 report_diagnostic (&diagnostic); | |
784 va_end (ap); | |
785 } | |
786 | |
787 /* "Sorry, not implemented." Use for a language feature which is | |
788 required by the relevant specification but not implemented by GCC. | |
789 An object file will not be produced. */ | |
790 void | |
791 sorry (const char *gmsgid, ...) | |
792 { | |
793 diagnostic_info diagnostic; | |
794 va_list ap; | |
795 | |
796 va_start (ap, gmsgid); | |
797 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_SORRY); | |
798 report_diagnostic (&diagnostic); | |
799 va_end (ap); | |
800 } | |
801 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
802 /* Return true if an error or a "sorry" has been seen. Various |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
803 processing is disabled after errors. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
804 bool |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
805 seen_error (void) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
806 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
807 return errorcount || sorrycount; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
808 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
809 |
0 | 810 /* An error which is severe enough that we make no attempt to |
811 continue. Do not use this for internal consistency checks; that's | |
812 internal_error. Use of this function should be rare. */ | |
813 void | |
814 fatal_error (const char *gmsgid, ...) | |
815 { | |
816 diagnostic_info diagnostic; | |
817 va_list ap; | |
818 | |
819 va_start (ap, gmsgid); | |
820 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_FATAL); | |
821 report_diagnostic (&diagnostic); | |
822 va_end (ap); | |
823 | |
824 gcc_unreachable (); | |
825 } | |
826 | |
827 /* An internal consistency check has failed. We make no attempt to | |
828 continue. Note that unless there is debugging value to be had from | |
829 a more specific message, or some other good reason, you should use | |
830 abort () instead of calling this function directly. */ | |
831 void | |
832 internal_error (const char *gmsgid, ...) | |
833 { | |
834 diagnostic_info diagnostic; | |
835 va_list ap; | |
836 | |
837 va_start (ap, gmsgid); | |
838 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ICE); | |
839 report_diagnostic (&diagnostic); | |
840 va_end (ap); | |
841 | |
842 gcc_unreachable (); | |
843 } | |
844 | |
845 /* Special case error functions. Most are implemented in terms of the | |
846 above, or should be. */ | |
847 | |
848 /* Print a diagnostic MSGID on FILE. This is just fprintf, except it | |
849 runs its second argument through gettext. */ | |
850 void | |
851 fnotice (FILE *file, const char *cmsgid, ...) | |
852 { | |
853 va_list ap; | |
854 | |
855 va_start (ap, cmsgid); | |
856 vfprintf (file, _(cmsgid), ap); | |
857 va_end (ap); | |
858 } | |
859 | |
860 /* Inform the user that an error occurred while trying to report some | |
861 other error. This indicates catastrophic internal inconsistencies, | |
862 so give up now. But do try to flush out the previous error. | |
863 This mustn't use internal_error, that will cause infinite recursion. */ | |
864 | |
865 static void | |
866 error_recursion (diagnostic_context *context) | |
867 { | |
868 diagnostic_info diagnostic; | |
869 | |
870 if (context->lock < 3) | |
871 pp_flush (context->printer); | |
872 | |
873 fnotice (stderr, | |
874 "Internal compiler error: Error reporting routines re-entered.\n"); | |
875 | |
876 /* Call diagnostic_action_after_output to get the "please submit a bug | |
877 report" message. It only looks at the kind field of diagnostic_info. */ | |
878 diagnostic.kind = DK_ICE; | |
879 diagnostic_action_after_output (context, &diagnostic); | |
880 | |
881 /* Do not use gcc_unreachable here; that goes through internal_error | |
882 and therefore would cause infinite recursion. */ | |
883 real_abort (); | |
884 } | |
885 | |
886 /* Report an internal compiler error in a friendly manner. This is | |
887 the function that gets called upon use of abort() in the source | |
888 code generally, thanks to a special macro. */ | |
889 | |
890 void | |
891 fancy_abort (const char *file, int line, const char *function) | |
892 { | |
893 internal_error ("in %s, at %s:%d", function, trim_filename (file), line); | |
894 } | |
895 | |
896 /* Really call the system 'abort'. This has to go right at the end of | |
897 this file, so that there are no functions after it that call abort | |
898 and get the system abort instead of our macro. */ | |
899 #undef abort | |
900 static void | |
901 real_abort (void) | |
902 { | |
903 abort (); | |
904 } |