From 8ffd7912e3b71fb0cc69e83225c3ad8e3452270f Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Sun, 27 Mar 2011 19:08:24 -0400 Subject: [PATCH] Add -Wother so -Wnone suppresses all warnings. Reported by George Neuner at . * NEWS (2.5): Document. * THANKS (George Neuner): Add. * doc/bison.texinfo (Bison Options): Document. * src/complain.c, src/complain.h (warn_at, warn_at_indent, warn): Suppress warning if -Wno-other. (midrule_value_at): New warning function, similar to yacc_at in that it's controlled by its own warning category. * src/getargs.c (warnings_flag): Initialize to warnings_other. (warnings_args, warnings_types): Add entry for warnings_other. (usage): Update. * src/getargs.h (enum warnings): Add entry for warnings_other. * src/gram.c (grammar_rules_useless_report): If -Wno-other, then don't print useless rules. * src/reader.c (symbol_should_be_used): Rather than adjusting the return value based on whether midrule value warnings are enabled, accept a new parameter for telling the caller whether true is being returned for a potential midrule warning. (grammar_rule_check): Use midrule_value_at for midrule value warnings, and continue to use warn_at for all other warnings. Let them check whether the warnings are enabled. * tests/local.at (AT_BISON_CHECK): Update documentation. (AT_BISON_CHECK_NO_XML): Check that -Wnone and --warnings=none disable all warnings exercised in the test suite. --- ChangeLog | 29 ++++++++++++++++++++++++++++ NEWS | 9 +++++++++ THANKS | 1 + doc/bison.texinfo | 8 +++++++- src/complain.c | 14 ++++++++++++++ src/complain.h | 8 +++++++- src/getargs.c | 5 ++++- src/getargs.h | 1 + src/gram.c | 8 ++++++-- src/reader.c | 48 +++++++++++++++++++++++++++-------------------- tests/local.at | 33 ++++++++++++++++++++++++++------ 11 files changed, 133 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4eb5ebd1..5c798129 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +2011-03-27 Joel E. Denny + + Add -Wother so -Wnone suppresses all warnings. + Reported by George Neuner at + . + * NEWS (2.5): Document. + * THANKS (George Neuner): Add. + * doc/bison.texinfo (Bison Options): Document. + * src/complain.c, src/complain.h + (warn_at, warn_at_indent, warn): Suppress warning if -Wno-other. + (midrule_value_at): New warning function, similar to yacc_at in + that it's controlled by its own warning category. + * src/getargs.c (warnings_flag): Initialize to warnings_other. + (warnings_args, warnings_types): Add entry for warnings_other. + (usage): Update. + * src/getargs.h (enum warnings): Add entry for warnings_other. + * src/gram.c (grammar_rules_useless_report): If -Wno-other, then + don't print useless rules. + * src/reader.c (symbol_should_be_used): Rather than adjusting the + return value based on whether midrule value warnings are enabled, + accept a new parameter for telling the caller whether true is + being returned for a potential midrule warning. + (grammar_rule_check): Use midrule_value_at for midrule value + warnings, and continue to use warn_at for all other warnings. Let + them check whether the warnings are enabled. + * tests/local.at (AT_BISON_CHECK): Update documentation. + (AT_BISON_CHECK_NO_XML): Check that -Wnone and --warnings=none + disable all warnings exercised in the test suite. + 2011-03-27 Joel E. Denny Don't let -Wnone disable -Werror. diff --git a/NEWS b/NEWS index 243ada53..7584f18e 100644 --- a/NEWS +++ b/NEWS @@ -316,6 +316,15 @@ Bison News bison -Werror,none,yacc gram.y +*** The "none" category now disables all Bison warnings. + + Previously, the "none" category disabled only Bison warnings for + which there existed a specific -W/--warning category. However, + given the following command line, Bison is now guaranteed to + suppress all warnings: + + bison -Wnone gram.y + * Changes in version 2.4.3 (2010-08-05): ** Bison now obeys -Werror and --warnings=error for warnings about diff --git a/THANKS b/THANKS index ad6f3793..8ce57285 100644 --- a/THANKS +++ b/THANKS @@ -41,6 +41,7 @@ Florian Krohm florian@edamail.fishkill.ibm.com Frank Heckenbach frank@g-n-u.de Frans Englich frans.englich@telia.com Georg Sauthoff gsauthof@TechFak.Uni-Bielefeld.DE +George Neuner gneuner2@comcast.net Goran Uddeborg goeran@uddeborg.se Guido Trentalancia trentalg@aston.ac.uk H. Merijn Brand h.m.brand@hccnet.nl diff --git a/doc/bison.texinfo b/doc/bison.texinfo index 8ecb5fb0..cb50a017 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -8426,10 +8426,16 @@ These warnings are not enabled by default since they sometimes prove to be false alarms in existing grammars employing the Yacc constructs @code{$0} or @code{$-@var{n}} (where @var{n} is some positive integer). - @item yacc Incompatibilities with POSIX Yacc. +@item other +All warnings not categorized above. These warnings are enabled by default. + +This category is provided merely for the sake of completeness. Future +releases of Bison may move warnings from this category to new, more specific +categories. + @item all All the warnings. @item none diff --git a/src/complain.c b/src/complain.c index 3b0041e8..5629dd3a 100644 --- a/src/complain.c +++ b/src/complain.c @@ -109,6 +109,8 @@ set_warning_issued (void) void warn_at (location loc, const char *message, ...) { + if (!(warnings_flag & warnings_other)) + return; set_warning_issued (); ERROR_MESSAGE (&loc, _("warning"), message); } @@ -117,6 +119,8 @@ void warn_at_indent (location loc, unsigned *indent, const char *message, ...) { + if (!(warnings_flag & warnings_other)) + return; set_warning_issued (); indent_ptr = indent; ERROR_MESSAGE (&loc, _("warning"), message); @@ -125,6 +129,8 @@ warn_at_indent (location loc, unsigned *indent, void warn (const char *message, ...) { + if (!(warnings_flag & warnings_other)) + return; set_warning_issued (); ERROR_MESSAGE (NULL, _("warning"), message); } @@ -178,6 +184,14 @@ yacc_at (location loc, const char *message, ...) } } +void +midrule_value_at (location loc, const char *message, ...) +{ + if (!(warnings_flag & warnings_midrule_values)) + return; + set_warning_issued (); + ERROR_MESSAGE (&loc, _("warning"), message); +} /*-------------------------------------------------. | A severe error has occurred, we cannot proceed. | diff --git a/src/complain.h b/src/complain.h index f6281756..3d867f5e 100644 --- a/src/complain.h +++ b/src/complain.h @@ -25,7 +25,8 @@ extern "C" { # endif -/** Informative messages, but we proceed. */ +/** Informative messages, but we proceed. Report iff + warnings_flag & warnings_other. */ void warn (char const *format, ...) __attribute__ ((__format__ (__printf__, 1, 2))); @@ -61,6 +62,11 @@ void complain_at_indent (location loc, unsigned *indent, void yacc_at (location loc, char const *format, ...) __attribute__ ((__format__ (__printf__, 2, 3))); +/** A midrule-value warning. Report iff + warnings_flag & warnings_midrule_values. */ + +void midrule_value_at (location loc, char const *format, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); /** A fatal error, causing immediate exit. */ diff --git a/src/getargs.c b/src/getargs.c index 9c9f0c34..772d7dfc 100644 --- a/src/getargs.c +++ b/src/getargs.c @@ -63,7 +63,7 @@ bool glr_parser = false; int report_flag = report_none; int trace_flag = trace_none; -int warnings_flag = warnings_none; +int warnings_flag = warnings_other; static struct bison_language const valid_languages[] = { { "c", "c-skel.m4", ".c", ".h", true }, @@ -234,6 +234,7 @@ static const char * const warnings_args[] = "none - no warnings", "midrule-values - unset or unused midrule values", "yacc - incompatibilities with POSIX Yacc", + "other - all other warnings", "all - all of the above", "error - warnings are errors", 0 @@ -244,6 +245,7 @@ static const int warnings_types[] = warnings_none, warnings_midrule_values, warnings_yacc, + warnings_other, warnings_all, warnings_error }; @@ -333,6 +335,7 @@ Output:\n\ Warning categories include:\n\ `midrule-values' unset or unused midrule values\n\ `yacc' incompatibilities with POSIX Yacc\n\ + `other' all other warnings (enabled by default)\n\ `all' all the warnings\n\ `no-CATEGORY' turn off warnings in CATEGORY\n\ `none' turn off all the warnings\n\ diff --git a/src/getargs.h b/src/getargs.h index 6f994354..dc92584c 100644 --- a/src/getargs.h +++ b/src/getargs.h @@ -123,6 +123,7 @@ enum warnings warnings_error = 1 << 0, /**< Warnings are treated as errors. */ warnings_midrule_values = 1 << 1, /**< Unset or unused midrule values. */ warnings_yacc = 1 << 2, /**< POSIXME. */ + warnings_other = 1 << 3, /**< All other warnings. */ warnings_all = ~warnings_error /**< All above warnings. */ }; /** What warnings are issued. */ diff --git a/src/gram.c b/src/gram.c index 76acceec..21212792 100644 --- a/src/gram.c +++ b/src/gram.c @@ -24,6 +24,7 @@ #include #include "complain.h" +#include "getargs.h" #include "gram.h" #include "print-xml.h" #include "reader.h" @@ -310,8 +311,11 @@ grammar_rules_useless_report (const char *message) if (!rules[r].useful) { warn_at (rules[r].location, "%s: ", message); - rule_print (&rules[r], stderr); - fflush (stderr); + if (warnings_flag & warnings_other) + { + rule_print (&rules[r], stderr); + fflush (stderr); + } } } diff --git a/src/reader.c b/src/reader.c index eb950703..92db5717 100644 --- a/src/reader.c +++ b/src/reader.c @@ -250,22 +250,25 @@ grammar_current_rule_begin (symbol *lhs, location loc, /*----------------------------------------------------------------------. | A symbol should be used if either: | | 1. It has a destructor. | -| 2. --warnings=midrule-values and the symbol is a mid-rule symbol | -| (i.e., the generated LHS replacing a mid-rule action) that was | -| assigned to or used, as in "exp: { $$ = 1; } { $$ = $1; }". | +| 2. The symbol is a mid-rule symbol (i.e., the generated LHS | +| replacing a mid-rule action) that was assigned to or used, as in | +| "exp: { $$ = 1; } { $$ = $1; }". | `----------------------------------------------------------------------*/ static bool -symbol_should_be_used (symbol_list const *s) +symbol_should_be_used (symbol_list const *s, bool *midrule_warning) { if (symbol_destructor_get (s->content.sym)->code) return true; - if (warnings_flag & warnings_midrule_values) - return ((s->midrule && s->midrule->action_props.is_value_used) - || (s->midrule_parent_rule - && symbol_list_n_get (s->midrule_parent_rule, - s->midrule_parent_rhs_index) - ->action_props.is_value_used)); + if ((s->midrule && s->midrule->action_props.is_value_used) + || (s->midrule_parent_rule + && symbol_list_n_get (s->midrule_parent_rule, + s->midrule_parent_rhs_index) + ->action_props.is_value_used)) + { + *midrule_warning = true; + return true; + } return false; } @@ -309,16 +312,21 @@ grammar_rule_check (const symbol_list *r) symbol_list const *l = r; int n = 0; for (; l && l->content.sym; l = l->next, ++n) - if (! (l->action_props.is_value_used - || !symbol_should_be_used (l) - /* The default action, $$ = $1, `uses' both. */ - || (!r->action_props.code && (n == 0 || n == 1)))) - { - if (n) - warn_at (r->location, _("unused value: $%d"), n); - else - warn_at (r->location, _("unset value: $$")); - } + { + bool midrule_warning = false; + if (!l->action_props.is_value_used + && symbol_should_be_used (l, &midrule_warning) + /* The default action, $$ = $1, `uses' both. */ + && (r->action_props.code || (n != 0 && n != 1))) + { + void (*warn_at_ptr)(location, char const*, ...) = + midrule_warning ? midrule_value_at : warn_at; + if (n) + warn_at_ptr (r->location, _("unused value: $%d"), n); + else + warn_at_ptr (r->location, _("unset value: $$")); + } + } } /* See comments in grammar_current_rule_prec_set for how POSIX diff --git a/tests/local.at b/tests/local.at index 9ccc2c53..dea5ed4d 100644 --- a/tests/local.at +++ b/tests/local.at @@ -242,8 +242,10 @@ $2]) # AT_BISON_CHECK(BISON_ARGS, [OTHER_AT_CHECK_ARGS]) # ------------------------------------------------- -# Check Bison by invoking `bison BISON_ARGS'. OTHER_AT_CHECK_ARGS are the -# usual remaining arguments to AT_CHECK: STATUS, STDOUT, etc. +# Check Bison by invoking `bison BISON_ARGS'. BISON_ARGS should not contain +# shell constructs (such as redirection or pipes) that would prevent +# appending additional command-line arguments for bison. OTHER_AT_CHECK_ARGS +# are the usual remaining arguments to AT_CHECK: STATUS, STDOUT, etc. # # This macro or AT_BISON_CHECK_NO_XML should always be used whenever invoking # Bison in the test suite. For now it ensures that: @@ -257,6 +259,8 @@ $2]) # # 3. If stderr contains a warning, -Werror and --warnings=error # convert the warning to an error. +# +# 4. If stderr contains a warning, -Wnone and --warnings=none suppress it. m4_define([AT_BISON_CHECK], [m4_if(m4_quote($2), [0], [AT_BISON_CHECK_XML($@)], m4_quote($2), [], [AT_BISON_CHECK_XML($@)]) @@ -282,10 +286,16 @@ m4_if(m4_bregexp([$4], [: warning: ]), [-1], [], if test -f experr; then mv experr at-bison-check-experr.bak fi + if test -f expout; then + mv expout at-bison-check-expout.bak + fi + + # To avoid expanding it repeatedly, store specified stdout. + ]AT_DATA([expout], [$3])[ # Run with -Werror. - ]AT_CHECK(AT_QUELL_VALGRIND[[ bison -Werror ]$1], - [[1]], [$3], [stderr])[ + ]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ -Werror]], + [[1]], [expout], [stderr])[ # Build expected stderr up to and including the "warnings # being treated as errors" message. @@ -317,10 +327,21 @@ m4_if(m4_bregexp([$4], [: warning: ]), [-1], [], # Now check --warnings=error. cp stderr experr - ]AT_CHECK(AT_QUELL_VALGRIND[[ bison --warnings=error ]$1], - [[1]], [$3], [experr])[ + ]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ --warnings=error]], + [[1]], [expout], [experr])[ + + # Now check -Wnone and --warnings=none by making sure that + # -Werror doesn't change the exit status when -Wnone or + # --warnings=none is specified. + ]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ -Wnone -Werror]], + [[0]], [expout], [ignore])[ + ]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ --warnings=none \ + -Werror]], [[0]], [expout], [ignore])[ # Restore caller's files. + if test -f at-bison-check-expout.bak; then + mv at-bison-check-expout.bak expout + fi if test -f at-bison-check-experr.bak; then mv at-bison-check-experr.bak experr fi -- 2.45.2