From: Akim Demaille Date: Sat, 29 Dec 2001 14:24:51 +0000 (+0000) Subject: Mid-rule actions are simply... ignored! X-Git-Tag: before-m4-back-end~54 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/82c035a8238ea0f6a7cdb8d937ba97534ab620dd Mid-rule actions are simply... ignored! * src/reader.c (readgram): Be sure to attach mid-rule actions to the empty-rule associated to the dummy symbol, not to the host rule. * tests/actions.at (Mid-rule actions): New. --- diff --git a/ChangeLog b/ChangeLog index 37faad28..8c45edea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2001-12-29 Akim Demaille + + Mid-rule actions are simply... ignored! + + * src/reader.c (readgram): Be sure to attach mid-rule actions to + the empty-rule associated to the dummy symbol, not to the host + rule. + * tests/actions.at (Mid-rule actions): New. + + 2001-12-29 Akim Demaille Memory leak. diff --git a/src/reader.c b/src/reader.c index 93bbe827..d5d04b22 100644 --- a/src/reader.c +++ b/src/reader.c @@ -1357,6 +1357,11 @@ readgram (void) p = symbol_list_new (sdummy); /* Attach its lineno to that of the host rule. */ p->line = crule->line; + /* Move the action from the host rule to this one. */ + p->action = crule->action; + p->action_line = crule->action_line; + crule->action = NULL; + if (crule1) crule1->next = p; else diff --git a/tests/Makefile.am b/tests/Makefile.am index 1b44a445..c20501cf 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -25,7 +25,8 @@ MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE) TESTSUITE_AT = \ testsuite.at \ - output.at sets.at reduce.at calc.at torture.at regression.at \ + output.at sets.at reduce.at actions.at calc.at \ + torture.at regression.at \ semantic.at TESTSUITE = $(srcdir)/testsuite diff --git a/tests/actions.at b/tests/actions.at new file mode 100644 index 00000000..78531fcd --- /dev/null +++ b/tests/actions.at @@ -0,0 +1,87 @@ +# Executing Actions. -*- Autotest -*- +# Copyright 2001 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 +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[User Actions.]]) + +## ------------------ ## +## Mid-rule actions. ## +## ------------------ ## + +AT_SETUP([Mid-rule actions]) + +# Bison once forgot the mid-rule actions. It was because the action +# was attached to the host rule (the one with the mid-rule action), +# instead of being attached to the empty rule dedicated to this +# action. + +AT_DATA([[input.y]], +[[%{ +#include +#include +static void yyerror (const char *msg); +static int yylex (void); +%} +%% +exp: { printf ("0\n"); } + '1' { printf ("1\n"); } + '2' { printf ("2\n"); } + '3' { printf ("3\n"); } + '4' { printf ("4\n"); } + '5' { printf ("5\n"); } + '6' { printf ("6\n"); } + '7' { printf ("7\n"); } + '8' { printf ("8\n"); } + '9' { printf ("9\n"); } + ; +%% +static int +yylex (void) +{ + static const char *input = "123456789"; + return *input++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +main (void) +{ + return yyparse (); +} +]]) + +AT_CHECK([bison input.y -d -v -o input.c]) +AT_CHECK([$CC $CFLAGS $CPPFLAGS input.c -o input], 0, [], [ignore]) +AT_CHECK([input], 0, +[[0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +]]) + +AT_CLEANUP diff --git a/tests/calc.at b/tests/calc.at index d12fffc9..90241b35 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -351,17 +351,6 @@ AT_DATA_CALC_Y([$1]) AT_CHECK([bison calc.y -o calc.c m4_bpatsubst([$1], [--yyerror-verbose])], [0], [], []) -# Some compilers issue warnings we don't want to hear about. -# Maybe some day we will have proper Autoconf macros to disable these -# warnings, but this place is not the right one for that. -# So let's keep only GCC warnings, which we know are sane. -# Well, that's only part of the story: some assemblers issue warnings -# which can be totally useless, and actually polluting. It seems that -# the best bet be to completely ignore stderr, but to pass -Werror -# to GCC. -if test "$GCC" = yes; then - CFLAGS="$CFLAGS -Werror" -fi AT_CHECK([$CC $CFLAGS $CPPFLAGS calc.c -o calc], 0, [], [ignore]) # Test the priorities. diff --git a/tests/testsuite.at b/tests/testsuite.at index 4eb833f5..7005519f 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -28,6 +28,7 @@ AT_TESTED([bison]) m4_include([output.at]) m4_include([sets.at]) m4_include([reduce.at]) +m4_include([actions.at]) m4_include([calc.at]) m4_include([torture.at]) m4_include([regression.at])