]> 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>
Sat, 9 Apr 2011 17:00:35 +0000 (13:00 -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.
(cherry picked from commit 8ffd7912e3b71fb0cc69e83225c3ad8e3452270f)

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 8feb6a558671000b6fd7f9a06b2d7ea20ef1a2c6..aff493f48b195eab373d108a19487cba0982587b 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 404efd7a0db4b30c4b82eb90902c17ec1a21a829..eff33c080e113f6d957e888ecf76b7bed76d4a43 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -375,6 +375,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 f9b1b8a6c8337308ce615bbabbb48772463d613c..41c4b55f3ea901f643b5ed5e261f0aa568169364 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 3fc29d45d9afb36ee1002f23f84763ff7d67089e..1a1da5303c8683468f0df8fef49179c0f52930c1 100644 (file)
@@ -8739,10 +8739,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 a15dd24c1282c3c11cb1ed0e7679257dde363d67..b0e34503566555a6f9d9547ce4ea37d19d5a68dd 100644 (file)
@@ -59,7 +59,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 },
@@ -230,6 +230,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
@@ -240,6 +241,7 @@ static const int warnings_types[] =
   warnings_none,
   warnings_midrule_values,
   warnings_yacc,
+  warnings_other,
   warnings_all,
   warnings_error
 };
@@ -330,6 +332,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 f114622040c7b3b67d526741d1f05fc25721feb7..1a9d913df52b48b4aa81dc4a5ba11e60a87e9309 100644 (file)
@@ -119,6 +119,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 49f2eb7eaeb258cdbc129241e704786fffd170e0..05aeac88b11a845a46becfbf02a922c60475951d 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 9a58acbd07cf6a8dd1f3ce62d865edc0b9c21bd4..20f81d687fec8c4344bf70e70e293116845aada0 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 6417e708ec758245faa73f5d65f5a57107e57191..b9eae0be46c0431b101c2481e5ea2240f29f2ee5 100644 (file)
@@ -247,8 +247,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:
@@ -262,6 +264,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($@)])
@@ -287,10 +291,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.
@@ -322,10 +332,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