]> git.saurik.com Git - bison.git/commitdiff
Disable unset/unused mid-rule value warnings by default, and recognize
authorJoel E. Denny <jdenny@ces.clemson.edu>
Wed, 1 Nov 2006 06:09:40 +0000 (06:09 +0000)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Wed, 1 Nov 2006 06:09:40 +0000 (06:09 +0000)
--warnings=midrule-values to enable them.  Discussed starting at
<http://lists.gnu.org/archive/html/help-bison/2006-10/msg00030.html>.
* NEWS (2.3a+): Mention.
* src/getargs.c, src/getargs.h (warnings_args, warnings_types, enum
warnings): Add entry for midrule-values subargument.
* src/reader.c (symbol_should_be_used): Don't return true just because
the value is a set/used mid-rule value unless
--warnings=midrule-values was specified.
* tests/input.at (Unused values, Unused values before symbol
declarations): Run tests with and without --warnings=midrule-values.

* src/reader.c (check_and_convert_grammar): Use symbol_list_free rather
than LIST_FREE directly.

ChangeLog
NEWS
src/getargs.c
src/getargs.h
src/reader.c
tests/input.at

index 549060558d166a031f815ac44fd5b20e6222f95c..f4fb9918ca1d1d8f60065e1f2082267e6ce9c0ea 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2006-10-31  Joel E. Denny  <jdenny@ces.clemson.edu>
+
+       Disable unset/unused mid-rule value warnings by default, and recognize
+       --warnings=midrule-values to enable them.  Discussed starting at
+       <http://lists.gnu.org/archive/html/help-bison/2006-10/msg00030.html>.
+       * NEWS (2.3a+): Mention.
+       * src/getargs.c, src/getargs.h (warnings_args, warnings_types, enum
+       warnings): Add entry for midrule-values subargument.
+       * src/reader.c (symbol_should_be_used): Don't return true just because
+       the value is a set/used mid-rule value unless
+       --warnings=midrule-values was specified.
+       * tests/input.at (Unused values, Unused values before symbol
+       declarations): Run tests with and without --warnings=midrule-values.
+
+       * src/reader.c (check_and_convert_grammar): Use symbol_list_free rather
+       than LIST_FREE directly.
+
 2006-10-31  Joel E. Denny  <jdenny@ces.clemson.edu>
 
        Finish implementing --warnings=error, which should not be implied by
diff --git a/NEWS b/NEWS
index c3fe6d03773edee3183bba7eaab49a02c4c9f3ba..b1371ae7fe15f9acacbb9810fddcfba3d9d902ae 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,26 @@ Changes in version 2.3a+ (????-??-??):
 * The -g and --graph options now output graphs in Graphviz DOT format,
   not VCG format.
 
+* Revised warning: unset or unused mid-rule values
+
+  Since Bison 2.2, Bison has warned about mid-rule values that are set but not
+  used within any of the actions of the parent rule.  For example, Bison warns
+  about unused $2 in:
+
+    exp: '1' { $$ = 1; } '+' exp { $$ = $1 + $4; };
+
+  Now, Bison also warns about mid-rule values that are used but not set.  For
+  example, Bison warns about unset $$ in the mid-rule action in:
+
+    exp: '1' { $1 = 1; } '+' exp { $$ = $2 + $4; };
+
+  However, Bison now disables both of these warnings by default since they
+  sometimes prove to be false alarms in existing grammars employing the Yacc
+  constructs $0 or $-N (where N is some positive integer).
+
+  To enable these warnings, specify the flag `--warnings=midrule-values' or
+  `-W', which is a synonym for `--warnings=all'.
+
 * Bison now recognizes two separate kinds of default %destructor's and
   %printer's:
 
