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