1 /* Declaration for error-reporting function for Bison. 2 3 Copyright (C) 2000-2002, 2006, 2009-2015, 2018-2021 Free Software 4 Foundation, Inc. 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 18 19 #ifndef COMPLAIN_H_ 20 # define COMPLAIN_H_ 1 21 22 # include <attribute.h> 23 24 # include "location.h" 25 26 /*---------------. 27 | Error stream. | 28 `---------------*/ 29 30 /** Enable a style on \a out provided it's stderr. */ 31 void begin_use_class (const char *style, FILE *out); 32 33 /** Disable a style on \a out provided it's stderr. */ 34 void end_use_class (const char *style, FILE *out); 35 36 /** Flush \a out. */ 37 void flush (FILE *out); 38 39 /** Whether there's styling on OUT. */ 40 bool is_styled (FILE *out); 41 42 /*-------------. 43 | --warnings. | 44 `-------------*/ 45 46 /** The bits assigned to each warning type. */ 47 typedef enum 48 { 49 warning_conflicts_rr, 50 warning_conflicts_sr, 51 warning_counterexamples, 52 warning_dangling_alias, 53 warning_deprecated, 54 warning_empty_rule, 55 warning_midrule_values, 56 warning_other, 57 warning_precedence, 58 warning_yacc, /**< POSIXME. */ 59 60 warnings_size /**< The number of warnings. Must be last. */ 61 } warning_bit; 62 63 /** Whether -Werror was set. */ 64 extern bool warnings_are_errors; 65 66 /** Document --warning arguments. */ 67 void warning_usage (FILE *out); 68 69 /** Decode a single argument from -W. 70 * 71 * \param arg the subarguments to decode. 72 * If null, then activate all the flags. 73 * \param no length of the potential "no-" prefix. 74 * Can be 0 or 3. If 3, negate the action of the subargument. 75 * \param err length of a potential "error=". 76 * Can be 0 or 6. If 6, treat the subargument as a CATEGORY. 77 * 78 * If VALUE != 0 then KEY sets flags and no-KEY clears them. 79 * If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all 80 * flags from \c all. Thus no-none = all and no-all = none. 81 */ 82 void warning_argmatch (char const *arg, size_t no, size_t err); 83 84 /** Decode a comma-separated list of arguments from -W. 85 * 86 * \param args comma separated list of effective subarguments to decode. 87 * If 0, then activate all the flags. 88 */ 89 void warnings_argmatch (char *args); 90 91 92 /*-----------. 93 | complain. | 94 `-----------*/ 95 96 /** Initialize this module. */ 97 void complain_init (void); 98 99 /** Reclaim resources. */ 100 void complain_free (void); 101 102 /** Initialize support for colored messages. */ 103 void complain_init_color (void); 104 105 /** Flags passed to diagnostics functions. */ 106 typedef enum 107 { 108 Wnone = 0, /**< Issue no warnings. */ 109 110 Wconflicts_rr = 1 << warning_conflicts_rr, 111 Wconflicts_sr = 1 << warning_conflicts_sr, 112 Wcounterexamples = 1 << warning_counterexamples, 113 Wdangling_alias = 1 << warning_dangling_alias, 114 Wdeprecated = 1 << warning_deprecated, 115 Wempty_rule = 1 << warning_empty_rule, 116 Wmidrule_values = 1 << warning_midrule_values, 117 Wother = 1 << warning_other, 118 Wprecedence = 1 << warning_precedence, 119 Wyacc = 1 << warning_yacc, 120 121 complaint = 1 << 11, /**< All complaints. */ 122 fatal = 1 << 12, /**< All fatal errors. */ 123 silent = 1 << 13, /**< Do not display the warning type. */ 124 no_caret = 1 << 14, /**< Do not display caret location. */ 125 note = 1 << 15, /**< Display as a note. */ 126 127 /**< All above warnings. */ 128 Weverything = ~complaint & ~fatal & ~silent, 129 Wall = Weverything & ~Wcounterexamples & ~Wdangling_alias & ~Wyacc 130 } warnings; 131 132 /** Whether the warnings of \a flags are all unset. 133 (Never enabled, never disabled). */ 134 bool warning_is_unset (warnings flags); 135 136 /** Whether warnings of \a flags should be reported. */ 137 bool warning_is_enabled (warnings flags); 138 139 /** Make a complaint, with maybe a location. */ 140 void complain (location const *loc, warnings flags, char const *message, ...) 141 ATTRIBUTE_FORMAT ((__printf__, 3, 4)); 142 143 /** Likewise, but with an \a argc/argv interface. */ 144 void complain_args (location const *loc, warnings w, 145 int argc, char *arg[]); 146 147 /** Make a subcomplain with location and note. */ 148 void subcomplain (location const *loc, warnings flags, 149 char const *message, ...) 150 ATTRIBUTE_FORMAT ((__printf__, 3, 4)); 151 152 153 /** GNU Bison extension not valid with POSIX Yacc. */ 154 void bison_directive (location const *loc, char const *directive); 155 156 /** Report an obsolete syntax, suggest the updated one. */ 157 void deprecated_directive (location const *loc, 158 char const *obsolete, char const *updated); 159 160 /** Report a repeated directive. */ 161 void duplicate_directive (char const *directive, 162 location first, location second); 163 164 /** Report a repeated directive for a rule. */ 165 void duplicate_rule_directive (char const *directive, 166 location first, location second); 167 168 /** Report a syntax error, where argv[0] is the unexpected 169 token, and argv[1...argc] are the expected ones. */ 170 void syntax_error (location loc, 171 int argc, const char* argv[]); 172 173 /** Warnings treated as errors shouldn't stop the execution as regular 174 errors should (because due to their nature, it is safe to go 175 on). Thus, there are three possible execution statuses. */ 176 typedef enum 177 { 178 status_none, /**< No diagnostic issued so far. */ 179 status_warning_as_error, /**< A warning was issued (but no error). */ 180 status_complaint /**< An error was issued. */ 181 } err_status; 182 183 /** Whether an error was reported. */ 184 extern err_status complaint_status; 185 186 #endif /* !COMPLAIN_H_ */ 187