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