summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
8f6bbe0)
Treating warnings as errors caused Bison to exit earlier than needed, making it
hide warnings that would have been printed had -Werror not been set.
Also, fix a bug that caused some context information of errors to not be
shown.
* src/complain.c (complaint_issued): Rename as...
(complaint_status): This, and change its type from boolean to
* src/complain.h (err_status): This, new enumeration.
* src/main.c (main): Adjust (only finish early if an actual complaint was
risen, not a mere warning treated an error).
* src/reader.c: Adjust.
+err_status complaint_status = status_none;
static unsigned *indent_ptr = 0;
void
static unsigned *indent_ptr = 0;
void
: flags & (errors_flag | complaint) ? _("error")
: _("warning");
: flags & (errors_flag | complaint) ? _("error")
: _("warning");
- complaint_issued |= flags & (complaint | errors_flag);
- if (flags & (warnings_flag | silent | fatal | complaint))
+ if ((flags & complaint) && complaint_status < status_complaint)
+ complaint_status = status_complaint;
+ else if ((flags & (warnings_flag & errors_flag)) && ! complaint_status)
+ complaint_status = status_warning_as_error;
+ if (flags & (warnings_flag | fatal | complaint))
error_message (loc, flags, prefix, message, args);
if (flags & fatal)
exit (EXIT_FAILURE);
error_message (loc, flags, prefix, message, args);
if (flags & fatal)
exit (EXIT_FAILURE);
char const *message, ...)
__attribute__ ((__format__ (__printf__, 4, 5)));
char const *message, ...)
__attribute__ ((__format__ (__printf__, 4, 5)));
+
+/** Warnings treated as errors shouldn't stop the execution as regular errors
+ should (because due to their nature, it is safe to go on). Thus, there are
+ three possible execution statuses. */
+typedef enum
+ {
+ status_none,
+ status_warning_as_error,
+ status_complaint
+ } err_status;
+
/** Whether an error was reported. */
/** Whether an error was reported. */
-extern bool complaint_issued;
+extern err_status complaint_status;
#endif /* !COMPLAIN_H_ */
#endif /* !COMPLAIN_H_ */
reader ();
timevar_pop (TV_READER);
reader ();
timevar_pop (TV_READER);
+ if (complaint_status == status_complaint)
goto finish;
/* Find useless nonterminals and productions and reduce the grammar. */
goto finish;
/* Find useless nonterminals and productions and reduce the grammar. */
/* Stop if there were errors, to avoid trashing previous output
files. */
/* Stop if there were errors, to avoid trashing previous output
files. */
+ if (complaint_status == status_complaint)
goto finish;
/* Lookahead tokens are no longer needed. */
goto finish;
/* Lookahead tokens are no longer needed. */
timevar_stop (TV_TOTAL);
timevar_print (stderr);
timevar_stop (TV_TOTAL);
timevar_print (stderr);
- return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
+ return complaint_status ? EXIT_FAILURE : EXIT_SUCCESS;
gram_parse ();
prepare_percent_define_front_end_variables ();
gram_parse ();
prepare_percent_define_front_end_variables ();
- if (! complaint_issued)
+ if (complaint_status < status_complaint)
check_and_convert_grammar ();
xfclose (gram_in);
check_and_convert_grammar ();
xfclose (gram_in);