index c34efa2120b0ad190899f2e02a4b021c2ce26849..177255e70e67a634030d446102d5587371d78ed3 100644 (file)
@@ -203,16 +203,18 @@ static const char * const warnings_args[] =
 {
   /* In a series of synonyms, present the most meaningful first, so
      that argmatch_valid be more readable.  */
-  "none       - no warnings",
-  "yacc       - incompatibilities with POSIX YACC",
-  "all        - all of the above",
-  "error      - warnings are errors",
+  "none            - no warnings",
+  "midrule-values  - unset or unused midrule values",
+  "yacc            - incompatibilities with POSIX YACC",
+  "all             - all of the above",
+  "error           - warnings are errors",
   0
 };
 
 static const int warnings_types[] =
 {
   warnings_none,
+  warnings_midrule_values,
   warnings_yacc,
   warnings_all,
   warnings_error
index d0fa12f20dcb8279f4379b9ef885239ead92333c..a84a4857d259ec207d6bef314a136dfc2641dd61 100644 (file)
@@ -111,7 +111,8 @@ enum warnings
   {
     warnings_none             = 0,      /**< Issue no warnings.  */
     warnings_error            = 1 << 0, /**< Warnings are treated as errors.  */
-    warnings_yacc             = 1 << 1, /**< POSIXME.  */
+    warnings_midrule_values   = 1 << 1, /**< Unset or unused midrule values.  */
+    warnings_yacc             = 1 << 2, /**< POSIXME.  */
     warnings_all              = ~warnings_error /**< All above warnings.  */
   };
 /** What warnings are issued.  */
index 1066bb5b1b08b00c09981a54cc2f29a8a6b7196c..d5cd629fde13025cbb55b3114b237c8e15ad9bae 100644 (file)
@@ -243,19 +243,24 @@ grammar_current_rule_begin (symbol *lhs, location loc)
 
 
 /*----------------------------------------------------------------------.
-| A symbol should be used if it has a destructor, or if it is a         |
-| mid-rule symbol (i.e., the generated LHS replacing a mid-rule         |
-| action) that was assigned to, as in "exp: { $$ = 1; } { $$ = $1; }".  |
+| 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; }".      |
 `----------------------------------------------------------------------*/
 
 static bool
 symbol_should_be_used (symbol_list const *s)
 {
-  return (symbol_destructor_get (s->content.sym)
-         || (s->midrule && s->midrule->used)
-         || (s->midrule_parent_rule
-             && symbol_list_n_get (s->midrule_parent_rule,
-                                    s->midrule_parent_rhs_index)->used));
+  if (symbol_destructor_get (s->content.sym))
+    return true;
+  if (warnings_flag & warnings_midrule_values)
+    return ((s->midrule && s->midrule->used)
+           || (s->midrule_parent_rule
+               && symbol_list_n_get (s->midrule_parent_rule,
+                                     s->midrule_parent_rhs_index)->used));
+  return false;
 }
 
 /*----------------------------------------------------------------.
@@ -666,5 +671,5 @@ check_and_convert_grammar (void)
   packgram ();
 
   /* The grammar as a symbol_list is no longer needed. */
-  LIST_FREE (symbol_list, grammar);
+  symbol_list_free (grammar);
 }
index dec1cbe67e52eff06e79a2b7d50cb1b764a1d086..1239df00193e83588381cc52c36dd3686f2371e0 100644 (file)
@@ -80,13 +80,15 @@ m4_define([_AT_UNUSED_VALUES_DECLARATIONS],
 %destructor { destroy ($$); } INT a b c d e f g h i j k l;]]])
 
 
-# AT_CHECK_UNUSED_VALUES(DECLARATIONS_AFTER)
-# --------------------------------------------
+# AT_CHECK_UNUSED_VALUES(DECLARATIONS_AFTER, CHECK_MIDRULE_VALUES)
+# ------------------------------------------------------------------
 # Generate a grammar to test unused values,
 # compile it, run it.  If DECLARATIONS_AFTER
 # is set, then the token, type, and destructor
 # declarations are generated after the rules
