From: Akim Demaille Date: Thu, 7 Feb 2002 17:13:46 +0000 (+0000) Subject: * tests/input.at: New. X-Git-Tag: BISON-1_33~3 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/7307a21a456b75485f0cffd8bdb3532fe247661e * tests/input.at: New. --- diff --git a/ChangeLog b/ChangeLog index a6b49521..a51dfb28 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2002-02-07 Akim Demaille + + * tests/input.at: New. + 2002-01-29 Paul Eggert * src/bison.simple (YYSIZE_T): Do not define merely because diff --git a/src/reader.c b/src/reader.c index 33f8e130..529cebe9 100644 --- a/src/reader.c +++ b/src/reader.c @@ -304,13 +304,15 @@ copy_comment (FILE *fin, struct obstack *oout) /*-----------------------------------------------------------------. | FIN is pointing to a location (i.e., a `@'). Output to OOUT a | | reference to this location. STACK_OFFSET is the number of values | -| in the current rule so far, which says where to find `$0' with | +| in the current rule so far, which says where to find `@0' with | | respect to the top of the stack. | `-----------------------------------------------------------------*/ static inline void -copy_at (FILE *fin, struct obstack *oout, int stack_offset) +copy_at (FILE *fin, struct obstack *oout, + struct symbol_list *rule, int stack_offset) { + symbol_list *rp; int c; c = getc (fin); @@ -321,11 +323,25 @@ copy_at (FILE *fin, struct obstack *oout, int stack_offset) } else if (isdigit (c) || c == '-') { - int n; + int n, i; ungetc (c, fin); n = read_signed_integer (fin); + rp = rule; + i = 0; + + while (i < n) + { + rp = rp->next; + if (rp == NULL) + { + complain (_("invalid @ value")); + return; + } + i++; + } + obstack_fgrow1 (oout, "yylsp[%d]", n - stack_offset); locations_flag = 1; } @@ -1103,7 +1119,7 @@ copy_action (symbol_list *rule, int stack_offset) case '@': copy_at (finput, &action_obstack, - stack_offset); + rule, stack_offset); break; case EOF: @@ -1203,7 +1219,7 @@ copy_guard (symbol_list *rule, int stack_offset) break; case '@': - copy_at (finput, &guard_obstack, stack_offset); + copy_at (finput, &guard_obstack, rule, stack_offset); break; case EOF: diff --git a/tests/Makefile.am b/tests/Makefile.am index 3fff5ea8..6c6f455d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -45,7 +45,7 @@ EXTRA_DIST += package.m4 TESTSUITE_AT = \ testsuite.at \ - output.at sets.at reduce.at calc.at torture.at regression.at + input.at output.at sets.at reduce.at calc.at torture.at regression.at TESTSUITE = $(srcdir)/testsuite AUTOTEST = $(AUTOM4TE) --language=autotest diff --git a/tests/Makefile.in b/tests/Makefile.in index ee996a28..34dc0457 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -110,7 +110,7 @@ MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE) TESTSUITE_AT = \ testsuite.at \ - output.at sets.at reduce.at calc.at torture.at regression.at + input.at output.at sets.at reduce.at calc.at torture.at regression.at TESTSUITE = $(srcdir)/testsuite diff --git a/tests/input.at b/tests/input.at new file mode 100644 index 00000000..117af986 --- /dev/null +++ b/tests/input.at @@ -0,0 +1,58 @@ +# Checking the output filenames. -*- Autotest -*- +# Copyright 2002 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([[Input Processing.]]) + +# Mostly test that we are robust to mistakes. + +## ------------ ## +## Invalid $n. ## +## ------------ ## + + +AT_SETUP([Invalid $n]) + +AT_DATA([input.y], +[[%% +exp: { $$ = $1 ; } +]]) + +AT_CHECK([bison input.y], [1], [], +[[input.y:2: invalid $ value +]]) + +AT_CLEANUP + + +## ------------ ## +## Invalid @n. ## +## ------------ ## + + +AT_SETUP([Invalid @n]) + +AT_DATA([input.y], +[[%% +exp: { @$ = @1 ; } +]]) + +AT_CHECK([bison input.y], [1], [], +[[input.y:2: invalid @ value +]]) + +AT_CLEANUP diff --git a/tests/testsuite.at b/tests/testsuite.at index be0d08d4..f205d1aa 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -25,6 +25,7 @@ AT_INIT AT_TESTED([bison]) +m4_include([input.at]) m4_include([output.at]) m4_include([sets.at]) m4_include([reduce.at])