mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
* tests/output.at (AT_CHECK_OUTPUT): It used to check that the expected files are indeed generated, but it did not check that there are no additional ones. Do that, and adjust expectations (in particular alphabetical order).
254 lines
8.5 KiB
Plaintext
254 lines
8.5 KiB
Plaintext
# Checking the output filenames. -*- Autotest -*-
|
|
|
|
# Copyright (C) 2000-2002, 2005-2012 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([[Output file names.]])
|
|
|
|
|
|
# AT_CHECK_OUTPUT(INPUT-FILE, [DIRECTIVES], [FLAGS], EXPECTED-FILES, [SHELLIO],
|
|
# [ADDITIONAL-TESTS], [PRE-TESTS])
|
|
# -----------------------------------------------------------------------------
|
|
m4_define([AT_CHECK_OUTPUT],
|
|
[AT_SETUP([[Output files: ]$2 $3 $5])[
|
|
]$7[
|
|
for file in ]$1 $4[; do
|
|
case $file in
|
|
*/*) mkdir -p `echo "$file" | sed 's,/[^/]*,,'`;;
|
|
esac
|
|
done
|
|
]AT_DATA([$1],
|
|
[$2[
|
|
%%
|
|
foo: {};
|
|
]])[
|
|
|
|
]AT_BISON_CHECK([$3 $1 $5], 0)[
|
|
# Ignore the files non-generated files
|
|
]AT_CHECK([find . -type f -and -not -path './$1' -and -not -path './testsuite.log' |
|
|
sed 's,\./,,' |
|
|
sort |
|
|
xargs echo],
|
|
[], [$4
|
|
])[
|
|
]$6[
|
|
]AT_CLEANUP[
|
|
]])
|
|
|
|
AT_CHECK_OUTPUT([foo.y], [], [-dv],
|
|
[foo.output foo.tab.c foo.tab.h])
|
|
|
|
# Some versions of Valgrind (at least valgrind-3.6.0.SVN-Debian) report
|
|
# "fgrep: write error: Bad file descriptor" when stdout is closed, so we
|
|
# skip this test group during maintainer-check-valgrind.
|
|
AT_CHECK_OUTPUT([foo.y], [], [-dv],
|
|
[foo.output foo.tab.c foo.tab.h],
|
|
[>&-], [],
|
|
[AT_CHECK([[case "$PREBISON" in *valgrind*) exit 77;; esac]])])
|
|
|
|
AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.c],
|
|
[foo.c foo.h foo.output])
|
|
AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.tab.c],
|
|
[foo.output foo.tab.c foo.tab.h])
|
|
AT_CHECK_OUTPUT([foo.y], [], [-dv -y],
|
|
[y.output y.tab.c y.tab.h])
|
|
AT_CHECK_OUTPUT([foo.y], [], [-dv -b bar],
|
|
[bar.output bar.tab.c bar.tab.h])
|
|
AT_CHECK_OUTPUT([foo.y], [], [-dv -g -o foo.c],
|
|
[foo.c foo.dot foo.h foo.output])
|
|
|
|
|
|
AT_CHECK_OUTPUT([foo.y], [%defines %verbose], [],
|
|
[foo.output foo.tab.c foo.tab.h])
|
|
AT_CHECK_OUTPUT([foo.y], [%defines %verbose %yacc],[],
|
|
[y.output y.tab.c y.tab.h])
|
|
|
|
AT_CHECK_OUTPUT([foo.yy], [%defines %verbose %yacc],[],
|
|
[y.output y.tab.c y.tab.h])
|
|
|
|
# Exercise %output and %file-prefix including deprecated '='
|
|
AT_CHECK_OUTPUT([foo.y], [%file-prefix "bar" %defines %verbose], [],
|
|
[bar.output bar.tab.c bar.tab.h])
|
|
AT_CHECK_OUTPUT([foo.y], [%output="bar.c" %defines %verbose %yacc],[],
|
|
[bar.c bar.h bar.output])
|
|
AT_CHECK_OUTPUT([foo.y],
|
|
[%file-prefix="baz" %output "bar.c" %defines %verbose %yacc],
|
|
[],
|
|
[bar.c bar.h bar.output])
|
|
|
|
|
|
# Check priorities of extension control.
|
|
AT_CHECK_OUTPUT([foo.yy], [%defines %verbose], [],
|
|
[foo.output foo.tab.cc foo.tab.hh])
|
|
|
|
AT_CHECK_OUTPUT([foo.yy], [%defines %verbose ], [-o foo.c],
|
|
[foo.c foo.h foo.output])
|
|
|
|
AT_CHECK_OUTPUT([foo.yy], [],
|
|
[--defines=foo.hpp -o foo.c++],
|
|
[foo.c++ foo.hpp])
|
|
|
|
AT_CHECK_OUTPUT([foo.yy], [%defines "foo.hpp"],
|
|
[-o foo.c++],
|
|
[foo.c++ foo.hpp])
|
|
|
|
AT_CHECK_OUTPUT([foo.yy], [],
|
|
[-o foo.c++ --graph=foo.gph],
|
|
[foo.c++ foo.gph])
|
|
|
|
|
|
## ------------ ##
|
|
## C++ output. ##
|
|
## ------------ ##
|
|
|
|
m4_define([AT_CHECK_NO_SUBDIR_PART],
|
|
[# Also make sure that the includes do not refer to the subdirectory.
|
|
AT_CHECK([grep 'include .subdir/' $1.cc], 1, [])
|
|
AT_CHECK([grep 'include .subdir/' $1.hh], 1, [])
|
|
])
|
|
|
|
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose], [],
|
|
[foo.output foo.tab.cc])
|
|
|
|
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
|
|
[foo.output foo.tab.cc foo.tab.hh stack.hh])
|
|
|
|
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose %locations], [],
|
|
[foo.output foo.tab.cc])
|
|
|
|
AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations], [],
|
|
[foo.output foo.tab.cc foo.tab.hh location.hh position.hh stack.hh])
|
|
|
|
AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
|
|
[foo.output foo.tab.cc foo.tab.hh stack.hh],
|
|
[], [AT_CHECK_NO_SUBDIR_PART([foo.tab])])
|
|
|
|
AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations],
|
|
[-o subdir/foo.cc],
|
|
[subdir/foo.cc subdir/foo.hh subdir/foo.output subdir/location.hh subdir/position.hh subdir/stack.hh],
|
|
[], [AT_CHECK_NO_SUBDIR_PART([subdir/foo])])
|
|
|
|
AT_CHECK_OUTPUT([gram_dir/foo.yy],
|
|
[%skeleton "lalr1.cc" %defines %verbose %file-prefix "output_dir/foo"],
|
|
[],
|
|
[output_dir/foo.output output_dir/foo.tab.cc output_dir/foo.tab.hh output_dir/stack.hh])
|
|
|
|
AT_CHECK_OUTPUT([gram_dir/foo.yy],
|
|
[%skeleton "lalr1.cc" %defines %locations %verbose %file-prefix "output_dir/foo"],
|
|
[],
|
|
[output_dir/foo.output output_dir/foo.tab.cc output_dir/foo.tab.hh output_dir/location.hh output_dir/position.hh output_dir/stack.hh])
|
|
|
|
|
|
# AT_CHECK_CONFLICTING_OUTPUT(INPUT-FILE, DIRECTIVES, FLAGS, STDERR,
|
|
# [EXIT-STATUS])
|
|
# ------------------------------------------------------------------
|
|
m4_define([AT_CHECK_CONFLICTING_OUTPUT],
|
|
[AT_SETUP([Conflicting output files: $2 $3])
|
|
case "$1" in
|
|
*/*) mkdir `echo "$1" | sed 's,/.*,,'`;;
|
|
esac
|
|
AT_DATA([$1],
|
|
[[$2
|
|
%%
|
|
foo: {};
|
|
]])
|
|
|
|
[cp ]$1[ expout]
|
|
# Because an output file name conflict is still a warning, Bison exits
|
|
# with status 0, so AT_BISON_CHECK does not realize that there may be no
|
|
# output file against which to check the XML. AT_BISON_CHECK_NO_XML
|
|
# avoids that problem.
|
|
AT_BISON_CHECK_NO_XML([$3 $1], $5, [], [$4])
|
|
AT_CHECK([[cat $1]], [[0]], [expout])
|
|
AT_CLEANUP
|
|
])
|
|
|
|
AT_CHECK_CONFLICTING_OUTPUT([foo.y],
|
|
[], [--graph="foo.tab.c"],
|
|
[[foo.y: warning: conflicting outputs to file 'foo.tab.c' [-Wother]
|
|
]])
|
|
|
|
AT_CHECK_CONFLICTING_OUTPUT([foo.y],
|
|
[%defines "foo.output"], [-v],
|
|
[[foo.y: warning: conflicting outputs to file 'foo.output' [-Wother]
|
|
]])
|
|
|
|
AT_CHECK_CONFLICTING_OUTPUT([foo.y],
|
|
[%skeleton "lalr1.cc" %defines %locations], [--graph="location.hh"],
|
|
[[foo.y: warning: conflicting outputs to file 'location.hh' [-Wother]
|
|
]])
|
|
|
|
AT_CHECK_CONFLICTING_OUTPUT([foo.y], [], [-o foo.y],
|
|
[[foo.y: refusing to overwrite the input file 'foo.y'
|
|
]], 1)
|
|
|
|
|
|
# AT_CHECK_OUTPUT_FILE_NAME(FILE-NAME-PREFIX, [ADDITIONAL-TESTS])
|
|
# ---------------------------------------------------------------
|
|
m4_define([AT_CHECK_OUTPUT_FILE_NAME],
|
|
[AT_SETUP([Output file name: $1])
|
|
|
|
AT_BISON_OPTION_PUSHDEFS
|
|
# Skip if platform doesn't support file name. For example, Cygwin
|
|
# doesn't support file names containing ":" or "\".
|
|
AT_CHECK([[touch "]AS_ESCAPE([$1[.tmp]])[" || exit 77]])
|
|
|
|
AT_DATA_GRAMMAR([glr.y],
|
|
[[%glr-parser
|
|
%code {
|
|
]AT_YYERROR_DECLARE_EXTERN[
|
|
]AT_YYLEX_DECLARE_EXTERN[
|
|
}
|
|
%%
|
|
start: {};
|
|
]])
|
|
AT_BISON_CHECK([-o "AS_ESCAPE([$1.c])" --defines="AS_ESCAPE([$1.h])" glr.y])
|
|
AT_CHECK([ls "AS_ESCAPE([$1.c])" "AS_ESCAPE([$1.h])"], [], [ignore])
|
|
AT_COMPILE([glr.o], [-c "AS_ESCAPE([$1.c])"])
|
|
$2
|
|
|
|
AT_DATA_GRAMMAR([cxx.y],
|
|
[[%skeleton "lalr1.cc"
|
|
%code { int yylex (yy::parser::semantic_type*); }
|
|
%%
|
|
start: {};
|
|
]])
|
|
AT_BISON_CHECK([-o "AS_ESCAPE([$1.c])" --defines="AS_ESCAPE([$1.h])" cxx.y])
|
|
AT_CHECK([ls "AS_ESCAPE([$1.c])" "AS_ESCAPE([$1.h])"], [], [ignore])
|
|
AT_COMPILE_CXX([cxx.o], [-c "AS_ESCAPE([$1.c])"])
|
|
$2
|
|
|
|
AT_BISON_OPTION_POPDEFS
|
|
AT_CLEANUP
|
|
])
|
|
|
|
# Notice that the header file name here cannot contain
|
|
# '"' since FILENAME in '#include "FILENAME"' cannot.
|
|
AT_CHECK_OUTPUT_FILE_NAME([[`~!@#$%^&*()-=_+{}[]|\:;<>, .']])
|
|
dnl Work around a bug in m4_expand that broke AT_SETUP in autoconf 2.62,
|
|
dnl by using the definition from 2.63.
|
|
m4_version_prereq([2.63], [],
|
|
[m4_define([m4_expand], [_$0(-=<{($1)}>=-)])
|
|
m4_define([_m4_expand],
|
|
[m4_changequote([-=<{(], [)}>=-])$1m4_changequote([, ])])])
|
|
AT_CHECK_OUTPUT_FILE_NAME([[(]])
|
|
AT_CHECK_OUTPUT_FILE_NAME([[)]])
|
|
AT_CHECK_OUTPUT_FILE_NAME([[@%:@]])
|
|
AT_CHECK_OUTPUT_FILE_NAME([[@@]])
|
|
AT_CHECK_OUTPUT_FILE_NAME([[@{]])
|
|
AT_CHECK_OUTPUT_FILE_NAME([[@}]])
|
|
AT_CHECK_OUTPUT_FILE_NAME([[@<:@]])
|
|
AT_CHECK_OUTPUT_FILE_NAME([[@:>@]])
|