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-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
/* 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.
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;
`------------------*/
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, ", ");
}
`--------------------*/
unsigned int
-symbol_list_length (symbol_list *l)
+symbol_list_length (const symbol_list *l)
{
int res = 0;
for (/* Nothing. */; l; l = l->next)
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,
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);
# 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
};
%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
}
]])
-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
# 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
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. ##
## ---------------------- ##