m4_version_prereq([2.58])
+# m4_null_if(VAL, IF-TRUE, IF-FALSE)
+# ----------------------------------
+# If VAL evaluates to empty or 0, run IF-TRUE, otherwise IF-FALSE.
+m4_define([m4_null_if],
+[m4_case(m4_quote($1),
+ [0], [$2],
+ [], [$2],
+ [$3])])
+
## ------------- ##
## Basic tests. ##
## ------------- ##
{
for at_save_file in stderr experr expout
do
+ test ! -f at-bison-check-$at_save_file.bak ||
+ as_fn_error 1 "fatal error: back-up on top of a back-up"
test ! -f $at_save_file || mv $at_save_file at-bison-check-$at_save_file.bak
done
}
static size_t toknum = 0;
int res;
]AT_USE_LEX_ARGS[;
- assert (toknum < sizeof input);
+ assert (toknum < sizeof input / sizeof input[0]);
res = input[toknum++];
]$2[;]AT_LOCATION_IF([[
]AT_LOC_FIRST_LINE[ = ]AT_LOC_LAST_LINE[ = 1;
# AT_BISON_CHECK(BISON_ARGS, [OTHER_AT_CHECK_ARGS])
# -------------------------------------------------
+# High-level routine that may call bison several times, under different
+# conditions.
+#
# Check Bison by invoking `bison BISON_ARGS'. BISON_ARGS should not contain
# shell constructs (such as redirection or pipes) that would prevent
# appending additional command-line arguments for bison. OTHER_AT_CHECK_ARGS
#
# 4. If stderr contains a warning, -Wnone and --warnings=none suppress it.
m4_define([AT_BISON_CHECK],
-[m4_if(m4_quote($2), [0], [AT_BISON_CHECK_XML($@)],
- m4_quote($2), [], [AT_BISON_CHECK_XML($@)])
+[m4_null_if([$2], [AT_BISON_CHECK_XML($@)])
AT_BISON_CHECK_NO_XML($@)])
m4_define([AT_BISON_WERROR_MSG],
[[bison: warnings being treated as errors]])
-# AT_BISON_CHECK_NO_XML(BISON_ARGS, [OTHER_AT_CHECK_ARGS])
-# --------------------------------------------------------
-# Same as AT_BISON_CHECK except don't perform XML/XSLT checks. This is useful
-# when a tortured grammar's XML is known to be too large for xsltproc to
-# handle.
-m4_define([AT_BISON_CHECK_NO_XML],
-[AT_CHECK(m4_if(m4_quote($2), [0], [], m4_quote($2), [], [],
- [AT_QUELL_VALGRIND ])[[bison ]]$@)
-m4_if(m4_bregexp([$4], [: warning: ]), [-1], [],
- m4_quote(m4_if(m4_quote($2), [], [0], [$2])), [0], [[
- # Defining POSIXLY_CORRECT causes bison to complain if options
+
+# AT_BISON_CHECK_(BISON_ARGS, [OTHER_AT_CHECK_ARGS])
+# --------------------------------------------------
+# Low-level macro to run bison once.
+m4_define([AT_BISON_CHECK_],
+[AT_CHECK(AT_QUELL_VALGRIND[[ bison ]]$@)])
+
+
+# AT_BISON_CHECK_WARNINGS(BISON_ARGS, [OTHER_AT_CHECK_ARGS])
+# ----------------------------------------------------------
+# Check that warnings (if some are expected) are correctly
+# turned into errors with -Werror, etc.
+m4_define([AT_BISON_CHECK_WARNINGS],
+[m4_if(m4_bregexp([$4], [: warning: ]), [-1], [],
+ [m4_null_if([$2], [AT_BISON_CHECK_WARNINGS_($@)])])])
+
+m4_define([AT_BISON_CHECK_WARNINGS_],
+[[# Defining POSIXLY_CORRECT causes bison to complain if options
# are added after the grammar file name, so skip these checks
# in that case.
if test -z "${POSIXLY_CORRECT+set}"; then
]AT_DATA([expout], [$3])[
# Run with -Werror.
- ]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ -Werror]],
- [[1]], [expout], [stderr])[
+ ]AT_BISON_CHECK_([$1[ -Werror]], [[1]], [expout], [stderr])[
# Build expected stderr up to and including the "warnings being
# treated as errors" message.
# Now check --warnings=error.
cp stderr experr
- ]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ --warnings=error]],
- [[1]], [expout], [experr])[
+ ]AT_BISON_CHECK_([$1[ --warnings=error]], [[1]], [expout], [experr])[
# Now check -Wnone and --warnings=none by making sure that
# -Werror doesn't change the exit status when -Wnone or
# --warnings=none is specified.
- ]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ -Wnone -Werror]],
- [[0]], [expout])[
- ]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ --warnings=none \
- -Werror]], [[0]], [expout])[
+ ]AT_BISON_CHECK_([$1[ -Wnone -Werror]], [[0]], [expout])[
+ ]AT_BISON_CHECK_([$1[ --warnings=none -Werror]], [[0]], [expout])[
]AT_RESTORE_SPECIAL_FILES[
- fi
- ]])
+fi]dnl
])
+# AT_BISON_CHECK_NO_XML(BISON_ARGS, [OTHER_AT_CHECK_ARGS])
+# --------------------------------------------------------
+# Same as AT_BISON_CHECK except don't perform XML/XSLT checks. This is useful
+# when a tortured grammar's XML is known to be too large for xsltproc to
+# handle.
+m4_define([AT_BISON_CHECK_NO_XML],
+[AT_CHECK(m4_null_if([$2], [], [AT_QUELL_VALGRIND ])[[bison ]]$@)
+AT_BISON_CHECK_WARNINGS($@)])
+
# AT_BISON_CHECK_XML(BISON_ARGS, [OTHER_AT_CHECK_ARGS])
# -----------------------------------------------------
# Run AT_BISON_CHECK's XML/XSLT checks if $BISON_TEST_XML=1 and $XSLTPROC is
[--xml=[^][ ]*], [])])dnl
# Don't combine these Bison invocations since we want to be sure that
# --report=all isn't required to get the full XML file.
- AT_CHECK([[bison --report=all --report-file=xml-tests/test.output \
+ AT_BISON_CHECK_([[--report=all --report-file=xml-tests/test.output \
--graph=xml-tests/test.dot ]]AT_BISON_ARGS,
[[0]], [ignore], [ignore])
- AT_CHECK([[bison --xml=xml-tests/test.xml ]]AT_BISON_ARGS,
+ AT_BISON_CHECK_([[--xml=xml-tests/test.xml ]]AT_BISON_ARGS,
[[0]], [ignore], [ignore])
m4_popdef([AT_BISON_ARGS])dnl
[cp xml-tests/test.output expout]
m4_define([AT_QUELL_VALGRIND],
[[[VALGRIND_OPTS="$VALGRIND_OPTS --leak-check=summary --show-reachable=no"; export VALGRIND_OPTS;]]])
+
+
## ------------------------ ##
## Compiling C, C++ Files. ##
## ------------------------ ##