]> git.saurik.com Git - bison.git/commitdiff
* src/reader.c (grammar_midrule_action): If $$ is set in a
authorAkim Demaille <akim@epita.fr>
Wed, 4 Jan 2006 08:32:46 +0000 (08:32 +0000)
committerAkim Demaille <akim@epita.fr>
Wed, 4 Jan 2006 08:32:46 +0000 (08:32 +0000)
mid-rule, move the `used' bit to its lhs.
* tests/input.at (Unused values): New.
* tests/actions.at (Exotic Dollars): Adjust: exp is not typed.

ChangeLog
src/reader.c
src/symlist.c
src/symlist.h
tests/actions.at
tests/input.at

index a9d8a7aef384444bc6563748f9d51650fc816fab..a7553e326c714bcdc95d37bc81fa08f0e9fd80be 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-01-04  Akim Demaille  <akim@epita.fr>
+
+       * src/reader.c (grammar_midrule_action): If $$ is set in a
+       mid-rule, move the `used' bit to its lhs.
+       * tests/input.at (Unused values): New.
+       * tests/actions.at (Exotic Dollars): Adjust: exp is not typed.
+
 2006-01-03  Paul Eggert  <eggert@cs.ucla.edu>
 
        * doc/bison.texinfo (Bison Options): Say more accurately what
index 0e0a8c21bebecb0588e8b20fdd628f00f0ea7452..c0547e08c8c4bd09dc5108630e57b00ca05d5d69 100644 (file)
@@ -1,7 +1,7 @@
 /* Input parser for Bison
 
    Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003,
-   2005 Free Software Foundation, Inc.
+   2005, 2006 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -307,6 +307,10 @@ grammar_midrule_action (void)
   midrule->action = current_rule->action;
   midrule->action_location = dummy_location;
   current_rule->action = NULL;
+  /* If $$ was used in the action, the LHS of the enclosing rule was
+     incorrectly flagged as used.  */
+  midrule->used = current_rule->used;
+  current_rule->used = false;
 
   if (previous_rule_end)
     previous_rule_end->next = midrule;
index ed42ce1e7747994b05ed569cf41c5289cff3aba0..a277f36e4437c132718b21690dd244ebc672cc3e 100644 (file)
@@ -56,11 +56,12 @@ symbol_list_new (symbol *sym, location loc)
 `------------------*/
 
 void
-symbol_list_print (symbol_list *l, FILE *f)
+symbol_list_print (const symbol_list *l, FILE *f)
 {
   for (/* Nothing. */; l && l->sym; l = l->next)
     {
       symbol_print (l->sym, f);
+      fprintf (stderr, l->used ? " used" : " unused");
       if (l && l->sym)
        fprintf (f, ", ");
     }
@@ -96,7 +97,7 @@ symbol_list_free (symbol_list *list)
 `--------------------*/
 
 unsigned int
-symbol_list_length (symbol_list *l)
+symbol_list_length (const symbol_list *l)
 {
   int res = 0;
   for (/* Nothing. */; l; l = l->next)
index ccd6110b8f0d2efec772e60f6bb5e0151cc21248..480c97d444f1c28f989df475b6f647724cd908bb 100644 (file)
@@ -53,7 +53,7 @@ typedef struct symbol_list
 symbol_list *symbol_list_new (symbol *sym, location loc);
 
 /* Print it.  */
-void symbol_list_print (symbol_list *l, FILE *f);
+void symbol_list_print (const symbol_list *l, FILE *f);
 
 /* Prepend SYM at LOC to the LIST.  */
 symbol_list *symbol_list_prepend (symbol_list *l,
@@ -64,7 +64,7 @@ symbol_list *symbol_list_prepend (symbol_list *l,
 void symbol_list_free (symbol_list *l);
 
 /* Return its length. */
-unsigned int symbol_list_length (symbol_list *l);
+unsigned int symbol_list_length (const symbol_list *l);
 
 /* Get symbol N in symbol list L.  */
 symbol_list *symbol_list_n_get (symbol_list *l, int n);
index bd71bbc8c4af602f86fa5484fc45431eb9fbd6f4..35df23199abdbd086119f0418f06f4dab16f7554 100644 (file)
@@ -1,5 +1,5 @@
 # Executing Actions.                               -*- Autotest -*-
-# Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -107,7 +107,7 @@ AT_DATA_GRAMMAR([[input.y]],
 };
 
 %type <val> a_1 a_2 a_5
-            exp sum_of_the_five_previous_values
+            sum_of_the_five_previous_values
 
 %%
 exp: a_1 a_2 { $<val>$ = 3; } { $<val>$ = $<val>3 + 1; } a_5
@@ -146,7 +146,7 @@ main (void)
 }
 ]])
 
