tests: run the C++ tests on all the available standards

This is much of course more efficient than in the matrix of the CI (or
on our own machines), but a bit more tedious.

* configure.ac (CXX03_CXXFLAGS, CXX11_CXXFLAGS, CXX14_CXXFLAGS)
(CXX17_CXXFLAGS, CXX2A_CXXFLAGS, STDCXX_FLAGS): New.
* tests/atlocal.in: Receive them.
* tests/local.at (AT_FOR_EACH_CXX): New.
* tests/c++.at: Use AT_FOR_EACH_CXX.
This commit is contained in:
Akim Demaille
2018-09-12 22:01:32 +02:00
parent 84744e5f63
commit 9ff76cdda8
4 changed files with 40 additions and 7 deletions

View File

@@ -54,7 +54,14 @@ AC_PROG_CC_STDC
AC_PROG_CXX
AC_LANG_PUSH([C++])
gl_WARN_ADD([-fno-exceptions], [NO_EXCEPTIONS_CXXFLAGS])
gl_WARN_ADD([-std=c++98], [CXX98_CXXFLAGS])
gl_WARN_ADD([-std=c++03], [CXX03_CXXFLAGS])
gl_WARN_ADD([-std=c++11], [CXX11_CXXFLAGS])
gl_WARN_ADD([-std=c++14], [CXX14_CXXFLAGS])
gl_WARN_ADD([-std=c++17], [CXX17_CXXFLAGS])
gl_WARN_ADD([-std=c++2a], [CXX2A_CXXFLAGS])
AC_SUBST([STDCXX_FLAGS],
["$CXX98_CXXFLAGS $CXX03_CXXFLAGS $CXX11_CXXFLAGS $CXX14_CXXFLAGS $CXX17_CXXFLAGS $CXX2A_CXXFLAGS "])
AM_CONDITIONAL([ENABLE_CXX11], [test x"$CXX11_CXXFLAGS" != x])
AC_LANG_POP([C++])

View File

@@ -55,7 +55,9 @@ fi
: ${NO_EXCEPTIONS_CXXFLAGS='@NO_EXCEPTIONS_CXXFLAGS@'}
# Requiring a specific C++ standard.
: ${CXX98_CXXFLAGS='@CXX98_CXXFLAGS@'}
: ${CXX11_CXXFLAGS='@CXX11_CXXFLAGS@'}
: ${STDCXX_FLAGS='@STDCXX_FLAGS@'}
# Be sure that the C++ compiler is not broken because of gnulib. This
# cannot be checked in configure (gnulib is not parameterized yet),

View File

@@ -82,8 +82,10 @@ main (void)
}
]])
AT_FULL_COMPILE([input])
AT_PARSER_CHECK([./input], 0)
AT_FOR_EACH_CXX([
AT_FULL_COMPILE([input])
AT_PARSER_CHECK([./input], 0)
])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
@@ -177,11 +179,13 @@ int main()
}
]])
AT_FOR_EACH_CXX([
AT_FULL_COMPILE([list])
AT_PARSER_CHECK([./list], 0, [],
[12
123
])
])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
@@ -360,6 +364,7 @@ namespace yy
]AT_MAIN_DEFINE[
]])
AT_FOR_EACH_CXX([
AT_FULL_COMPILE([list])
AT_PARSER_CHECK([./list], 0,
[[(0, 1, 2, 4, 6)
@@ -386,6 +391,7 @@ Destroy: "6"
Destroy: ()
Destroy: (0, 1, 2, 4, 6)
]])
])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
@@ -482,7 +488,7 @@ int main()
}
]])
AT_FOR_EACH_CXX([
AT_FULL_COMPILE([[input]])
# This used to print "Discarding 'a'." again at the end.
AT_PARSER_CHECK([[./input]], [[0]], [[]],
@@ -523,6 +529,7 @@ Cleanup: popping token EOI ()
Cleanup: popping nterm expr (40)
destroy: 40
]])
])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
@@ -657,8 +664,9 @@ void
AT_BISON_CHECK([[-o input.cc input.yy]])
m4_if([$#], [1],
[AT_COMPILE_CXX([[input]])
AT_PARSER_CHECK([[./input]])])
[AT_FOR_EACH_CXX([
AT_COMPILE_CXX([[input]])
AT_PARSER_CHECK([[./input]])])])
AT_BISON_OPTION_POPDEFS
])
@@ -754,6 +762,7 @@ yy::parser::error (const std::string &m)
]AT_MAIN_DEFINE[
]])
AT_FOR_EACH_CXX([
AT_FULL_COMPILE([[input]])
# This used to print "Discarding 'a'." again at the end.
AT_PARSER_CHECK([[./input]], [[1]], [[]],
@@ -761,6 +770,7 @@ AT_PARSER_CHECK([[./input]], [[1]], [[]],
Discarding 'a'.
Reducing 'a'.
]])
])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
@@ -834,6 +844,7 @@ yylex (yy::parser::semantic_type *)
}
]])
AT_FOR_EACH_CXX([
AT_FULL_COMPILE([[input]], [[scan]])
AT_PARSER_CHECK([[./input]], [[0]], [[]],
@@ -842,6 +853,7 @@ caught error
error: invalid character
caught error
]])
])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
@@ -1095,6 +1107,8 @@ main (int argc, const char *argv[])
}
]])
AT_BISON_CHECK([[-o input.cc --report=all input.yy]])
AT_FOR_EACH_CXX([
AT_COMPILE_CXX([[input]])
AT_PARSER_CHECK([[./input aaaas]], [[2]], [[]],
@@ -1125,6 +1139,7 @@ AT_PARSER_CHECK([[./input aaaaE]], [[2]], [[]],
AT_PARSER_CHECK([[./input aaaaT]], [[1]])
AT_PARSER_CHECK([[./input aaaaR]], [m4_if([$2], [with], [0], [1])])
])
AT_BISON_OPTION_POPDEFS
@@ -1181,6 +1196,6 @@ int main ()
])
AT_BISON_CHECK([[-o input.cc input.yy]])
AT_COMPILE_CXX([[input]])
AT_FOR_EACH_CXX([AT_COMPILE_CXX([[input]])])
AT_CLEANUP

View File

@@ -563,7 +563,16 @@ main (int argc, char const* argv[])
return p.parse ();
}]])
m4_define([AT_FOR_EACH_CXX],
[[at_for_each_cxx_CXXFLAGS_save=$CXXFLAGS
for at_cxx_std in "" $STDCXX_FLAGS
do
]AS_ECHO(["Testing with C++ standard flags: '$at_cxx_std'"])[
CXXFLAGS="$at_for_each_cxx_CXXFLAGS_save $at_cxx_std"
]$1[
done
CXXFLAGS=$at_for_each_cxx_CXXFLAGS_save
]])
## ------ ##
## Java. ##