mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
See http://www.gnu.org/prep/maintain/maintain.html#Copyright-Notices * HACKING, Makefile.am, NEWS, PACKAGING, README, README-alpha: * TODO, bootstrap, bootstrap.conf: * build-aux/update-b4-copyright, cfg.mk, configure.ac: * data/README, data/bison.m4, data/c++-skel.m4, data/c++.m4: * data/c-skel.m4, data/c.m4, data/glr.c, data/glr.cc: * data/java-skel.m4, data/java.m4, data/lalr1.cc: * data/lalr1.java, data/location.cc: * data/xslt/bison.xsl: * data/xslt/xml2dot.xsl, data/xslt/xml2text.xsl: * data/xslt/xml2xhtml.xsl, data/yacc.c, djgpp/Makefile.maint: * djgpp/README.in, djgpp/config.bat, djgpp/config.sed: * djgpp/config.site, djgpp/config_h.sed, djgpp/djunpack.bat: * djgpp/subpipe.c, djgpp/subpipe.h: * djgpp/testsuite.sed, doc/bison.texinfo: * doc/refcard.tex, etc/README, etc/bench.pl.in: * examples/calc++/Makefile.am, examples/extexi: * lib/abitset.c, lib/abitset.h: * lib/bbitset.h, lib/bitset.c, lib/bitset.h: * lib/bitset_stats.c, lib/bitset_stats.h, lib/bitsetv-print.c: * lib/bitsetv-print.h, lib/bitsetv.c, lib/bitsetv.h: * lib/ebitset.c, lib/ebitset.h, lib/get-errno.c: * lib/get-errno.h, lib/lbitset.c, lib/lbitset.h: * lib/libiberty.h, lib/main.c, lib/timevar.c: * lib/timevar.def, lib/timevar.h, lib/vbitset.c: * lib/vbitset.h, lib/yyerror.c, m4/bison-i18n.m4: * m4/c-working.m4, m4/cxx.m4, m4/subpipe.m4, m4/timevar.m4: * src/AnnotationList.c, src/AnnotationList.h: * src/InadequacyList.c, src/InadequacyList.h, src/LR0.c: * src/LR0.h, src/Sbitset.c, src/Sbitset.h, src/assoc.c: * src/assoc.h, src/closure.c, src/closure.h, src/complain.c: * src/complain.h, src/conflicts.c, src/conflicts.h: * src/derives.c, src/derives.h, src/files.c, src/files.h: * src/flex-scanner.h, src/getargs.c, src/getargs.h: * src/gram.c, src/gram.h, src/graphviz.c, src/ielr.c: * src/ielr.h, src/lalr.c, src/lalr.h: * src/location.c, src/location.h, src/main.c: * src/muscle-tab.c, src/muscle-tab.h, src/named-ref.c: * src/named-ref.h, src/nullable.c, src/nullable.h: * src/output.c, src/output.h, src/parse-gram.y: * src/print-xml.c, src/print-xml.h, src/print.c, src/print.h: * src/print_graph.c, src/print_graph.h, src/reader.c: * src/reader.h, src/reduce.c, src/reduce.h, src/relation.c: * src/relation.h, src/scan-code.h, src/scan-code.l: * src/scan-gram.h, src/scan-gram.l, src/scan-skel.h: * src/scan-skel.l, src/state.c, src/state.h, src/symlist.c: * src/symlist.h, src/symtab.c, src/symtab.h, src/system.h: * src/tables.c, src/tables.h, src/uniqstr.c, src/uniqstr.h: * tests/actions.at, tests/atlocal.in, tests/c++.at: * tests/calc.at, tests/conflicts.at, tests/cxx-type.at: * tests/existing.at, tests/glr-regression.at: * tests/headers.at, tests/input.at, tests/java.at: * tests/local.at, tests/named-refs.at: * tests/output.at, tests/push.at, tests/reduce.at: * tests/regression.at, tests/sets.at, tests/skeletons.at: * tests/synclines.at, tests/testsuite.at, tests/torture.at: * data/Makefile.am, data/location.cc, doc/Makefile.am, src/Makefile.am: * tests/Makefile.am, lib/Makefile.am, examples/Makefile.am: * etc/Makefile.am: Don't use date ranges in copyright notices. Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
334 lines
7.5 KiB
Plaintext
334 lines
7.5 KiB
Plaintext
# Checking skeleton support. -*- Autotest -*-
|
|
|
|
# Copyright (C) 2007, 2009, 2010 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
AT_BANNER([[Skeleton Support.]])
|
|
|
|
## ------------------------------ ##
|
|
## Relative skeleton file names. ##
|
|
## ------------------------------ ##
|
|
|
|
AT_SETUP([[Relative skeleton file names]])
|
|
|
|
AT_CHECK([[mkdir tmp]])
|
|
|
|
AT_DATA([[tmp/skel.c]],
|
|
[[m4@&t@_divert_push(0)d@&t@nl
|
|
@output(b4_parser_file_name@)d@&t@nl
|
|
b4_percent_define_get([[test]])
|
|
m4@&t@_divert_pop(0)
|
|
]])
|
|
|
|
AT_DATA([[skel.c]],
|
|
[[m4@&t@_divert_push(0)d@&t@nl
|
|
@output(b4_parser_file_name@)d@&t@nl
|
|
b4_percent_define_get([[test]]) -- Local
|
|
m4@&t@_divert_pop(0)
|
|
]])
|
|
|
|
AT_DATA([[tmp/input-gram.y]],
|
|
[[%skeleton "./skel.c"
|
|
%define test "Hello World"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_DATA([[input-gram.y]],
|
|
[[%skeleton "./skel.c"
|
|
%define test "Hello World"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_DATA([[tmp/input-cmd-line.y]],
|
|
[[%define test "Hello World"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[tmp/input-gram.y]])
|
|
AT_CHECK([[cat input-gram.tab.c]], [[0]],
|
|
[[Hello World
|
|
]])
|
|
|
|
AT_BISON_CHECK([[input-gram.y]])
|
|
AT_CHECK([[cat input-gram.tab.c]], [[0]],
|
|
[[Hello World -- Local
|
|
]])
|
|
|
|
AT_BISON_CHECK([[--skeleton=tmp/skel.c tmp/input-cmd-line.y]])
|
|
AT_CHECK([[cat input-cmd-line.tab.c]], [[0]],
|
|
[[Hello World
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
## ------------------------------- ##
|
|
## Installed skeleton file names. ##
|
|
## ------------------------------- ##
|
|
|
|
AT_SETUP([[Installed skeleton file names]])
|
|
|
|
m4_pushdef([AT_GRAM],
|
|
[[%{
|
|
#include <stdio.h>
|
|
void yyerror (char const *msg);
|
|
int yylex (void);
|
|
%}
|
|
|
|
%error-verbose
|
|
%token 'a'
|
|
|
|
%%
|
|
|
|
start: ;
|
|
|
|
%%
|
|
|
|
void
|
|
yyerror (char const *msg)
|
|
{
|
|
fprintf (stderr, "%s\n", msg);
|
|
}
|
|
|
|
int
|
|
yylex (void)
|
|
{
|
|
return 'a';
|
|
}
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
return yyparse ();
|
|
}
|
|
]])
|
|
|
|
AT_DATA([[input-cmd-line.y]],
|
|
[AT_GRAM])
|
|
|
|
AT_DATA([[input-gram.y]],
|
|
[[%skeleton "yacc.c"]
|
|
AT_GRAM])
|
|
|
|
AT_BISON_CHECK([[--skeleton=yacc.c -o input-cmd-line.c input-cmd-line.y]])
|
|
AT_COMPILE([[input-cmd-line]])
|
|
AT_PARSER_CHECK([[./input-cmd-line]], [[1]], [],
|
|
[[syntax error, unexpected 'a', expecting $end
|
|
]])
|
|
|
|
AT_BISON_CHECK([[-o input-gram.c input-gram.y]])
|
|
AT_COMPILE([[input-gram]])
|
|
AT_PARSER_CHECK([[./input-gram]], [[1]], [],
|
|
[[syntax error, unexpected 'a', expecting $end
|
|
]])
|
|
|
|
m4_popdef([AT_GRAM])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
## ------------------------------------------------------ ##
|
|
## %define Boolean variables: invalid skeleton defaults. ##
|
|
## ------------------------------------------------------ ##
|
|
|
|
AT_SETUP([[%define Boolean variables: invalid skeleton defaults]])
|
|
|
|
AT_DATA([[skel.c]],
|
|
[[b4_percent_define_default([[foo]], [[bogus value]])
|
|
b4_percent_define_flag_if([[foo]])
|
|
]])
|
|
|
|
AT_DATA([[input.y]],
|
|
[[%skeleton "./skel.c"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[input.y]], [[1]], [[]],
|
|
[[<skeleton default value>: invalid value for %define Boolean variable `foo'
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
## --------------------------------------------- ##
|
|
## Complaining during macro argument expansion. ##
|
|
## --------------------------------------------- ##
|
|
|
|
AT_SETUP([[Complaining during macro argument expansion]])
|
|
|
|
AT_DATA([[skel1.c]],
|
|
[[m4@&t@_define([foow], [b4_warn([[foow fubar]])])
|
|
m4@&t@_define([foowat], [b4_warn_at([[foow.y:2.3]],
|
|
[[foow.y:5.4]], [[foowat fubar]])])
|
|
m4@&t@_define([fooc], [b4_complain([[fooc fubar]])])
|
|
m4@&t@_define([foocat], [b4_complain_at([[fooc.y:1.1]],
|
|
[[fooc.y:10.6]], [[foocat fubar]])])
|
|
m4@&t@_define([foof], [b4_fatal([[foof fubar]])])
|
|
m4@&t@_if(foow, [1], [yes])
|
|
m4@&t@_if(foowat, [1], [yes])
|
|
m4@&t@_if(fooc, [1], [yes])
|
|
m4@&t@_if(foocat, [1], [yes])
|
|
m4@&t@_if(foof, [1], [yes])
|
|
]])
|
|
|
|
AT_DATA([[input1.y]],
|
|
[[%skeleton "./skel1.c"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[input1.y]], [[1]], [[]],
|
|
[[input1.y: warning: foow fubar
|
|
foow.y:2.3-5.3: warning: foowat fubar
|
|
input1.y: fooc fubar
|
|
fooc.y:1.1-10.5: foocat fubar
|
|
input1.y: fatal error: foof fubar
|
|
]])
|
|
|
|
AT_DATA([[skel2.c]],
|
|
[[m4@&t@_define([foofat], [b4_fatal_at([[foof.y:12.11]],
|
|
[[foof.y:100.123]], [[foofat fubar]])])
|
|
m4@&t@_if(foofat, [1], [yes])
|
|
]])
|
|
|
|
AT_DATA([[input2.y]],
|
|
[[%skeleton "./skel2.c"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[input2.y]], [[1]], [[]],
|
|
[[foof.y:12.11-100.122: fatal error: foofat fubar
|
|
]])
|
|
|
|
AT_DATA([[skel3.c]],
|
|
[[b4_complain_at(b4_percent_define_get_loc([[bogus]]), [[bad value]])
|
|
]])
|
|
|
|
AT_DATA([[input3.y]],
|
|
[[%skeleton "./skel3.c"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[input3.y]], [[1]], [[]],
|
|
[[input3.y: fatal error: undefined %define variable `bogus' passed to b4_percent_define_get_loc
|
|
]])
|
|
|
|
AT_DATA([[skel4.c]],
|
|
[[b4_warn_at(b4_percent_define_get_syncline([[bogus]]), [[bad value]])
|
|
]])
|
|
|
|
AT_DATA([[input4.y]],
|
|
[[%skeleton "./skel4.c"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[input4.y]], [[1]], [[]],
|
|
[[input4.y: fatal error: undefined %define variable `bogus' passed to b4_percent_define_get_syncline
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
## --------------------------------------- ##
|
|
## Fatal errors make M4 exit immediately. ##
|
|
## --------------------------------------- ##
|
|
|
|
AT_SETUP([[Fatal errors make M4 exit immediately]])
|
|
|
|
AT_DATA([[skel1.c]],
|
|
[[b4_complain([[non-fatal error]])
|
|
b4_fatal([[M4 should exit immediately here]])
|
|
m4@&t@_fatal([this should never be evaluated])
|
|
]])
|
|
|
|
AT_DATA([[input1.y]],
|
|
[[%skeleton "./skel1.c"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[input1.y]], [[1]], [[]],
|
|
[[input1.y: non-fatal error
|
|
input1.y: fatal error: M4 should exit immediately here
|
|
]])
|
|
|
|
AT_DATA([[skel2.c]],
|
|
[[b4_warn([[morning]])
|
|
b4_fatal_at([[foo.y:1.5]], [[foo.y:1.7]], [[M4 should exit immediately here]])
|
|
m4@&t@_fatal([this should never be evaluated])
|
|
]])
|
|
|
|
AT_DATA([[input2.y]],
|
|
[[%skeleton "./skel2.c"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[input2.y]], [[1]], [[]],
|
|
[[input2.y: warning: morning
|
|
foo.y:1.5-6: fatal error: M4 should exit immediately here
|
|
]])
|
|
|
|
AT_CLEANUP
|
|
|
|
|
|
## ------------------------------------------------ ##
|
|
## Fatal errors but M4 continues producing output. ##
|
|
## ------------------------------------------------ ##
|
|
|
|
# At one time, if Bison encountered a fatal error during M4 processing,
|
|
# Bison failed to drain M4's output pipe. The result was a SIGPIPE.
|
|
# On some platforms, the default disposition for SIGPIPE is terminate,
|
|
# which was fine. On others, it's ignore, which caused M4 to report
|
|
# the broken pipe to the user, but we don't want to bother the user with
|
|
# that.
|
|
|
|
# There is a race condition somewhere. That is, before the associated
|
|
# fix, running this test group many times in a row would occasionally
|
|
# produce a pass among all the failures.
|
|
|
|
AT_SETUP([[Fatal errors but M4 continues producing output]])
|
|
|
|
AT_DATA([[gen-skel.pl]],
|
|
[[use warnings;
|
|
use strict;
|
|
my $M4 = "m4";
|
|
my $DNL = "d"."nl";
|
|
print "${M4}_divert_push(0)$DNL\n";
|
|
print '@output(@,@)', "\n";
|
|
(print "garbage"x10, "\n") for (1..1000);
|
|
print "${M4}_divert_pop(0)\n";
|
|
]])
|
|
AT_CHECK([[perl gen-skel.pl > skel.c || exit 77]])
|
|
|
|
AT_DATA([[input.y]],
|
|
[[%skeleton "./skel.c"
|
|
%%
|
|
start: ;
|
|
]])
|
|
|
|
AT_BISON_CHECK([[input.y]], [[1]], [[]],
|
|
[[input.y: fatal error: too many arguments for @output directive in skeleton
|
|
]])
|
|
|
|
AT_CLEANUP
|