-AT_CHECK([bison -d -v -o input.c input.y], 0, [], 
+AT_CHECK([bison -d -v -o input.c input.y], 0, [],
 [input.y:30.6-34.5: warning: unused value: $1
 input.y:30.6-34.5: warning: unused value: $2
 input.y:30.6-34.5: warning: unused value: $5
index 99946e9da1e60c57c6c5b4904ae00c40a8f0185f..f533ef3a49dd0dd0fcd720a0d3989f2934af4617 100644 (file)
@@ -1,5 +1,5 @@
 # Checking the Bison scanner.                    -*- Autotest -*-
-# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -82,6 +82,57 @@ input.y:6.5: warning: empty rule for typed nonterminal, and no action
 AT_CLEANUP
 
 
+## --------------- ##
+## Unused values.  ##
+## --------------- ##
+
+AT_SETUP([Unused values])
+
+AT_DATA([input.y],
+[[%token <integer> INT
+%type <integer> exp
+%%
+exp:
+  INT { } INT { } INT { }
+/* Ideally we would like to complain also about $2 and $4 here, but
+   it's hard to implement.  */
+| INT { $$ } INT { $$ } INT { }
+| INT { $1 } INT { } INT { }
+| INT { } INT { $1 } INT { }
+| INT { } INT {  } INT { $1 }
+| INT { } INT {  } INT { $$ = $1 + $3 + $5; }
+;
+]])
+
+AT_CHECK([bison input.y], [], [],
+[[input.y:5.3-25: warning: unset value: $$
+input.y:5.3-25: warning: unused value: $1
+input.y:5.3-25: warning: unused value: $3
+input.y:5.3-25: warning: unused value: $5
+input.y:8.3-31: warning: unset value: $$
+input.y:8.3-31: warning: unused value: $1
+input.y:8.3-31: warning: unused value: $3
+input.y:8.3-31: warning: unused value: $5
+input.y:9.3-28: warning: unset value: $$
+input.y:9.3-28: warning: unused value: $3
+input.y:9.3-28: warning: unused value: $5
+input.y:10.3-28: warning: unset value: $$
+input.y:10.3-28: warning: unused value: $3
+input.y:10.3-28: warning: unused value: $5
+input.y:11.3-29: warning: unset value: $$
+input.y:11.3-29: warning: unused value: $3
+input.y:11.3-29: warning: unused value: $5
+input.y: conflicts: 1 reduce/reduce
+input.y:8.7-12: warning: rule never reduced because of conflicts: @3: /* empty */
+input.y:9.7-12: warning: rule never reduced because of conflicts: @5: /* empty */
+input.y:10.7-9: warning: rule never reduced because of conflicts: @7: /* empty */
+input.y:11.7-9: warning: rule never reduced because of conflicts: @9: /* empty */
+input.y:12.7-9: warning: rule never reduced because of conflicts: @11: /* empty */
+]])
+
+AT_CLEANUP
+
+
 ## ---------------------- ##
 ## Incompatible Aliases.  ##
 ## ---------------------- ##