]> git.saurik.com Git - bison.git/commitdiff
Warn about unset midrule $$ if the corresponding $n is used.
authorJoel E. Denny <jdenny@ces.clemson.edu>
Sat, 21 Oct 2006 02:31:50 +0000 (02:31 +0000)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Sat, 21 Oct 2006 02:31:50 +0000 (02:31 +0000)
* src/reader.c (symbol_should_be_used): Check midrule parent rule for
$n usage.
(packgram): Before invoking grammar_rule_check on any rule, make sure
all actions have already been scanned in order to set `used' flags.
Otherwise, checking that a midrule's $$ is set will not always work
properly because the midrule check must forward-reference the midrule's
parent rule.
* tests/input.at (AT_CHECK_UNUSED_VALUES): Extend to check the new
warning.

ChangeLog
src/reader.c
tests/input.at

index a8912a45413b80b4e889196bf0e3f34637a8f993..0b026dfeef623b52c49b3743203408d6e08017bc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2006-10-20  Joel E. Denny  <jdenny@ces.clemson.edu>
+
+       Warn about unset midrule $$ if the corresponding $n is used.
+       * src/reader.c (symbol_should_be_used): Check midrule parent rule for
+       $n usage.
+       (packgram): Before invoking grammar_rule_check on any rule, make sure
+       all actions have already been scanned in order to set `used' flags.
+       Otherwise, checking that a midrule's $$ is set will not always work
+       properly because the midrule check must forward-reference the midrule's
+       parent rule.
+       * tests/input.at (AT_CHECK_UNUSED_VALUES): Extend to check the new
+       warning.
+
 2006-10-20  Joel E. Denny  <jdenny@ces.clemson.edu>
 
        More improvements to the documentation of the prologue alternatives:
index d0e9ea2c006f31967b425fc9568929ad52057144..604c03b10eae59ffc0d9d28f64eab05c198edb8b 100644 (file)
@@ -252,7 +252,10 @@ static bool
 symbol_should_be_used (symbol_list const *s)
 {
   return (symbol_destructor_get (s->content.sym)
-         || (s->midrule && s->midrule->used));
+         || (s->midrule && s->midrule->used)
+         || (s->midrule_parent_rule
+             && symbol_list_n_get (s->midrule_parent_rule,
+                                    s->midrule_parent_rhs_index)->used));
 }
 
 /*----------------------------------------------------------------.
@@ -456,6 +459,20 @@ packgram (void)
 
   rules = xnmalloc (nrules, sizeof *rules);
 
+  /* Before invoking grammar_rule_check on any rule, make sure
+     all actions have already been scanned in order to set `used' flags.
+     Otherwise, checking that a midrule's $$ is set will not always work
+     properly because the midrule check must forward-reference the midrule's
+     parent rule.  */
+  while (p)
+    {
+      if (p->action)
+        p->action = translate_rule_action (p);
+      if (p)
+       p = p->next;
+    }
+
+  p = grammar;
   while (p)
     {
       int rule_length = 0;
@@ -472,14 +489,9 @@ packgram (void)
       rules[ruleno].precsym = NULL;
       rules[ruleno].location = p->location;
       rules[ruleno].useful = true;
-      rules[ruleno].action = p->action ? translate_rule_action (p) : NULL;
+      rules[ruleno].action = p->action;
       rules[ruleno].action_location = p->action_location;
 
-      /* If this rule contains midrules, rest assured that
-        grammar_midrule_action inserted the midrules into grammar before this
-        rule.  Thus, the midrule actions have already been scanned in order to
-        set `used' flags for this rule's rhs, so grammar_rule_check will work
-        properly.  */
       /* Don't check the generated rule 0.  It has no action, so some rhs
         symbols may appear unused, but the parsing algorithm ensures that
         %destructor's are invoked appropriately.  */
index dedd65636641113ed81ca9f41780c07767976155..adc38d72ee232c0d0bbb0750a3506cf1a8a8be7b 100644 (file)
@@ -103,8 +103,8 @@ start:
 
 a: INT | INT { } INT { } INT { };
 b: INT | /* empty */;
-c: INT | INT { $]1[ } INT { } INT { };
-d: INT | INT { } INT { $]1[ } INT { };
+c: INT | INT { $]1[ } INT { $<integer>2 } INT { $<integer>4 };
+d: INT | INT { } INT { $]1[ } INT { $<integer>2 };
 e: INT | INT { } INT {  } INT { $]1[ };
 f: INT | INT { } INT {  } INT { $]$[ = $]1[ + $]3[ + $]5[; };
 g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
@@ -122,12 +122,15 @@ 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.10-35: warning: unset value: $]$[
-input.y:13.10-35: warning: unused value: $]3[
-input.y:13.10-35: warning: unused value: $]5[
-input.y:14.10-35: warning: unset value: $]$[
-input.y:14.10-35: warning: unused value: $]3[
-input.y:14.10-35: warning: unused value: $]5[
+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: 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: $]$[
+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: $]$[
 input.y:15.10-36: warning: unused value: $]3[
 input.y:15.10-36: warning: unused value: $]5[