[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] {yacc-work} coverage: test mixed C/C++ yacc-generated parser
From: |
Ralf Wildenhues |
Subject: |
Re: [PATCH] {yacc-work} coverage: test mixed C/C++ yacc-generated parsers in the same dir |
Date: |
Sun, 10 Apr 2011 14:02:16 +0200 |
User-agent: |
Mutt/1.5.20 (2010-08-04) |
* Stefano Lattarini wrote on Sun, Apr 10, 2011 at 12:57:26PM CEST:
> A final testcase I'd like to check in before submitting the final
> patch for automake bug#7648 and PR automake/491 (patch not yet
> complete ATM, but I think I'm almost there). It checks that many
> different Yacc parsers (both C and C++) can co-exists in the same
> directory.
>
> OK for yacc-work? I will push in 72 hours if there is no objection.
OK, a couple of minor nits.
Thanks,
Ralf
> Subject: [PATCH] coverage: test mixed C/C++ yacc-generated parsers in the
> same dir
>
> * tests/yacc-mix-c-cxx.test: New test.
> * tests/Makefile.am (TESTS): Update.
> --- /dev/null
> +++ b/tests/yacc-mix-c-cxx.test
> +# Check that many different Yacc parsers (both C and C++) can co-exists
> +# in the same directory.
> +
> +required=yacc
> +. ./defs || Exit 1
> +
> +set -e
> +
> +distdir=$me-1.0
> +
> +cat >> configure.in << 'END'
> +AC_PROG_CC
> +AC_PROG_CXX
> +AC_PROG_YACC
> +AC_OUTPUT
> +END
> +
> +cat > Makefile.am << 'END'
> +bin_PROGRAMS = c1 c2 cxx1 cxx2 cxx3
> +AM_YFLAGS = -d
> +
> +c1_SOURCES = p.y p.h 1.c
> +c2_SOURCES = p.y 2.c
> +c2_YFLAGS =
> +
> +cxx1_SOURCES = parse.yy main1.cc parse.hh
> +
> +cxx2_SOURCES = parse2.y++ main2.c++
> +cxx2_YFLAGS =
> +
> +cxx3_SOURCES = parse3.yxx main3.cxx
> +BUILT_SOURCES = parse3.hxx
> +END
> +
> +# The content of all the .c and .y files created below is valid C but
> +# deliberately invalid as C++.
s/as // I think.
> +# Vice versa, the content of all the .c++, .cxx, .cc, .y++, .yxx and
> +# .yy files created below is valid C++ but deliberately invalid C.
> +
> +cat > p.y <<'END'
> +%{
> +int yylex (void) { int new = 0; return new; }
> +void yyerror (char *s) { return; }
> +%}
> +%token ZARDOZ
> +%%
> +x : 'x' {};
> +%%
> +END
> +
> +cat > 1.c <<'END'
> +#include "p.h"
> +int main ()
> +{
> + int new = ZARDOZ;
> + return yyparse () + new;
> +}
> +
> +END
> +
> +cat > 2.c <<'END'
> +int main ()
> +{
> + int yyparse ();
> + int new = 0;
> + return yyparse () + new;
> +}
> +END
> +
> +cat > parse.yy <<'END'
> +%{
> +#include <cstdlib>
> +#include "parse.hh"
> +int yylex (void) { return 0; }
> +void yyerror (const char *s) { return; }
> +%}
> +%token FOOBAR
> +%%
> +x : 'x' {};
> +%%
> +END
> +
> +cat > parse2.y++ <<'END'
> +%{
> +#include <cstdlib>
> +int yylex (void) { return 0; }
> +void yyerror (const char *s) { return; }
> +%}
> +%%
> +x : 'x' {};
> +%%
> +END
> +
> +cat > main1.cc <<'END'
> +using namespace std;
> +#include "parse.hh"
> +int main (int argc, char **argv)
> +{
> + int yyparse (void);
> + return yyparse () + FOOBAR;
> +}
> +END
> +
> +cat > main2.c++ <<'END'
> +using namespace std;
> +int main (int argc, char **argv)
> +{
> + int yyparse (void);
> + return yyparse ();
> +}
> +END
> +
> +edit () { sed -e 's/FOOBAR/BAZQUUX/' -e 's/"parse\.hh"/"parse3.hxx"/'; }
> +edit <parse.yy >parse3.yxx
> +edit <main1.cc >main3.cxx
> +
> +$ACLOCAL
> +$AUTOCONF
> +$AUTOMAKE -a
> +
> +./configure
> +
> +$MAKE
> +ls -l # For debugging.
> +
> +test -f p.c
> +test -f p.h
> +test -f c2-p.c
> +test ! -r c2-p.h
> +
> +test -f parse.cc
> +test -f parse.hh
> +test -f parse3.cxx
> +test -f parse3.hxx
> +
> +test -f cxx2-parse2.c++
> +test ! -r parse2.h++
> +test ! -r cxx2-parse2.h++
> +
> +# Minimal checks about recovering from header removal.
> +rm -f p.h parse.hh parse3.hxx
> +$MAKE p.h parse.hh
> +test -f p.h
> +test -f parse.hh
> +test ! -r parse3.hxx
> +$MAKE
> +test -f parse3.hxx
I think it would make sense to also do parallel build tests
(only if make is GNU make, of course) here.
Thanks,
Ralf