blob: c586749ab5ad8d142172e2955debee99f7361024 [file] [log] [blame]
Per Bothner7f2935c1995-03-16 13:59:07 -08001/* Default error handlers for CPP Library.
Neil Booth5d8ebbd2002-01-03 21:43:09 +00002 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998, 1999, 2000,
Jakub Jelinekd652f222011-01-03 21:52:22 +01003 2001, 2002, 2004, 2008, 2009, 2010 Free Software Foundation, Inc.
Per Bothner7f2935c1995-03-16 13:59:07 -08004 Written by Per Bothner, 1994.
Jeff Law38e01251998-05-06 15:09:07 -06005 Based on CCCP program by Paul Rubin, June 1986
Per Bothner7f2935c1995-03-16 13:59:07 -08006 Adapted to ANSI C, Richard Stallman, Jan 1987
7
8This program is free software; you can redistribute it and/or modify it
9under the terms of the GNU General Public License as published by the
Jakub Jelinek748086b2009-04-09 17:00:19 +020010Free Software Foundation; either version 3, or (at your option) any
Per Bothner7f2935c1995-03-16 13:59:07 -080011later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
Jakub Jelinek748086b2009-04-09 17:00:19 +020019along with this program; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>.
Per Bothner7f2935c1995-03-16 13:59:07 -080021
22 In other words, you are welcome to use, share and improve this program.
23 You are forbidden to forbid anyone else to use, share and improve
24 what you give them. Help stamp out software-hoarding! */
25
Richard Kenner84ee6fd1995-05-16 18:02:38 -040026#include "config.h"
Kaveh R. Ghazib04cd5071998-03-30 12:05:54 +000027#include "system.h"
Richard Kennerf32da1f1995-05-20 06:51:33 -040028#include "cpplib.h"
Paolo Bonzini4f4e53dd2004-05-24 10:50:45 +000029#include "internal.h"
Richard Kennerf32da1f1995-05-20 06:51:33 -040030
Simon Baldwin87cf0652010-04-07 17:18:10 +000031/* Print a diagnostic at the location of the previously lexed token. */
32
33ATTRIBUTE_FPTR_PRINTF(4,0)
34static bool
35cpp_diagnostic (cpp_reader * pfile, int level, int reason,
36 const char *msgid, va_list *ap)
Per Bothner7f2935c1995-03-16 13:59:07 -080037{
Per Bothner12f9df42004-02-11 07:29:30 -080038 source_location src_loc;
Joseph Myers148e4212009-03-29 23:56:07 +010039 bool ret;
40
Joseph Myers148e4212009-03-29 23:56:07 +010041 if (CPP_OPTION (pfile, traditional))
42 {
43 if (pfile->state.in_directive)
44 src_loc = pfile->directive_line;
45 else
46 src_loc = pfile->line_table->highest_line;
47 }
48 /* We don't want to refer to a token before the beginning of the
49 current run -- that is invalid. */
50 else if (pfile->cur_token == pfile->cur_run->base)
51 {
52 if (pfile->cur_run->prev != NULL)
53 src_loc = pfile->cur_run->prev->limit->src_loc;
54 else
55 src_loc = 0;
56 }
Neil Boothebef4e82002-04-14 18:42:47 +000057 else
Per Bothner75ee8002003-08-28 00:21:34 +000058 {
Joseph Myers148e4212009-03-29 23:56:07 +010059 src_loc = pfile->cur_token[-1].src_loc;
Joseph Myers178b58b2005-11-03 23:08:18 +000060 }
Zack Weinbergb6493982001-08-18 20:46:45 +000061
Joseph Myers148e4212009-03-29 23:56:07 +010062 if (!pfile->cb.error)
63 abort ();
Simon Baldwin87cf0652010-04-07 17:18:10 +000064 ret = pfile->cb.error (pfile, level, reason, src_loc, 0, _(msgid), ap);
65
66 return ret;
67}
68
69/* Print a warning or error, depending on the value of LEVEL. */
70
71bool
72cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
73{
74 va_list ap;
75 bool ret;
76
77 va_start (ap, msgid);
78
79 ret = cpp_diagnostic (pfile, level, CPP_W_NONE, msgid, &ap);
Joseph Myers148e4212009-03-29 23:56:07 +010080
Kaveh R. Ghazie34d07f2003-05-17 22:21:35 +000081 va_end (ap);
Joseph Myers148e4212009-03-29 23:56:07 +010082 return ret;
Per Bothner7f2935c1995-03-16 13:59:07 -080083}
Jeffrey A Lawab87f8c1999-01-27 01:43:17 +000084
Simon Baldwin87cf0652010-04-07 17:18:10 +000085/* Print a warning. The warning reason may be given in REASON. */
86
87bool
88cpp_warning (cpp_reader * pfile, int reason, const char *msgid, ...)
89{
90 va_list ap;
91 bool ret;
92
93 va_start (ap, msgid);
94
95 ret = cpp_diagnostic (pfile, CPP_DL_WARNING, reason, msgid, &ap);
96
97 va_end (ap);
98 return ret;
99}
100
101/* Print a pedantic warning. The warning reason may be given in REASON. */
102
103bool
104cpp_pedwarning (cpp_reader * pfile, int reason, const char *msgid, ...)
105{
106 va_list ap;
107 bool ret;
108
109 va_start (ap, msgid);
110
111 ret = cpp_diagnostic (pfile, CPP_DL_PEDWARN, reason, msgid, &ap);
112
113 va_end (ap);
114 return ret;
115}
116
117/* Print a warning, including system headers. The warning reason may be
118 given in REASON. */
119
120bool
121cpp_warning_syshdr (cpp_reader * pfile, int reason, const char *msgid, ...)
122{
123 va_list ap;
124 bool ret;
125
126 va_start (ap, msgid);
127
128 ret = cpp_diagnostic (pfile, CPP_DL_WARNING_SYSHDR, reason, msgid, &ap);
129
130 va_end (ap);
131 return ret;
132}
133
134/* Print a diagnostic at a specific location. */
135
136ATTRIBUTE_FPTR_PRINTF(6,0)
137static bool
138cpp_diagnostic_with_line (cpp_reader * pfile, int level, int reason,
139 source_location src_loc, unsigned int column,
140 const char *msgid, va_list *ap)
141{
142 bool ret;
143
144 if (!pfile->cb.error)
145 abort ();
146 ret = pfile->cb.error (pfile, level, reason, src_loc, column, _(msgid), ap);
147
148 return ret;
149}
150
151/* Print a warning or error, depending on the value of LEVEL. */
152
Joseph Myers148e4212009-03-29 23:56:07 +0100153bool
Kaveh R. Ghazie34d07f2003-05-17 22:21:35 +0000154cpp_error_with_line (cpp_reader *pfile, int level,
Per Bothner12f9df42004-02-11 07:29:30 -0800155 source_location src_loc, unsigned int column,
Kaveh R. Ghazie34d07f2003-05-17 22:21:35 +0000156 const char *msgid, ...)
Zack Weinbergc1212d22000-02-06 23:46:18 +0000157{
Kaveh R. Ghazie34d07f2003-05-17 22:21:35 +0000158 va_list ap;
Joseph Myers148e4212009-03-29 23:56:07 +0100159 bool ret;
Simon Baldwin87cf0652010-04-07 17:18:10 +0000160
Kaveh R. Ghazie34d07f2003-05-17 22:21:35 +0000161 va_start (ap, msgid);
Jeffrey A Lawab87f8c1999-01-27 01:43:17 +0000162
Simon Baldwin87cf0652010-04-07 17:18:10 +0000163 ret = cpp_diagnostic_with_line (pfile, level, CPP_W_NONE, src_loc,
164 column, msgid, &ap);
Zack Weinbergb6493982001-08-18 20:46:45 +0000165
Kaveh R. Ghazie34d07f2003-05-17 22:21:35 +0000166 va_end (ap);
Joseph Myers148e4212009-03-29 23:56:07 +0100167 return ret;
Jeffrey A Lawab87f8c1999-01-27 01:43:17 +0000168}
Zack Weinbergc1212d22000-02-06 23:46:18 +0000169
Simon Baldwin87cf0652010-04-07 17:18:10 +0000170/* Print a warning. The warning reason may be given in REASON. */
171
172bool
173cpp_warning_with_line (cpp_reader *pfile, int reason,
174 source_location src_loc, unsigned int column,
175 const char *msgid, ...)
176{
177 va_list ap;
178 bool ret;
179
180 va_start (ap, msgid);
181
182 ret = cpp_diagnostic_with_line (pfile, CPP_DL_WARNING, reason, src_loc,
183 column, msgid, &ap);
184
185 va_end (ap);
186 return ret;
187}
188
189/* Print a pedantic warning. The warning reason may be given in REASON. */
190
191bool
192cpp_pedwarning_with_line (cpp_reader *pfile, int reason,
193 source_location src_loc, unsigned int column,
194 const char *msgid, ...)
195{
196 va_list ap;
197 bool ret;
198
199 va_start (ap, msgid);
200
201 ret = cpp_diagnostic_with_line (pfile, CPP_DL_PEDWARN, reason, src_loc,
202 column, msgid, &ap);
203
204 va_end (ap);
205 return ret;
206}
207
208/* Print a warning, including system headers. The warning reason may be
209 given in REASON. */
210
211bool
212cpp_warning_with_line_syshdr (cpp_reader *pfile, int reason,
213 source_location src_loc, unsigned int column,
214 const char *msgid, ...)
215{
216 va_list ap;
217 bool ret;
218
219 va_start (ap, msgid);
220
221 ret = cpp_diagnostic_with_line (pfile, CPP_DL_WARNING_SYSHDR, reason, src_loc,
222 column, msgid, &ap);
223
224 va_end (ap);
225 return ret;
226}
227
228/* Print a warning or error, depending on the value of LEVEL. Include
229 information from errno. */
230
Joseph Myers148e4212009-03-29 23:56:07 +0100231bool
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000232cpp_errno (cpp_reader *pfile, int level, const char *msgid)
Zack Weinbergc1212d22000-02-06 23:46:18 +0000233{
Neil Boothebef4e82002-04-14 18:42:47 +0000234 if (msgid[0] == '\0')
235 msgid = _("stdout");
Zack Weinbergc1212d22000-02-06 23:46:18 +0000236
Joseph Myers148e4212009-03-29 23:56:07 +0100237 return cpp_error (pfile, level, "%s: %s", msgid, xstrerror (errno));
Zack Weinbergc1212d22000-02-06 23:46:18 +0000238}