From 378f4bd846c4312ddeb11f151382226e30050d3c Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 4 Jan 2006 08:32:46 +0000 Subject: [PATCH] * 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. --- ChangeLog | 7 +++++++ src/reader.c | 6 +++++- src/symlist.c | 5 +++-- src/symlist.h | 4 ++-- tests/actions.at | 6 +++--- tests/input.at | 53 +++++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 72 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index a9d8a7ae..a7553e32 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-01-04 Akim Demaille + + * 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 * doc/bison.texinfo (Bison Options): Say more accurately what diff --git a/src/reader.c b/src/reader.c index 0e0a8c21..c0547e08 100644 --- a/src/reader.c +++ b/src/reader.c @@ -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; diff --git a/src/symlist.c b/src/symlist.c index ed42ce1e..a277f36e 100644 --- a/src/symlist.c +++ b/src/symlist.c @@ -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) diff --git a/src/symlist.h b/src/symlist.h index ccd6110b..480c97d4 100644 --- a/src/symlist.h +++ b/src/symlist.h @@ -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); diff --git a/tests/actions.at b/tests/actions.at index bd71bbc8..35df2319 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -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 a_1 a_2 a_5 - exp sum_of_the_five_previous_values + sum_of_the_five_previous_values %% exp: a_1 a_2 { $$ = 3; } { $$ = $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 diff --git a/tests/input.at b/tests/input.at index 99946e9d..f533ef3a 100644 --- a/tests/input.at +++ b/tests/input.at @@ -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 INT +%type 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. ## ## ---------------------- ## -- 2.45.2