X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/1aa9fa823b452cfd76c0ca34d652f7562c94864a..3a526f5cc3b45fc68d06de0b5332105113741093:/tests/local.at diff --git a/tests/local.at b/tests/local.at index 2dbbfc71..e803e57f 100644 --- a/tests/local.at +++ b/tests/local.at @@ -38,7 +38,7 @@ m4_define([m4_null_if], # Expect COUNT matches of the PERL-REGEXP in FILE. The file is # taken in "slurp" mode, i.e., one can match end-of-lines. m4_define([AT_MATCHES_CHECK], -[AT_CHECK([perl -0777 -ne ' +[AT_CHECK([$PERL -0777 -ne ' my $count = 0; s{$2}{ ++$count; "" }gem; printf "$count\n";' $1], [0], [$3 @@ -119,6 +119,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,6 +141,12 @@ m4_pushdef([AT_LOCATION_TYPE_IF], [m4_bmatch([$3], [%define 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 } {int y} -> "int x, int y, ". +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])], @@ -241,6 +248,7 @@ 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]) @@ -333,7 +341,7 @@ static 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; @@ -350,7 +358,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 *llocp, ])AT_PARSE_PARAMS [const char *msg]])[]dnl ]) m4_define([AT_YYERROR_PROTOTYPE], @@ -374,16 +382,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); }]], @@ -405,7 +408,8 @@ void public void yyerror (String s) { System.err.println (s); - }]])])dnl + }]])], +[m4_fatal([$0: invalid language: ]AT_LANG)])dnl ]) @@ -461,10 +465,10 @@ m4_define([AT_BISON_CHECK_WARNINGS], [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 +[[# 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 "$POSIXLY_CORRECT_IS_EXPORTED" = false; then ]AT_SAVE_SPECIAL_FILES[ # To avoid expanding it repeatedly, store specified stdout. @@ -589,7 +593,10 @@ 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([case $POSIXLY_CORRECT_IS_EXPORTED:$C_COMPILER_POSIXLY_CORRECT in + true:false) echo 'cannot compile properly with POSIXLY_CORRECT' && exit 77;; +esac]) +AT_CHECK(m4_join([ ], [$CC $CFLAGS $CPPFLAGS], [m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])], [-o $1], @@ -675,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_CHECK([./c-and-cxx]) +]) + + ## ---------------------------- ## ## Running a generated parser. ## ## ---------------------------- ##