* 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.
This commit is contained in:
Akim Demaille
2006-01-04 08:32:46 +00:00
parent f52b276c55
commit 378f4bd846
6 changed files with 72 additions and 9 deletions

View File

@@ -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

View 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;

View 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)

View 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);

View 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

View 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. ##
## ---------------------- ##