xref: /dflybsd-src/contrib/gcc-8.0/libcpp/errors.c (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* Default error handlers for CPP Library.
2*38fd1498Szrj    Copyright (C) 1986-2018 Free Software Foundation, Inc.
3*38fd1498Szrj    Written by Per Bothner, 1994.
4*38fd1498Szrj    Based on CCCP program by Paul Rubin, June 1986
5*38fd1498Szrj    Adapted to ANSI C, Richard Stallman, Jan 1987
6*38fd1498Szrj 
7*38fd1498Szrj This program is free software; you can redistribute it and/or modify it
8*38fd1498Szrj under the terms of the GNU General Public License as published by the
9*38fd1498Szrj Free Software Foundation; either version 3, or (at your option) any
10*38fd1498Szrj later version.
11*38fd1498Szrj 
12*38fd1498Szrj This program is distributed in the hope that it will be useful,
13*38fd1498Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of
14*38fd1498Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*38fd1498Szrj GNU General Public License for more details.
16*38fd1498Szrj 
17*38fd1498Szrj You should have received a copy of the GNU General Public License
18*38fd1498Szrj along with this program; see the file COPYING3.  If not see
19*38fd1498Szrj <http://www.gnu.org/licenses/>.
20*38fd1498Szrj 
21*38fd1498Szrj  In other words, you are welcome to use, share and improve this program.
22*38fd1498Szrj  You are forbidden to forbid anyone else to use, share and improve
23*38fd1498Szrj  what you give them.   Help stamp out software-hoarding!  */
24*38fd1498Szrj 
25*38fd1498Szrj #include "config.h"
26*38fd1498Szrj #include "system.h"
27*38fd1498Szrj #include "cpplib.h"
28*38fd1498Szrj #include "internal.h"
29*38fd1498Szrj 
30*38fd1498Szrj /* Print a diagnostic at the given location.  */
31*38fd1498Szrj 
32*38fd1498Szrj ATTRIBUTE_FPTR_PRINTF(5,0)
33*38fd1498Szrj static bool
cpp_diagnostic_at(cpp_reader * pfile,int level,int reason,rich_location * richloc,const char * msgid,va_list * ap)34*38fd1498Szrj cpp_diagnostic_at (cpp_reader * pfile, int level, int reason,
35*38fd1498Szrj 		   rich_location *richloc,
36*38fd1498Szrj 		   const char *msgid, va_list *ap)
37*38fd1498Szrj {
38*38fd1498Szrj   bool ret;
39*38fd1498Szrj 
40*38fd1498Szrj   if (!pfile->cb.error)
41*38fd1498Szrj     abort ();
42*38fd1498Szrj   ret = pfile->cb.error (pfile, level, reason, richloc, _(msgid), ap);
43*38fd1498Szrj 
44*38fd1498Szrj   return ret;
45*38fd1498Szrj }
46*38fd1498Szrj 
47*38fd1498Szrj /* Print a diagnostic at the location of the previously lexed token.  */
48*38fd1498Szrj 
49*38fd1498Szrj ATTRIBUTE_FPTR_PRINTF(4,0)
50*38fd1498Szrj static bool
cpp_diagnostic(cpp_reader * pfile,int level,int reason,const char * msgid,va_list * ap)51*38fd1498Szrj cpp_diagnostic (cpp_reader * pfile, int level, int reason,
52*38fd1498Szrj                 const char *msgid, va_list *ap)
53*38fd1498Szrj {
54*38fd1498Szrj   source_location src_loc;
55*38fd1498Szrj 
56*38fd1498Szrj   if (CPP_OPTION (pfile, traditional))
57*38fd1498Szrj     {
58*38fd1498Szrj       if (pfile->state.in_directive)
59*38fd1498Szrj 	src_loc = pfile->directive_line;
60*38fd1498Szrj       else
61*38fd1498Szrj 	src_loc = pfile->line_table->highest_line;
62*38fd1498Szrj     }
63*38fd1498Szrj   /* We don't want to refer to a token before the beginning of the
64*38fd1498Szrj      current run -- that is invalid.  */
65*38fd1498Szrj   else if (pfile->cur_token == pfile->cur_run->base)
66*38fd1498Szrj     {
67*38fd1498Szrj       src_loc = 0;
68*38fd1498Szrj     }
69*38fd1498Szrj   else
70*38fd1498Szrj     {
71*38fd1498Szrj       src_loc = pfile->cur_token[-1].src_loc;
72*38fd1498Szrj     }
73*38fd1498Szrj   rich_location richloc (pfile->line_table, src_loc);
74*38fd1498Szrj   return cpp_diagnostic_at (pfile, level, reason, &richloc, msgid, ap);
75*38fd1498Szrj }
76*38fd1498Szrj 
77*38fd1498Szrj /* Print a warning or error, depending on the value of LEVEL.  */
78*38fd1498Szrj 
79*38fd1498Szrj bool
cpp_error(cpp_reader * pfile,int level,const char * msgid,...)80*38fd1498Szrj cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
81*38fd1498Szrj {
82*38fd1498Szrj   va_list ap;
83*38fd1498Szrj   bool ret;
84*38fd1498Szrj 
85*38fd1498Szrj   va_start (ap, msgid);
86*38fd1498Szrj 
87*38fd1498Szrj   ret = cpp_diagnostic (pfile, level, CPP_W_NONE, msgid, &ap);
88*38fd1498Szrj 
89*38fd1498Szrj   va_end (ap);
90*38fd1498Szrj   return ret;
91*38fd1498Szrj }
92*38fd1498Szrj 
93*38fd1498Szrj /* Print a warning.  The warning reason may be given in REASON.  */
94*38fd1498Szrj 
95*38fd1498Szrj bool
cpp_warning(cpp_reader * pfile,int reason,const char * msgid,...)96*38fd1498Szrj cpp_warning (cpp_reader * pfile, int reason, const char *msgid, ...)
97*38fd1498Szrj {
98*38fd1498Szrj   va_list ap;
99*38fd1498Szrj   bool ret;
100*38fd1498Szrj 
101*38fd1498Szrj   va_start (ap, msgid);
102*38fd1498Szrj 
103*38fd1498Szrj   ret = cpp_diagnostic (pfile, CPP_DL_WARNING, reason, msgid, &ap);
104*38fd1498Szrj 
105*38fd1498Szrj   va_end (ap);
106*38fd1498Szrj   return ret;
107*38fd1498Szrj }
108*38fd1498Szrj 
109*38fd1498Szrj /* Print a pedantic warning.  The warning reason may be given in REASON.  */
110*38fd1498Szrj 
111*38fd1498Szrj bool
cpp_pedwarning(cpp_reader * pfile,int reason,const char * msgid,...)112*38fd1498Szrj cpp_pedwarning (cpp_reader * pfile, int reason, const char *msgid, ...)
113*38fd1498Szrj {
114*38fd1498Szrj   va_list ap;
115*38fd1498Szrj   bool ret;
116*38fd1498Szrj 
117*38fd1498Szrj   va_start (ap, msgid);
118*38fd1498Szrj 
119*38fd1498Szrj   ret = cpp_diagnostic (pfile, CPP_DL_PEDWARN, reason, msgid, &ap);
120*38fd1498Szrj 
121*38fd1498Szrj   va_end (ap);
122*38fd1498Szrj   return ret;
123*38fd1498Szrj }
124*38fd1498Szrj 
125*38fd1498Szrj /* Print a warning, including system headers.  The warning reason may be
126*38fd1498Szrj    given in REASON.  */
127*38fd1498Szrj 
128*38fd1498Szrj bool
cpp_warning_syshdr(cpp_reader * pfile,int reason,const char * msgid,...)129*38fd1498Szrj cpp_warning_syshdr (cpp_reader * pfile, int reason, const char *msgid, ...)
130*38fd1498Szrj {
131*38fd1498Szrj   va_list ap;
132*38fd1498Szrj   bool ret;
133*38fd1498Szrj 
134*38fd1498Szrj   va_start (ap, msgid);
135*38fd1498Szrj 
136*38fd1498Szrj   ret = cpp_diagnostic (pfile, CPP_DL_WARNING_SYSHDR, reason, msgid, &ap);
137*38fd1498Szrj 
138*38fd1498Szrj   va_end (ap);
139*38fd1498Szrj   return ret;
140*38fd1498Szrj }
141*38fd1498Szrj 
142*38fd1498Szrj /* Print a diagnostic at a specific location.  */
143*38fd1498Szrj 
144*38fd1498Szrj ATTRIBUTE_FPTR_PRINTF(6,0)
145*38fd1498Szrj static bool
cpp_diagnostic_with_line(cpp_reader * pfile,int level,int reason,source_location src_loc,unsigned int column,const char * msgid,va_list * ap)146*38fd1498Szrj cpp_diagnostic_with_line (cpp_reader * pfile, int level, int reason,
147*38fd1498Szrj 		          source_location src_loc, unsigned int column,
148*38fd1498Szrj 		          const char *msgid, va_list *ap)
149*38fd1498Szrj {
150*38fd1498Szrj   bool ret;
151*38fd1498Szrj 
152*38fd1498Szrj   if (!pfile->cb.error)
153*38fd1498Szrj     abort ();
154*38fd1498Szrj   rich_location richloc (pfile->line_table, src_loc);
155*38fd1498Szrj   if (column)
156*38fd1498Szrj     richloc.override_column (column);
157*38fd1498Szrj   ret = pfile->cb.error (pfile, level, reason, &richloc, _(msgid), ap);
158*38fd1498Szrj 
159*38fd1498Szrj   return ret;
160*38fd1498Szrj }
161*38fd1498Szrj 
162*38fd1498Szrj /* Print a warning or error, depending on the value of LEVEL.  */
163*38fd1498Szrj 
164*38fd1498Szrj bool
cpp_error_with_line(cpp_reader * pfile,int level,source_location src_loc,unsigned int column,const char * msgid,...)165*38fd1498Szrj cpp_error_with_line (cpp_reader *pfile, int level,
166*38fd1498Szrj 		     source_location src_loc, unsigned int column,
167*38fd1498Szrj 		     const char *msgid, ...)
168*38fd1498Szrj {
169*38fd1498Szrj   va_list ap;
170*38fd1498Szrj   bool ret;
171*38fd1498Szrj 
172*38fd1498Szrj   va_start (ap, msgid);
173*38fd1498Szrj 
174*38fd1498Szrj   ret = cpp_diagnostic_with_line (pfile, level, CPP_W_NONE, src_loc,
175*38fd1498Szrj                                   column, msgid, &ap);
176*38fd1498Szrj 
177*38fd1498Szrj   va_end (ap);
178*38fd1498Szrj   return ret;
179*38fd1498Szrj }
180*38fd1498Szrj 
181*38fd1498Szrj /* Print a warning.  The warning reason may be given in REASON.  */
182*38fd1498Szrj 
183*38fd1498Szrj bool
cpp_warning_with_line(cpp_reader * pfile,int reason,source_location src_loc,unsigned int column,const char * msgid,...)184*38fd1498Szrj cpp_warning_with_line (cpp_reader *pfile, int reason,
185*38fd1498Szrj 		       source_location src_loc, unsigned int column,
186*38fd1498Szrj 		       const char *msgid, ...)
187*38fd1498Szrj {
188*38fd1498Szrj   va_list ap;
189*38fd1498Szrj   bool ret;
190*38fd1498Szrj 
191*38fd1498Szrj   va_start (ap, msgid);
192*38fd1498Szrj 
193*38fd1498Szrj   ret = cpp_diagnostic_with_line (pfile, CPP_DL_WARNING, reason, src_loc,
194*38fd1498Szrj                                   column, msgid, &ap);
195*38fd1498Szrj 
196*38fd1498Szrj   va_end (ap);
197*38fd1498Szrj   return ret;
198*38fd1498Szrj }
199*38fd1498Szrj 
200*38fd1498Szrj /* Print a pedantic warning.  The warning reason may be given in REASON.  */
201*38fd1498Szrj 
202*38fd1498Szrj bool
cpp_pedwarning_with_line(cpp_reader * pfile,int reason,source_location src_loc,unsigned int column,const char * msgid,...)203*38fd1498Szrj cpp_pedwarning_with_line (cpp_reader *pfile, int reason,
204*38fd1498Szrj 		          source_location src_loc, unsigned int column,
205*38fd1498Szrj 		          const char *msgid, ...)
206*38fd1498Szrj {
207*38fd1498Szrj   va_list ap;
208*38fd1498Szrj   bool ret;
209*38fd1498Szrj 
210*38fd1498Szrj   va_start (ap, msgid);
211*38fd1498Szrj 
212*38fd1498Szrj   ret = cpp_diagnostic_with_line (pfile, CPP_DL_PEDWARN, reason, src_loc,
213*38fd1498Szrj                                   column, msgid, &ap);
214*38fd1498Szrj 
215*38fd1498Szrj   va_end (ap);
216*38fd1498Szrj   return ret;
217*38fd1498Szrj }
218*38fd1498Szrj 
219*38fd1498Szrj /* Print a warning, including system headers.  The warning reason may be
220*38fd1498Szrj    given in REASON.  */
221*38fd1498Szrj 
222*38fd1498Szrj bool
cpp_warning_with_line_syshdr(cpp_reader * pfile,int reason,source_location src_loc,unsigned int column,const char * msgid,...)223*38fd1498Szrj cpp_warning_with_line_syshdr (cpp_reader *pfile, int reason,
224*38fd1498Szrj 		              source_location src_loc, unsigned int column,
225*38fd1498Szrj 		              const char *msgid, ...)
226*38fd1498Szrj {
227*38fd1498Szrj   va_list ap;
228*38fd1498Szrj   bool ret;
229*38fd1498Szrj 
230*38fd1498Szrj   va_start (ap, msgid);
231*38fd1498Szrj 
232*38fd1498Szrj   ret = cpp_diagnostic_with_line (pfile, CPP_DL_WARNING_SYSHDR, reason, src_loc,
233*38fd1498Szrj                                   column, msgid, &ap);
234*38fd1498Szrj 
235*38fd1498Szrj   va_end (ap);
236*38fd1498Szrj   return ret;
237*38fd1498Szrj }
238*38fd1498Szrj 
239*38fd1498Szrj /* As cpp_error, but use SRC_LOC as the location of the error, without
240*38fd1498Szrj    a column override.  */
241*38fd1498Szrj 
242*38fd1498Szrj bool
cpp_error_at(cpp_reader * pfile,int level,source_location src_loc,const char * msgid,...)243*38fd1498Szrj cpp_error_at (cpp_reader * pfile, int level, source_location src_loc,
244*38fd1498Szrj 	      const char *msgid, ...)
245*38fd1498Szrj {
246*38fd1498Szrj   va_list ap;
247*38fd1498Szrj   bool ret;
248*38fd1498Szrj 
249*38fd1498Szrj   va_start (ap, msgid);
250*38fd1498Szrj 
251*38fd1498Szrj   rich_location richloc (pfile->line_table, src_loc);
252*38fd1498Szrj   ret = cpp_diagnostic_at (pfile, level, CPP_W_NONE, &richloc,
253*38fd1498Szrj 			   msgid, &ap);
254*38fd1498Szrj 
255*38fd1498Szrj   va_end (ap);
256*38fd1498Szrj   return ret;
257*38fd1498Szrj }
258*38fd1498Szrj 
259*38fd1498Szrj /* As cpp_error, but use RICHLOC as the location of the error, without
260*38fd1498Szrj    a column override.  */
261*38fd1498Szrj 
262*38fd1498Szrj bool
cpp_error_at(cpp_reader * pfile,int level,rich_location * richloc,const char * msgid,...)263*38fd1498Szrj cpp_error_at (cpp_reader * pfile, int level, rich_location *richloc,
264*38fd1498Szrj 	      const char *msgid, ...)
265*38fd1498Szrj {
266*38fd1498Szrj   va_list ap;
267*38fd1498Szrj   bool ret;
268*38fd1498Szrj 
269*38fd1498Szrj   va_start (ap, msgid);
270*38fd1498Szrj 
271*38fd1498Szrj   ret = cpp_diagnostic_at (pfile, level, CPP_W_NONE, richloc,
272*38fd1498Szrj 			   msgid, &ap);
273*38fd1498Szrj 
274*38fd1498Szrj   va_end (ap);
275*38fd1498Szrj   return ret;
276*38fd1498Szrj }
277*38fd1498Szrj 
278*38fd1498Szrj /* Print a warning or error, depending on the value of LEVEL.  Include
279*38fd1498Szrj    information from errno.  */
280*38fd1498Szrj 
281*38fd1498Szrj bool
cpp_errno(cpp_reader * pfile,int level,const char * msgid)282*38fd1498Szrj cpp_errno (cpp_reader *pfile, int level, const char *msgid)
283*38fd1498Szrj {
284*38fd1498Szrj   return cpp_error (pfile, level, "%s: %s", _(msgid), xstrerror (errno));
285*38fd1498Szrj }
286*38fd1498Szrj 
287*38fd1498Szrj /* Print a warning or error, depending on the value of LEVEL.  Include
288*38fd1498Szrj    information from errno.  Unlike cpp_errno, the argument is a filename
289*38fd1498Szrj    that is not localized, but "" is replaced with localized "stdout".  */
290*38fd1498Szrj 
291*38fd1498Szrj bool
cpp_errno_filename(cpp_reader * pfile,int level,const char * filename,source_location loc)292*38fd1498Szrj cpp_errno_filename (cpp_reader *pfile, int level, const char *filename,
293*38fd1498Szrj 		    source_location loc)
294*38fd1498Szrj {
295*38fd1498Szrj   if (filename[0] == '\0')
296*38fd1498Szrj     filename = _("stdout");
297*38fd1498Szrj 
298*38fd1498Szrj   return cpp_error_at (pfile, level, loc, "%s: %s", filename,
299*38fd1498Szrj 		       xstrerror (errno));
300*38fd1498Szrj }
301