]> git.saurik.com Git - bison.git/commitdiff
Add -Wother so -Wnone suppresses all warnings.
authorJoel E. Denny <joeldenny@joeldenny.org>
Sun, 27 Mar 2011 23:08:24 +0000 (19:08 -0400)
committerJoel E. Denny <joeldenny@joeldenny.org>
Sun, 3 Apr 2011 23:45:39 +0000 (19:45 -0400)
Reported by George Neuner at
<http://lists.gnu.org/archive/html/bug-bison/2010-08/msg00002.html>.
* 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
NEWS
THANKS
doc/bison.texinfo
src/complain.c
src/complain.h
src/getargs.c
src/getargs.h
src/gram.c
src/reader.c
tests/local.at

index 4eb5ebd15bb44e10bab78f8b6dacebcb65ef90aa..5c798129ddcaba6371a482b9268411be9af2ac7b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,32 @@
+2011-03-27  Joel E. Denny  <joeldenny@joeldenny.org>
+
+       Add -Wother so -Wnone suppresses all warnings.
+       Reported by George Neuner at
+       <http://lists.gnu.org/archive/html/bug-bison/2010-08/msg00002.html>.
+       * 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  <joeldenny@joeldenny.org>
 
        Don't let -Wnone disable -Werror.
diff --git a/NEWS b/NEWS
index 243ada5325f44c14005f3f3466f6bf675642dddb..7584f18ebf9debede7c8ee26952e5d0d67158a2c 100644 (file)
--- 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 ad6f37930aba1dc99ff60ad0874cc6322c6f90fe..8ce57285ca51c71c2dbb0c94c9bca1bcfd9f3e50 100644 (file)
--- 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
index 8ecb5fb08debed6c93f2421b2f6764b2b111ade3..cb50a017d52b16a458c922480d1908d956d41c90 100644 (file)
@@ -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
index 3b0041e830d4ccc669459fda55ca864778f5eff9..5629dd3a1c59adfc875596b7e6929b9c85046fed 100644 (file)
@@ -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.  |
index f62817562b42916289463926d6b62c12a130e05b..3d867f5ea62618b87f7ad90c94fabf522f16dc32 100644 (file)
@@ -25,7 +25,8 @@
 extern "C" {
 # endif
 
-/** Informative messages, but we proceed.  */
+/** Informative messages, but we proceed.  Report iff
+    <tt>warnings_flag & warnings_other</tt>.  */
 
 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
+    <tt>warnings_flag & warnings_midrule_values</tt>.  */
+
+void midrule_value_at (location loc, char const *format, ...)
+  __attribute__ ((__format__ (__printf__, 2, 3)));
 
 /** A fatal error, causing immediate exit.  */
 
index 9c9f0c34c76fe6709020fe47955e7ee394430e2f..772d7dfc51530aac24a72154bb6a76a8391d5651 100644 (file)
@@ -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\
index 6f9943548f462fe0469077be8b8e56a5841b8373..dc92584cb58f10d063c0ffb79d0389a8a9b0de53 100644 (file)
@@ -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.  */
index 76acceec15ff94710fcf7eb0378590f6f245549d..21212792b891f258d11885e9cd182ab5ff56a81d 100644 (file)
@@ -24,6 +24,7 @@
 #include <quotearg.h>
 
 #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);
+          }
       }
 }
 
index eb9507039408b2dd3189732180fd50d3ff5a32d4..92db57177046078bca4816a351065d56d6d5ba06 100644 (file)
@@ -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
index 9ccc2c53d4cefec345ff286350a33efa8adf0af8..dea5ed4dc57c998416826a4d1674b00768694467 100644 (file)
@@ -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