]> git.saurik.com Git - bison.git/blob - src/complain.h
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / complain.h
1 /* Declaration for error-reporting function for Bison.
2
3 Copyright (C) 2000-2002, 2006, 2009-2013 Free Software Foundation,
4 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 <http://www.gnu.org/licenses/>. */
18
19 #ifndef COMPLAIN_H_
20 # define COMPLAIN_H_ 1
21
22 # include "location.h"
23
24 /* Sub-messages indent. */
25 # define SUB_INDENT (4)
26
27 /*-------------.
28 | --warnings. |
29 `-------------*/
30
31 /** The bits assigned to each warning type. */
32 typedef enum
33 {
34 warning_midrule_values, /**< Unset or unused midrule values. */
35 warning_yacc, /**< POSIXME. */
36 warning_conflicts_sr, /**< S/R conflicts. */
37 warning_conflicts_rr, /**< R/R conflicts. */
38 warning_empty_rule, /**< Implicitly empty rules. */
39 warning_deprecated, /**< Obsolete constructs. */
40 warning_precedence, /**< Useless precedence and associativity. */
41 warning_other, /**< All other warnings. */
42
43 warnings_size /**< The number of warnings. Must be last. */
44 } warning_bit;
45
46 /** Whether -Werror was set. */
47 extern bool warnings_are_errors;
48
49 /** Decode a single argument from -W.
50 *
51 * \param arg the subarguments to decode.
52 * If null, then activate all the flags.
53 * \param no length of the potential "no-" prefix.
54 * Can be 0 or 3. If 3, negate the action of the subargument.
55 * \param err length of a potential "error=".
56 * Can be 0 or 6. If 6, treat the subargument as a CATEGORY.
57 *
58 * If VALUE != 0 then KEY sets flags and no-KEY clears them.
59 * If VALUE == 0 then KEY clears all flags from \c all and no-KEY sets all
60 * flags from \c all. Thus no-none = all and no-all = none.
61 */
62 void warning_argmatch (char const *arg, size_t no, size_t err);
63
64 /** Decode a comma-separated list of arguments from -W.
65 *
66 * \param args comma separated list of effective subarguments to decode.
67 * If 0, then activate all the flags.
68 */
69 void warnings_argmatch (char *args);
70
71
72 /*-----------.
73 | complain. |
74 `-----------*/
75
76 /** Initialize this module. */
77 void complain_init (void);
78
79 typedef enum
80 {
81 /**< Issue no warnings. */
82 Wnone = 0,
83
84 Wmidrule_values = 1 << warning_midrule_values,
85 Wyacc = 1 << warning_yacc,
86 Wconflicts_sr = 1 << warning_conflicts_sr,
87 Wconflicts_rr = 1 << warning_conflicts_rr,
88 Wdeprecated = 1 << warning_deprecated,
89 Wempty_rule = 1 << warning_empty_rule,
90 Wprecedence = 1 << warning_precedence,
91 Wother = 1 << warning_other,
92
93 Werror = 1 << 10, /** This bit is no longer used. */
94
95 complaint = 1 << 11, /**< All complaints. */
96 fatal = 1 << 12, /**< All fatal errors. */
97 silent = 1 << 13, /**< Do not display the warning type. */
98 no_caret = 1 << 14, /**< Do not display caret location. */
99
100 /**< All above warnings. */
101 Weverything = ~complaint & ~fatal & ~silent,
102 Wall = Weverything & ~Wyacc
103 } warnings;
104
105 /** Whether the warnings of \a flags are all unset.
106 (Never enabled, never disabled). */
107 bool warning_is_unset (warnings flags);
108
109 /** Make a complaint, with maybe a location. */
110 void complain (location const *loc, warnings flags, char const *message, ...)
111 __attribute__ ((__format__ (__printf__, 3, 4)));
112
113 /** Likewise, but with an \a argc/argv interface. */
114 void complain_args (location const *loc, warnings w, unsigned *indent,
115 int argc, char *arg[]);
116
117 /** Make a complaint with location and some indentation. */
118 void complain_indent (location const *loc, warnings flags, unsigned *indent,
119 char const *message, ...)
120 __attribute__ ((__format__ (__printf__, 4, 5)));
121
122
123 /** Report an obsolete syntax, suggest the updated one. */
124 void deprecated_directive (location const *loc,
125 char const *obsolete, char const *updated);
126
127 /** Report a repeated directive for a rule. */
128 void duplicate_directive (char const *directive,
129 location first, location second);
130
131 /** Warnings treated as errors shouldn't stop the execution as regular errors
132 should (because due to their nature, it is safe to go on). Thus, there are
133 three possible execution statuses. */
134 typedef enum
135 {
136 status_none,
137 status_warning_as_error,
138 status_complaint
139 } err_status;
140
141 /** Whether an error was reported. */
142 extern err_status complaint_status;
143
144 #endif /* !COMPLAIN_H_ */