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