-# rather than before.
+# rather than before.  If CHECK_MIDRULE_VALUES
+# is set, then --warnings=midrule-values is
+# set.
 
 m4_define([AT_CHECK_UNUSED_VALUES],
 [AT_DATA([input.y],
@@ -116,19 +118,19 @@ l: INT | INT { $<integer>$ = $<integer>1; } INT { $<integer>$ = $<integer>2 + $<
 _AT_UNUSED_VALUES_DECLARATIONS])
 )
 
-AT_CHECK([bison input.y], [0], [],
+AT_CHECK([bison]m4_ifval($2, [ --warnings=midrule-values ])[ input.y], [0], [],
 [[input.y:11.10-32: warning: unset value: $]$[
 input.y:11.10-32: warning: unused value: $]1[
 input.y:11.10-32: warning: unused value: $]3[
 input.y:11.10-32: warning: unused value: $]5[
 input.y:12.9: warning: empty rule for typed nonterminal, and no action
-input.y:13.14-19: warning: unset value: $$
+]]m4_ifval($2, [[[input.y:13.14-19: warning: unset value: $$
 input.y:13.25-39: warning: unset value: $$
-input.y:13.10-59: warning: unset value: $]$[
+]]])[[input.y:13.10-59: warning: unset value: $]$[
 input.y:13.10-59: warning: unused value: $]3[
 input.y:13.10-59: warning: unused value: $]5[
-input.y:14.14-16: warning: unset value: $$
-input.y:14.10-47: warning: unset value: $]$[
+]]m4_ifval($2, [[[input.y:14.14-16: warning: unset value: $$
+]]])[[input.y:14.10-47: warning: unset value: $]$[
 input.y:14.10-47: warning: unused value: $]3[
 input.y:14.10-47: warning: unused value: $]5[
 input.y:15.10-36: warning: unset value: $]$[
@@ -136,21 +138,21 @@ input.y:15.10-36: warning: unused value: $]3[
 input.y:15.10-36: warning: unused value: $]5[
 input.y:17.10-58: warning: unset value: $]$[
 input.y:17.10-58: warning: unused value: $]1[
-input.y:17.10-58: warning: unused value: $]2[
-input.y:17.10-58: warning: unused value: $]3[
-input.y:17.10-58: warning: unused value: $]4[
-input.y:17.10-58: warning: unused value: $]5[
+]]m4_ifval($2, [[[input.y:17.10-58: warning: unused value: $]2[
+]]])[[input.y:17.10-58: warning: unused value: $]3[
+]]m4_ifval($2, [[[input.y:17.10-58: warning: unused value: $]4[
+]]])[[input.y:17.10-58: warning: unused value: $]5[
 input.y:18.10-72: warning: unset value: $]$[
 input.y:18.10-72: warning: unused value: $]1[
 input.y:18.10-72: warning: unused value: $]3[
-input.y:18.10-72: warning: unused value: $]4[
-input.y:18.10-72: warning: unused value: $]5[
-input.y:20.10-55: warning: unused value: $]3[
-input.y:21.10-68: warning: unset value: $]$[
+]]m4_ifval($2, [[[input.y:18.10-72: warning: unused value: $]4[
+]]])[[input.y:18.10-72: warning: unused value: $]5[
+]]m4_ifval($2, [[[input.y:20.10-55: warning: unused value: $]3[
+]]])[[input.y:21.10-68: warning: unset value: $]$[
 input.y:21.10-68: warning: unused value: $]1[
 input.y:21.10-68: warning: unused value: $]2[
-input.y:21.10-68: warning: unused value: $]4[
-]])])
+]]m4_ifval($2, [[[input.y:21.10-68: warning: unused value: $]4[
+]]]))])
 
 
 ## --------------- ##
@@ -159,6 +161,7 @@ input.y:21.10-68: warning: unused value: $]4[
 
 AT_SETUP([Unused values])
 AT_CHECK_UNUSED_VALUES
+AT_CHECK_UNUSED_VALUES(, [1])
 AT_CLEANUP
 
 
@@ -168,6 +171,7 @@ AT_CLEANUP
 
 AT_SETUP([Unused values before symbol declarations])
 AT_CHECK_UNUSED_VALUES([1])
+AT_CHECK_UNUSED_VALUES([1], [1])
 AT_CLEANUP