X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/e36ec1f41ffbe9f00db405c775201dbbc384c45c..f6df83b4e80b2a53c08b5dc654e247076a3b9b03:/tests/local.at?ds=sidebyside diff --git a/tests/local.at b/tests/local.at index 9fd641c4..b7d75afc 100644 --- a/tests/local.at +++ b/tests/local.at @@ -29,6 +29,20 @@ m4_define([m4_null_if], [], [$2], [$3])]) +# AT_SETUP_STRIP(TITLE) +# --------------------- +# Abbreviate the TITLE to be passed to AT_SETUP. +m4_define([AT_SETUP_STRIP], +[m4_bpatsubsts([$1], + [%\(language\|skeleton\) "?\([^\" ]*\)"?], + [\2], + [%define "?\([-A-Za-z0-9_.]+\)"? \("\([^\" ]+\)"\|\([-A-Za-z0-9_.]+\)\)], + [\1=\3\4], + [%define "?\([-A-Za-z0-9_.]+\)"?], + [\1])dnl +]) + + ## ------------- ## ## Basic tests. ## ## ------------- ## @@ -119,6 +133,7 @@ m4_pushdef([AT_SKEL_CC_IF], [m4_bmatch([$3], [%language "[Cc]\+\+"\|%skeleton "[a-z0-9]+\.cc"], [$1], [$2])]) m4_pushdef([AT_SKEL_JAVA_IF], [m4_bmatch([$3], [%language "[Jj][Aa][Vv][Aa]"\|%skeleton "[a-z0-9]+\.java"], [$1], [$2])]) +# The target language: "c", "c++", or "java". m4_pushdef([AT_LANG], [AT_SKEL_JAVA_IF([java], [AT_SKEL_CC_IF([c++], @@ -140,14 +155,17 @@ m4_pushdef([AT_LOCATION_TYPE_IF], [m4_bmatch([$3], [%define \(api\.location\.type\|location_type\)], [$1], [$2])]) m4_pushdef([AT_PARAM_IF], [m4_bmatch([$3], [%parse-param], [$1], [$2])]) +# Comma-terminated list of formals parse-parameters. +# E.g., %parse-param { int x } %parse-param {int y} -> "int x, int y, ". +# FIXME: Support grouped parse-param. +m4_pushdef([AT_PARSE_PARAMS]) +m4_bpatsubst([$3], [%parse-param { *\([^{}]*[^{} ]\) *}], + [m4_append([AT_PARSE_PARAMS], [\1, ])]) + m4_pushdef([AT_PURE_IF], [m4_bmatch([$3], [%define *api\.pure\|%pure-parser], [m4_bmatch([$3], [%define *api\.pure *"?false"?], [$2], [$1])], [$2])]) -m4_pushdef([AT_PURE_AND_LOC_IF], -[m4_bmatch([$3], [%locations], [AT_PURE_IF($@)], [$2])]) -m4_pushdef([AT_GLR_OR_PARAM_IF], -[m4_bmatch([$3], [%glr-parser\|%parse-param], [$1], [$2])]) m4_pushdef([AT_NAME_PREFIX], [m4_bmatch([$3], [\(%define api\.prefix\|%name-prefix\) ".*"], [m4_bregexp([$3], [\(%define api\.prefix\|%name-prefix\) "\([^""]*\)"], [\2])], @@ -163,14 +181,26 @@ m4_pushdef([AT_API_prefix], [yy])]) m4_pushdef([AT_API_PREFIX], [m4_toupper(AT_API_prefix)]) -# yyerror receives the location if %location & %pure & (%glr or %parse-param). +# yyerror receives the location if %location, and if the parser is pure. For +# historical reasons, with the "yacc.c" skeleton, the location is not passed +# unless an additional "%parse-param" is present, or if the purity is defined +# as "full". m4_pushdef([AT_YYERROR_ARG_LOC_IF], -[AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])], +[AT_LOCATION_IF([AT_PURE_IF([m4_bmatch([$3], + m4_quote(m4_join([\|], + [%define api.pure "?full"?], + [%glr-parser], + [%parse-param], + [%skeleton "?glr.c"?])), + [$1], [$2])], + [$2])], [$2])]) -# yyerror always sees the locations (when activated), except if -# (yacc & pure & !param). FIXME: This is wrong. See the manual. + +# yyerror always sees the locations (when activated) if the parser is impure. +# When the parser is pure, yyerror sees the location if it is received as an +# argument. m4_pushdef([AT_YYERROR_SEES_LOC_IF], -[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])], +[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_YYERROR_ARG_LOC_IF([$1], [$2])], [$1])], [$1])], [$2])]) @@ -246,10 +276,9 @@ m4_popdef([AT_API_prefix]) m4_popdef([AT_TOKEN_PREFIX]) m4_popdef([AT_TOKEN_CTOR_IF]) m4_popdef([AT_NAME_PREFIX]) -m4_popdef([AT_GLR_OR_PARAM_IF]) -m4_popdef([AT_PURE_AND_LOC_IF]) m4_popdef([AT_LOCATION_TYPE_IF]) m4_popdef([AT_LOCATION_IF]) +m4_popdef([AT_PARSE_PARAMS]) m4_popdef([AT_PARAM_IF]) m4_popdef([AT_LEXPARAM_IF]) m4_popdef([AT_YACC_IF]) @@ -351,6 +380,7 @@ static }]dnl ]) +# AT_YYERROR_FORMALS # AT_YYERROR_PROTOTYPE # AT_YYERROR_DECLARE_EXTERN # AT_YYERROR_DECLARE @@ -359,7 +389,7 @@ static # Must be called inside a AT_BISON_OPTION_PUSHDEFS/POPDEFS pair. m4_define([AT_YYERROR_FORMALS], [m4_case(AT_LANG, -[c], [AT_YYERROR_ARG_LOC_IF([AT_YYLTYPE *llocp, ])[const char *msg]])[]dnl +[c], [AT_YYERROR_ARG_LOC_IF([AT_YYLTYPE const * const llocp, ])AT_PARSE_PARAMS [const char *msg]])[]dnl ]) m4_define([AT_YYERROR_PROTOTYPE], @@ -383,16 +413,11 @@ m4_define([AT_YYERROR_DEFINE], /* A C error reporting function. */ static ]AT_YYERROR_PROTOTYPE[ -{ -]AT_YYERROR_SEES_LOC_IF([[ - fprintf (stderr, "%d.%d", - ]AT_LOC_FIRST_LINE[, ]AT_LOC_FIRST_COLUMN[); - if (]AT_LOC_FIRST_LINE[ != ]AT_LOC_LAST_LINE[) - fprintf (stderr, "-%d.%d", - ]AT_LOC_LAST_LINE[, ]AT_LOC_LAST_COLUMN[ - 1); - else if (]AT_LOC_FIRST_COLUMN[ != ]AT_LOC_LAST_COLUMN[ - 1) - fprintf (stderr, "-%d", - ]AT_LOC_LAST_COLUMN[ - 1); +{]m4_bpatsubst(m4_defn([AT_PARSE_PARAMS]), + [[^,]+[^A-Za-z_0-9]\([A-Za-z_][A-Za-z_0-9]*\), *], [ + YYUSE(\1);])dnl +AT_YYERROR_SEES_LOC_IF([[ + YY_LOCATION_PRINT (stderr, ]AT_LOC[); fprintf (stderr, ": ");]])[ fprintf (stderr, "%s\n", msg); }]], @@ -453,7 +478,7 @@ AT_BISON_CHECK_NO_XML($@)]) # -------------------------------------------------- # Low-level macro to run bison once. m4_define([AT_BISON_CHECK_], -[AT_CHECK(AT_QUELL_VALGRIND[[ bison ]]$@)]) +[AT_CHECK(AT_QUELL_VALGRIND[[ bison -fno-caret ]]$@)]) # AT_BISON_CHECK_WARNINGS(BISON_ARGS, [OTHER_AT_CHECK_ARGS]) @@ -468,11 +493,7 @@ 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. -# -# Don't just check if $POSIXLY_CORRECT is set, as Bash, when launched -# as /bin/sh, sets the shell variable POSIXLY_CORRECT to y, but not -# the environment variable. -if env | grep '^POSIXLY_CORRECT=' >/dev/null; then :; else +if test "$POSIXLY_CORRECT_IS_EXPORTED" = false; then ]AT_SAVE_SPECIAL_FILES[ # To avoid expanding it repeatedly, store specified stdout. @@ -508,7 +529,7 @@ fi]dnl # 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_CHECK(m4_null_if([$2], [], [AT_QUELL_VALGRIND ])[[bison -fno-caret ]]$@) AT_BISON_CHECK_WARNINGS($@)]) # AT_BISON_CHECK_XML(BISON_ARGS, [OTHER_AT_CHECK_ARGS]) @@ -537,10 +558,10 @@ m4_define([AT_BISON_CHECK_XML], AT_CHECK([[$XSLTPROC \ `]]AT_QUELL_VALGRIND[[ bison --print-datadir`/xslt/xml2text.xsl \ xml-tests/test.xml]], [[0]], [expout]) - [cp xml-tests/test.dot expout] + [sort xml-tests/test.dot > expout] AT_CHECK([[$XSLTPROC \ `]]AT_QUELL_VALGRIND[[ bison --print-datadir`/xslt/xml2dot.xsl \ - xml-tests/test.xml]], [[0]], [expout]) + xml-tests/test.xml | sort]], [[0]], [expout]) [rm -rf xml-tests expout] AT_RESTORE_SPECIAL_FILES [fi]]) @@ -574,7 +595,8 @@ m4_define([AT_QUELL_VALGRIND], # otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT # with trailing .o removed, and ".c" appended. m4_define([AT_COMPILE], -[AT_CHECK(m4_join([ ], +[AT_CHECK([$BISON_C_WORKS], 0, ignore, ignore) +AT_CHECK(m4_join([ ], [$CC $CFLAGS $CPPFLAGS], [m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])], [-o $1], @@ -660,6 +682,44 @@ m4_define([AT_FULL_COMPILE], ]) + +# AT_SKIP_IF_CANNOT_LINK_C_AND_CXX +# -------------------------------- +# Check that we can link together C and C++ objects. +m4_define([AT_SKIP_IF_CANNOT_LINK_C_AND_CXX], +[AT_DATA([c-and-cxx.h], +[[#ifdef __cplusplus +extern "C" +{ +#endif + int fortytwo (void); +#ifdef __cplusplus +} +#endif +]]) +AT_DATA([c-only.c], +[[#include "c-and-cxx.h" +int +main (void) +{ + return fortytwo () == 42 ? 0 : 1; +} +]]) +AT_DATA([cxx-only.cc], +[[#include "c-and-cxx.h" +int fortytwo () +{ + return 42; +} +]]) +AT_COMPILE([c-only.o], [c-only.c]) +AT_COMPILE_CXX([cxx-only.o], [cxx-only.cc]) +AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS $LDFLAGS c-only.o cxx-only.o -o c-and-cxx || + exit 77], [ignore], [ignore]) +AT_PARSER_CHECK([./c-and-cxx]) +]) + + ## ---------------------------- ## ## Running a generated parser. ## ## ---------------------------- ## @@ -808,9 +868,9 @@ m4_if(m4_index(m4_quote($3), [no-xml]), -1, [0], [], m4_dquote($7)) m4_if(m4_index(m4_quote($3), [last-state]), -1, - [AT_CHECK([[sed -n '/^state 0$/,$p' input.output]], [[0]], + [AT_CHECK([[sed -n '/^State 0$/,$p' input.output]], [[0]], m4_dquote($8))], - [AT_CHECK([[sed -n 's/^state //p' input.output | tail -1]], [[0]], + [AT_CHECK([[sed -n 's/^State //p' input.output | tail -1]], [[0]], m4_dquote($8)[[ ]])]) @@ -841,12 +901,20 @@ m4_popdef([AT_COND_CASE])]) + ## ----------------------- ## ## Launch the test suite. ## ## ----------------------- ## AT_INIT +# AT_SETUP([TITLE]) +# ----------------- +# Redefine AT_SETUP to be more concise. Must be done after AT_INIT. +m4_copy_force([AT_SETUP], [B4_SETUP]) +m4_define([AT_SETUP], +[B4_SETUP(m4_expand([AT_SETUP_STRIP([[$1]])]))]) + # Cannot assign CC and CFLAGS here, since atlocal is loaded after # options are processed, so we don't know the value of CXX and # CXXFLAGS yet.